今天,朋友突然发来一个类测试结果:
public class WrappedString {
@SuppressWarnings("unused")
private String s;
public WrappedString(String s) {
this.s = s;
}
@SuppressWarnings("unchecked")
public static void main(String[] args) {
HashSet hs = new HashSet();
WrappedString ws1 = new WrappedString("aardvark");
WrappedString ws2 = new WrappedString("aardvark");
String s1 = new String("aardvark");
String s2 = new String("aardvark");
hs.add(ws1);
System.out.println(hs.size());
hs.add(ws2);
System.out.println(hs.size());
hs.add(s1);
System.out.println(hs.size());
hs.add(s2);
System.out.println(hs.size());
}
}
他问我,为什么输出结果是1,2,3,3?
真郁闷,好久不倒腾这东西,基本功都忘得差不多了.哎,丢脸啊!后来才发现hashset他分割存储的就是hash值,即hashcode()!
ws1,ws2,s1,s2都是不同的对象,为什么会出现3个不同的hash值!那是因为ws1和ws2这种对象和String类型的对象计算hash方式不一样,object类中的hash方法就是直接返回对象的这个内部id号,与string的hash方法是不同的,object的hash方法能够用来区分不同的对象.因为原始的object对象没有任何有意义的值可用来计算哈希!
哎哎!
后来把代码改成如下:
HashSet hs = new HashSet();
WrappedString ws1 = new WrappedString("aardvark");
WrappedString ws2 = new WrappedString("aardvark");
String s1 = new String("aardvark");
String s2 = new String("aardvark");
hs.add(ws1.s);
System.out.println(hs.size());
hs.add(ws2.s);
System.out.println(hs.size());
hs.add(s1);
System.out.println(hs.size());
hs.add(s2);
System.out.println(hs.size());
结果可想而知,现在每次往hashset添加的值都是字符串类型的!所以结果固然是1,1,1,1 就一个值了!
分享到:
相关推荐
总结来说,深入理解ArrayList、LinkedList、HashMap和HashSet的源码,有助于我们更好地利用它们的特性,优化代码性能,并在面临并发问题时做出正确的选择。对于开发人员来说,掌握这些基础数据结构的实现原理是提高...
`HashSet`则是实现了`Set`接口,它不包含重复的元素,也没有顺序,但与`HashMap`和`Hashtable`不同,它不存储键值对,而是直接存储元素。`HashSet`的底层实现也依赖于`HashMap`,每个元素在`HashSet`中被视为一个键...
在编程领域,数组是一种基本的数据结构,...在实际编程中,我们经常会遇到类似的问题,需要灵活运用各种数据结构和算法来实现高效、准确的解决方案。通过不断地练习和学习,我们可以提升编程技能,更好地应对各种挑战。
然后创建一个HashSet用于存储已经遇到的节点值。接着,我们遍历链表,如果当前节点的值已经在HashSet中(即重复),我们就跳过这个节点,将其从链表中移除。否则,我们继续处理下一个节点。 这种方法的时间复杂度是...
2. 使用HashSet存储URL,虽然查询速度快,但内存消耗巨大,不适合大量URL的情况。 3. 通过MD5或SHA-1等哈希函数处理URL后存储,虽然降低了内存需求,但仍然不是最优化的解决方案。 4. Bit-Map方法通过映射URL到...
设计模式是软件工程中经过验证的、通用的解决方案,用于解决在设计阶段经常遇到的问题。在LLD Designs中,你可能发现以下几种设计模式的实例: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。 2...
在IT领域,尤其是在软件开发与编程中,对数据结构的操作是一项基本且重要的技能。其中,对集合(如列表、集合等)进行操作是常见的需求之一。...希望本文能为大家在日常开发中遇到的类似问题提供一些参考和启发。
作为 Unity 游戏开发者,我们经常会遇到游戏卡帧的问题,而 GC Alloc 正是造成 Unity 游戏偶尔卡帧的罪魁祸首。那么,为什么 GC Alloc 会导致游戏卡帧呢?这主要是因为 GC Alloc 会导致 Unity 游戏中的垃圾回收机制...
- **HashSet vs TreeSet**:HashSet存储无序、不重复元素,查找速度快;TreeSet元素排序,支持二分查找,但插入速度较慢。 - **HashMap vs TreeMap**:HashMap非排序,查找速度快;TreeMap排序,键值对有序,适用...
在Java编程中,集合是用来存储一组对象的数据结构。ArrayList是Java集合框架中的一种,它...在实际开发中,集合框架的其他类,如LinkedList、HashSet等,也有各自的特性和用途,可以根据实际需求选择合适的数据结构。
比如,如果使用数组来存储班级学员信息,可能面临数组空间不足或浪费的问题。而使用集合框架就可以动态地管理内存空间,不需要预先指定集合的大小,从而有效地利用内存资源。 Java集合框架包含的核心内容如下: 1....
本文将详细解答在Java面试中可能会遇到的一些核心问题,这些问题涵盖了Java语言的基础概念、类库使用、异常处理、内存管理、多线程、设计模式等多个方面。以下是针对这些面试问题的详细解释: 1. **面向对象的特征*...
2. 创建一个HashSet来存储当前窗口内的字符,确保没有重复。 3. 使用一个变量maxLen记录最长子串的长度,初始值为0。 4. 使用一个循环,不断扩展right指针,将新字符添加到HashSet中。如果新字符不在HashSet中,则...
Java 程序查找两个数组之间的共同元素是一个常见的编程任务,尤其在数据处理和分析中。这个任务可以通过多种...对于初学者,理解这两种方法及其背后的逻辑是非常有益的,这有助于在遇到类似问题时能快速找到解决方案。
例如,假设我们需要统计一段文本中单词的出现次数,可以创建一个HashSet来存储已遇到的单词,用HashMap来记录每个单词的出现次数。这样,HashSet可以避免重复添加,HashMap则提供快速查找和更新计数。 总之,Java...
2. **数组与集合**:处理多数据时,数组和集合(如ArrayList、LinkedList、HashSet等)会用于存储和操作数值。 3. **递归**:许多Project Euler的问题可以通过递归函数来解决,即函数调用自身以解决更小的子问题。 ...
在处理JSON数据时,可能会遇到重复元素的情况,尤其是在合并多个数据源或者从数据库中读取数据时。去除这些重复项对于提高数据质量、减少存储空间以及优化性能都有重要意义。 ### 实现方法:使用HashSet去重 在...
- **HashSet和HashMap**:HashSet存储不重复元素,HashMap存储键值对,键必须是唯一的。 7. **多线程** - **Thread类**:创建和控制线程的基本类。 - **synchronized**:用于同步方法或代码块,防止多个线程同时...
8. **哈希表和字典**:C#的`Dictionary, TValue>`和`HashSet<T>`是高效的数据结构,适用于查找、去重等问题。在LeetCode的解决方案中,它们经常用于存储和检索信息。 通过分析这些代码,你可以深入了解C#的语法特性...