一、Set接口概述
Set接口是Collection的子接口,set接口没有提供额外的方法
Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。
Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法
二、Set实现类之一:HashSet()
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet 具有以下特点:
不能保证元素的排列顺序
HashSet 不是线程安全的
集合元素可以是 null
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。
HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
- @Test
- public void testHashSet(){
- Set set = new HashSet();
- for(int i = 0;i < 10;i++){
- set.add("#"+ i + "#");
- }
- set.add("#" + 3 + "#");
- set.add(null);
- System.out.println(set.size());
- System.out.println(set);
- set.remove("#" + 3 + "#");
- System.out.println(set);
- }
三、Set实现类之二:LinkedHashSet()
LinkedHashSet 是 HashSet 的子类
LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
LinkedHashSet 不允许集合元素重复。
- @Test
- public void testLinkedHashSet(){
- Set set = new LinkedHashSet();
- for(int i = 0;i < 10;i++){
- set.add("#"+ i + "#");
- }
- set.add("#" + 3 + "#");
- set.add(null);
- Iterator iterator = set.iterator();
- while(iterator.hasNext()){
- System.out.println(iterator.next());
- }
- }
四、Set实现类之三:TreeSet()
TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
Comparator comparator()
Object first()
Object last()
Object lower(Object e)
Object higher(Object e)
SortedSet subSet(fromElement, toElement)
SortedSet headSet(toElement)
SortedSet tailSet(fromElement)
TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
- @Test
- public void testTreeSrt(){
- Set set = new TreeSet();
- //当Person类没有实现Comparable接口时,当向TreeSet中
- set.add(new Person("DannyWu",22));
- set.add(new Person("Jack",25));
- set.add(new Person("DannyWu",47));
- set.add(new Person("Lucy",25));
- set.add(new Person("Jenny",34));
- for(Object str : set){
- System.out.println(str);
- }
- }
