Java中的Set接口

时间:2022-02-15 16:12:09

1.Set:不允许有重复元素,和Collection的方法相同。使用equals()方法进行比较,如果返回true,两个对象的HashCode值也应该相等Set取出的方法只有一个:迭代器。

2.Set实现的类:

>LinkedHashSet:HashSet的子类,不允许重复的值,使用HashCode确定在集合中的位置,使用链表的方式确定位置(按照输入的顺序输出)。

>HashSet:底层数据结构是哈希表(散列表)。无序,可以存放空值,比数组查询的效率高,线性不同步。根据哈希冲突的特点,为了保证哈希表中元素的唯一性,该容器中存储的元素所属类应该复写Object中的hashCode,equals方法。如果重写了equals方法必须重写HashCode方法。

>TreeSet:底层数据结构是二叉树。线性不同步,可以对Set集合的元素按照指定规则进行排序。

      (1)使用TreeSet无参构造器创建Set对象,向里面添加元素时必须使用Comparable接口的compareTo方法,来完成排序。

       (2)创建TreeSet对象时,传入了一个实现Comparator接口的类,则使用TreeSet中的Comparator接口中的compare方法排序。

3. 实例:

LinkedList:

     ,可以存放空值,不允许出现重复值,使用HashCode确定在集合中的位置,使用链表的方式确定位置。按照输入的顺序输出。

import java.util.LinkedHashSet;
import java.util.Set;
public class TestLinkedHashSet {
	public static void main(String[] args) {
		Set<Integer> set =new LinkedHashSet<Integer>();
		 set.add(12);
		 set.add(23);
		 set.add(23);
		 set.add(45);
                 set.add(null);
                System.out.println(set);
	}
}

运行结果:

[12, 23, 45,null]

HashSet:

HashSet实现类可以存放空值,向HashSet集合中传入元素时,HashSet会调用该对象的HashCode方法获取Hash值然后决定储存位置。不按照输入的顺序输出。

import java.util.HashSet;
import java.util.Set;
public class TestHashSet {
	public static void main(String[] args) {
		Set<Integer> set=new HashSet<Integer>();
		set.add(12);
		set.add(34);
		set.add(56);
		set.add(12);
		set.add(null);
		System.out.println(set);
	}

}

输出结果:

[null, 34, 56, 12]
TreeSet:

(1)不允许放空元素,无参构造时,添加对象实现Comparable接口中的compareTo方法进行排序。

(2)如果传入一个实现Comparetor接口类,则用Comparetor中的compare方法。

(1)实例:

import java.util.Set;
import java.util.TreeSet;
	public class TestTreeSet1 {
		public static void main(String[] args) {
			Set<Integer> set=new TreeSet<Integer>();
			set.add(12);
			set.add(98);
			set.add(34);
			set.add(56);
			System.out.println(set);
		}
}

运行结果:

[12, 34, 56, 98]

(2)实例:

import java.util.Comparator;
import java.util.TreeSet;
class compares implements Comparator<String>{ //compare方法中有两个参数,第一个是调用该方法的对象,第二个值集合中已经存入的对象。 
	public int compare(String a, String b) {   //按照字符串长度比较,
		int n=a.length()-b.length(); 			//长度主要条件
		return n==0?a.compareTo(b):n;
	}
}
public class TestComparetor {
	public static void main(String[] args) {
		TreeSet<String> set=new TreeSet<String>(new compares());
		set.add("abcderty");
		set.add("efghj");
		set.add("hollee");
		set.add("worde");
		System.out.println(set);
	}
}

运行结果:

[efghj, worde, hollee, abcderty]