1.Set中元素是无序的
HashSet set=new HashSet();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
System.out.println(set);//结果:[d,b,c,a]
2.Set不允许重复
情景0
HashSet set=new HashSet();
System.out.println(set.add("a"));//结果:true
set.add("b");
set.add("c");
set.add("d");
System.out.println(set.add("a"));//结果:false
两次添加"a"
情景1
HashSet set=new HashSet();
System.out.println(set.add(new People("张三")));//true
System.out.println(set.add(new People("张三")));//true
两次分别添加不同的对象。
情景2
HashSet set=new HashSet();
People p1=new People("张三");
System.out.println(set.add(p1));//true
System.out.println(set.add(p1));//false
两次都是添加p1
情景3
HashSet set=new HashSet();
String s1=new String("a");
String s2=new String("a");
System.out.println(set.add(s1));//true
System.out.println(set.add(s2));//false
两次分别添加s1,s2(显然,s1和s2是不同的对象)。
注意:此时第二次添加并不成功。
HashSet添加元素的过程
①HashCode
当HashSet在添加元素时,会先调用hashCode()方法,判断即将加入的元素的hashCode是否与集合中的元素有相同的,如果没有,则允许添加该元素。如果有相同的,则继续调用equals()方法,如果equals()方法返回true,则表示对象已经加入过了,不允许再添加了。否则,如果equels方法返回false,则允许添加新元素。
②equals
对于两个对象来说,如果使用equals返回true, 则这两个对象的hashcode一定相同。
对于两个对象来说,如果使用equals返回false,则这两个对象的hashcode不一定不相同(可以相同或者不同)。如果不同,可以提高性能。
对于Object类来说,不同的Object对象的hashcode值是不同的(hashCode值表示对象的地址)
String类的hashCode()方法重写了Object类的hashCode()方法,只要两个String对象的内容相同则认为hashCode相同,所以情景3比较特殊。
分享到:
相关推荐
我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量,并最终使用迭代器遍历了HashSet中的所有元素。 在实际应用中,HashSet因其存储元素的唯一性和对元素添加、删除、查询的高效性而...
1. 存储结构:HashSet使用哈希表,TreeSet使用红黑树。 2. 顺序:HashSet无特定顺序,TreeSet保持排序。 3. 插入、删除和查找效率:HashSet平均O(1),最坏O(n);TreeSet平均O(logn)。 4. 允许的元素:两者都不允许...
- **带集合的构造函数**:`HashSet(Collection<? extends E> c)` 使用给定的集合初始化HashSet,将集合中的所有元素添加到新创建的HashSet中。 - **指定初始容量的构造函数**:`HashSet(int initialCapacity)` 指定...
HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,包括添加元素、删除元素、检查元素是否存在等,都是直接调用HashMap的相关...
如果多个线程同时对一个`HashSet`进行修改操作,那么必须采取额外措施(如使用`synchronized`关键字或`Collections.synchronizedSet()`方法)来保证线程安全。 3. **允许一个null元素**:`HashSet`允许存在一个`null...
效率较高:HashSet 的查找、插入和删除操作的时间复杂度通常是常数时间 O(1),因为它使用了哈希表进行存储和检索。 非线程安全:HashSet 类本身不是线程安全的,在多线程环境下需要进行外部同步操作,或者使用 ...
- **`HashSet`与`HashMap`的关系**:实际上,`HashSet`底层是使用`HashMap`实现的,`HashSet`中的元素实际上是`HashMap`的键(key),值(value)为一个固定的静态对象(`PRESENT`)。 #### 七、结论 通过上述分析可以...
HashSet使用的是散列函数,那么它当中的元素也就无序可寻。同时,HashSet允许元素为null。 HashSet的实现原理可以总结为以下三点: (1)基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75...
- HashSet使用元素对象的`hashCode()`来决定元素在内部存储的位置。 - HashMap使用键对象的`hashCode()`来确定键值对的存储位置。 3. **查找效率**: - 由于HashMap有键的索引,查找效率通常比HashSet高,特别是...
- **排序**:如果需要排序的功能,可以选择使用`TreeSet`代替`HashSet`。 - **初始化**:初始化`HashSet`时可以指定初始容量,例如`new HashSet(17)`。 #### 五、总结 综上所述,`HashTable`、`HashMap`和`HashSet...
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较简单,查看 HashSet 的源代码,可以看到如下代码:
Java 方法lookup表和哈希表 Java 方法是一种面向对象的编程语言,广泛应用于安卓应用开发、Web 开发、...但是,HashSet 和 HashMap 的实现细节不同,HashSet 使用链式技术来解决哈希碰撞,而 HashMap 使用探测技术。
不过,在这个场景中,我们将探讨如何使用`std::vector`来模拟HashSet的行为。 `std::vector`是C++标准库中的动态数组,它允许我们在运行时调整大小。为了用`std::vector`实现HashSet,我们需要关注几个关键点:插入...
- 数据结构:HashSet使用哈希表,元素无序且不可重复;TreeSet使用红黑树,元素自动排序且不可重复。 - 操作性能:HashSet插入和查找速度快,但不保证元素顺序;TreeSet插入和查找速度略慢,但能提供排序功能。 **...
HashSet 使用 Hash 表结构,查询速度快,但不保证元素的顺序。LinkedHashSet 继承了 HashSet,添加了链表结构,保证了元素的顺序。TreeSet 使用红黑树结构,元素必须可以比较,不允许有 null。 Map 集合是一种键值...
java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。
HashSet使用哈希表实现,无序且不允许重复,它不保证元素顺序,不支持下标操作。TreeSet则是一个有序集合,实现了SortedSet接口,元素通过Comparable接口保持排序。Map接口存储键值对,HashMap、TreeMap和Hashtable...
首先,HashSet是由HashMap内部实现的,它利用了键值对(key-value)的概念,但与HashMap不同的是,HashSet不存储值,而是直接使用键(key)作为存储元素。每个元素在HashSet中都是唯一的,这得益于HashMap的哈希功能...