Set接口

发布时间 2023-10-03 00:09:50作者: 顺风顺水heng

1.Set接口特点

  • Set接口是无序的
  • Set接口中的数据不允许重复
  • Set接口无法通过下标访问数据
  • 查找慢,插入删除快(底层数据结构是哈希表和红黑树)
  • Set集合使用equals()和hashCode()方法实现元素去重

 

 

2.HashSet特点:

  • HashSet是Set接口的实现类
  • 线程不安全

 

HashSet避免对象重复的规则:

1)如果对象的hashCode值不同,则不用判断equals方法,就直接存到HashSet中。

2)如果对象的hashCode值相同,需要用equals方法进行比较,如果结果为true,则视为相同元素,不存储。如果结果为false,视为不同元素,进行存储。

 如果对象元素要存储到HashSet中,必须覆盖hashCode方法和equals方法。才能保证从对象中的内容的角度保证唯一。

3.迭代器Iterator

迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表数组)上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。

 

HashSet类中没有提供根据集合索引获取索引对应的值的⽅法,

因此遍历HashSet时需要使⽤Iterator迭代器。Iterator的主要⽅法如下

返回类型

方法

描述

boolean

hasNext()

如果有元素可迭代

Object

next()

返回迭代的下⼀个元素

 

4 TreeSet

TreeSet 基于TreeMap 实现。TreeSet可以实现有序集合,但是有序性需要通过比较器实现。

 

TreesSet特点:

  • 有序
  • 不重复
  • 添加、删除、判断元素存在性效率比较高
  • 线程不安全

 

TreeSet对元素进行排序的方式:

1) 如果是基本数据类型和String类型,无需其它操作,可以直接进行排序。

2) 对象类型元素排序,需要实现Comparable接口,并覆盖其compareTo方法。

3) 自己定义实现了Comparator接口的排序类,并将其传给TreeSet,实现自定义的排序规则。

5 LinkedHashSet

LinkedHashSet是一种有序的Set集合,其元素的存入和取出顺序是相同的。

public class Test {  
  public static void main(String[] args) { 
       // LinkedHashSet:链表结构的Set集合   
     // 1.不重复 2.能保证添加的次序(添加和输出次序一致)      
  Set set = new LinkedHashSet();       
 set.add("c");  

      set.add("a");   
     set.add("d");    
    set.add("b");     
   System.out.println(set);  
  }
}
 //迭代器遍历
        Iterator iterator = hashSet.iterator();//获取迭代器对象 有序:有下标
        while (iterator.hasNext()){//判断是否指定能够移动
            Object next = iterator.next();//指定移动并获取当前的元素
            System.out.println(next);
        }



       //遍历--- foreach
       for(Object o: hashSet){
           System.out.println(o);
        }


    }
}