Set接口
Set集合就像是一个罐子,一旦把对象“丢进去”,多个对象之间就没有顺序,
Set元素不可以重复
。
Set判断两个对象是否相同不是使用== 而是使用equals
Set t = new HashSet();
t.add("aa");
t.add(new String("aa"));
System.out.println(t.add(new String("aa")));
//false
//set 对比两个对象是否相同使用 equals
System.out.println(t.toString());
//[aa]
Set集合 的实现类:HashSet TreeSet EnumSet
HashSet 和 TreeSet 建议不存储可变对象,因为会导致处理很复杂。
HashSet类:
底层使用数据结构的
hash算法
实现的,因此具有很好的存取,查找的性能。
HashSet按照Hash算法来存储集合的
HashSet具有以下特点:
1、不能保证元素的排列顺序,顺序可能发生变化。
2、HashSet(异步) 不是同步的,如果多线程访问一个set集合,如果多线程访问一个HashSet集合,如果有2条或者2条以上的线程同事修改了HashSet集合时,必须通过代码来保证同步。
3、集合元素的值可以是null
当向HashSet集合中存入一个元素时,会调用该对象的hashCode()方法得到该对象的hashCode值,然后根据该HashCode值来决定该对象在HashCode中存储位置。如果两个元素通过equals方法比较返回true,他们的HashCode()方法返回值不相同,HashCode将会把他们存储在不同位置,也就可以添加成功。
简单的来说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的HashCode()方法返回值也相同。
Set t = new HashSet();
Student s = new Student("1",1);
Student s1 = new Student("1",1);
t.add(s);
t.add(s1);
System.out.println(s.hashCode() == s1.hashCode());
//false
System.out.println(t.toString());
//[Student [name=1, age=1], Student [name=1, age=1]]
String s = new String("a");
String s1 = new String("a");
t.add(s);
t.add(s1);
System.out.println(s.hashCode() == s1.hashCode());
//true
System.out.println(t.toString());
//[a]
HashSet访问对象是hashCode来访问的,HashCode()值相当于HashSet的“索引”

HashSet子类LinkedHashSet
TreeSet类
TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。
TreeSet并不是根据插入顺序排序的,而是根据元素的实际值来排序的。
TreeSet是采用红黑树的数据结构对元素排序的。
TreeSet排序方法:自然排序(默认)、定制排序
自然排序:TreeSet会调用compareTo()方法来比较元素之间的大小关系,将集合元素进行升序排序,这种方式被称之为自然排序。
