Java中的Set
接口是Collection
接口的一个子接口,它代表了一个不允许有重复元素的集合。Set
接口的实现类,如HashSet
、LinkedHashSet
、TreeSet
等,都遵循这一核心原则,但它们在内部实现、性能特点、排序行为等方面有所差异。不过,就Set
集合的通用特性而言,可以总结为以下三大特点:
1、不允许有重复的元素
add()方法,如果当前元素是第一次添加返回true,相反则返回false。
原理:HashSet不允许集合中存在重复的元素。这是通过元素的hashCode()和equals()方法来实现的。当尝试向HashSet中添加一个新元素时,HashSet会首先计算该元素的hashCode值,以确定它在哈希表中的位置。如果哈希表中已经存在具有相同hashCode值的元素,则HashSet会进一步调用这些元素的equals()方法来检查它们是否相等。如果equals()方法返回true,则表明集合中已经存在该元素,添加操作将失败(即元素不会被添加到集合中)。
代码演示如下:
//1.创建一个Set集合的对象
Set<String> s = new HashSet<>();
boolean s1 = s.add("s");
boolean s2 = s.add("s");
System.out.println(s1);//true
System.out.println(s2);//false
2、存取无序
原理:HashSet不保证集合中元素的迭代顺序。当你遍历HashSet时,元素的返回顺序可能与它们被添加到集合中的顺序不同。这是因为HashSet底层使用哈希表(HashMap)来存储元素,而哈希表并不保证元素的顺序。
代码演示如下:
//存取无序
public static void main(String[] args) {
//创建
Set<String> s=new HashSet<>();
s.add("张三");
s.add("李四");
s.add("王五");
System.out.println(s);// result: [李四,张三,王五]
3、没有索引:
如上图所示,当调用set集合的get方法时显示无索引。
此外,值得注意的是,HashSet允许存储null元素,这是它与某些其他集合实现(如TreeSet)不同的地方。然而,由于HashSet的无序性和不重复性,它并不适合用于需要排序或频繁进行元素查找操作的场景。在这些情况下,可能需要考虑使用其他类型的集合,如LinkedHashSet(保持元素添加顺序)或TreeSet(对元素进行排序)。