`

关于集合,你搞明白了吗?

阅读更多

1、当向集合set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置来存放当前的对象,当在该位置没有一个对象存在的话,那么集合set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,再进行一次散列,将该对象放到散列后计算出的新地址里,如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。

2、当重写eqals方法时,必须要重写hashCode方法,如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象必须具有相同的hashCode

Object的hashCode()方法中有这样的说明:
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.

意味着在比较对象的时候需要重写hashCode()和equals()方法,并且要保证两者返回的是相同结果,也就是说:重写了两个方法后,equals()返回的是true时,hashCode()也必须返回true;equals()返回的是false时,hashCode()也必须返回false

Object的hashCode()计算的是内存地址,只有内存地址相同时,两个Object的hashCode()方法返回相同的值。

 示例代码:

java 代码
  1. package com.test;   
  2.   
  3. import java.util.HashSet;   
  4. import java.util.Iterator;   
  5. import java.util.Set;   
  6.   
  7. public class SetTest {   
  8.   
  9.     public static void main(String[] args) {   
  10.         Set set = new HashSet();   
  11.            
  12.         set.add(new String("abc"));   
  13.         set.add(new String("xyz"));   
  14.         set.add(new String("abc"));   
  15.            
  16.         for(Iterator iter = set.iterator();iter.hasNext();)   
  17.         {   
  18.             System.out.println(iter.next());   
  19.         }   
  20.            
  21.         Set  set2 = new HashSet ();   
  22.            
  23.         set2.add(new People("zhangsan"));   
  24.         set2.add(new People("lisi"));   
  25.         set2.add(new People("zhangsan"));   
  26.            
  27.         for(Iterator  iter = set2.iterator();iter.hasNext();)   
  28.         {   
  29.             System.out.println(iter.next().getName());   
  30.         }   
  31.     }   
  32.   
  33. }   
  34.   
  35. class People   
  36. {   
  37.     private String name;   
  38.     public People(String name)   
  39.     {   
  40.         this.name = name;   
  41.     }   
  42.     public String getName()   
  43.     {   
  44.         return this.name;   
  45.     }   
  46.        
  47.     public boolean equals(Object obj)   
  48.     {   
  49.         if(null != obj)   
  50.         {   
  51.             if(this == obj)   
  52.             {   
  53.                 return true;   
  54.             }   
  55.             if(obj instanceof People)   
  56.             {   
  57.                 People people = (People)obj;   
  58.                 if((this.name).equals(people.name))   
  59.                 {   
  60.                     return true;   
  61.                 }   
  62.             }   
  63.         }   
  64.            
  65.         return false;   
  66.     }   
  67.        
  68.     public int hashCode()   
  69.     {   
  70.         return this.name.hashCode();   
  71.     }   
  72. }   

 

输出结果:

xyz
abc
zhangsan
lisi

原因是String类重写了hashCode和equals方法,使得当String对象的内容相同时,都返回true

而在程序代码People中我们也重写了Object的hashCode和equals方法,使得当People对象的name属性值内容相同时都返回true

分享到:
评论

相关推荐

    java 每个新手都要搞懂弄明白的

    `时,实际上你创建的并不是一个String对象,而是声明了一个名为`s`的引用变量,它指向内存中一个包含文本"Hello world!"的String对象。这里的重点是,`s`只是一个指针,它存储了对象的地址,而不是对象本身。如果再...

    Java多线程实战精讲-带你一次搞明白Java多线程高并发

    本文将深入探讨Java多线程的相关知识点,帮助你全面理解并掌握这一核心概念。 1. **线程基础** - **线程定义**:线程是操作系统分配CPU时间的基本单位,每个进程至少包含一个线程。 - **线程创建**:Java提供了两...

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    要解决这个问题,你需要在配置文件中添加映射资源的 `<mapping>` 元素,如下所示: ```xml ``` 接着,我们来看一段有错误的代码片段。这段代码试图执行事务操作,但存在一些常见的错误: 1. 没有调用`session....

    关于在LABVIEW中使用正则匹配公式.vi

    很多人都搞不明白,查了很多资料还是不太明白。实际上就是一些类似通配符在作怪和其他语言也差不多。附件带上了,可以研究研究,构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将...

    销售是客户沟通的达成.pdf

    着眼于成为专业人员从销售情况和策略着手搞清客户不感兴趣的原因关注最有潜力的客户为以后的销售活动作铺垫启发客户思考主动发掘客户的需求把益处传达给客户建立友好关系明确说明你想让客户怎么做确信客户明白你说的...

    Java初学者都应该搞懂的六个问题.pdf

    首先,我们要明白的是**Java中的对象引用**。在Java中,当我们声明一个对象,如`String s = "Hello world!"`时,并不是创建了一个新的String对象,而是声明了一个指向已存在常量池中"Hello world!"字符串的引用。这...

    贪心算法实验(最小生成树) (2).pdf

    之前的数据结构中,很多涉及到图的实现,尤其那些代码实在是晦涩难懂,搞得我实在不想学习,后来在算法课上学到的东西就有点不同了,也许是经过时间的打磨,感觉到现在的代码没有那么难懂了。 结论 通过本次实验,...

    C#微软培训资料

    14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 ...

    PHP 面向对象技术(全面讲解).txt

    者看完整篇内容后再去把概念搞明白吧。 2.什么是类,什么是对象,类和对象之间的关系 类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一 的抽象描述,其内部包括属性和服务两个...

    手机T9拼音输入法模仿器

    和他们俩住的远 也没得商量 思路上来就自己搞完了 项目名:手机T9输入法模拟器 参加人员:小枪 开发平台:window XP 开发工具:visual studio 2005 , sqlserver 2005 重点要点:全程数据库操作语句 ...

    万能makefile写法详解,一步一步写一个实用的makefile

    @echo $@ $(subst output,OUTPUT,$@) $^ # $@指这个规则里所有目标的集合,$^指这个规则里所有依赖的集合。该行是把目标(bigoutput或littleoutput)里所有子串output替换成大写的OUTPUT (二)隐含规则 对...

Global site tag (gtag.js) - Google Analytics