1、设置

当向集合Set中添加对象时。首先集合计算要添加对象的hashcode,依据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set觉得该对象在集合中不存在,直接添加进去。假设在该位置有一个对象存在。接着将准备添加到集合中的的对象与该位置上的对象进行equals比較。若返回false,在进行一次散列。将该对象放到散列后计算出的新地址。若返回true,不会再将该对象添加到集合中

2、当重写equals方法时,必需要重写hashcode方法

假设一个类的两个对象。使用equals方法比較时。结果为true,那么这两个对象必须具有同样的hashcode

3、请參考下面代码执行。查看输出结果来理解以上说法

test1和test2比較的是String,因为String重写了equals方法和hashcode方法。所以,String = “abc"。和 string = new String("abc")比較equals方法时候是返回true,因此test1和test2输出结果一致。Person类没有重写equals方法。而Person1重写了,所以test3和test4输出结果不一致。

  1. /**
  2. * author Ding Chengyun
  3. * 2014-2-23
  4. */
  5. package test;
  6.  
  7. import java.util.HashSet;
  8. import java.util.Iterator;
  9. import java.util.Set;
  10.  
  11. /**
  12. * @author Ding Chengyun
  13. * 2014-2-23
  14. */
  15. public class SetTest {
  16.  
  17. /**
  18. * @param args
  19. */
  20. public static void main(String[] args) {
  21. test4();
  22. }
  23.  
  24. public static void test1() {
  25. Set<String> s1 = new HashSet<String>();
  26. s1.add("abc");
  27. s1.add("xyz");
  28. s1.add("abc");
  29. for (Iterator<String> iter = s1.iterator(); iter.hasNext();) {
  30. System.out.println(iter.next());
  31. }
  32. // 输出:
  33. // abc
  34. // xyz
  35. }
  36.  
  37. public static void test2() {
  38. Set<String> s1 = new HashSet<String>();
  39. s1.add(new String("abc"));
  40. s1.add(new String("xyz"));
  41. s1.add(new String("abc"));
  42. for (Iterator<String> iter = s1.iterator(); iter.hasNext();) {
  43. System.out.println(iter.next());
  44. }
  45.  
  46. // 输出:
  47. // abc
  48. // xyz
  49.  
  50. }
  51.  
  52. public static void test3() {
  53. Set<Person> s = new HashSet<Person>();
  54. s.add(new Person("zhangsan"));
  55. s.add(new Person("lisi"));
  56. s.add(new Person("zhangsan"));
  57. for (Iterator<Person> iter = s.iterator(); iter.hasNext();) {
  58. System.out.println(iter.next().getName());
  59. }
  60.  
  61. // 输出:
  62. // zhangsan
  63. // zhangsan
  64. // lisi
  65.  
  66. }
  67.  
  68. public static void test4() {
  69. Set<Person1> s = new HashSet<Person1>();
  70. s.add(new Person1("zhangsan"));
  71. s.add(new Person1("lisi"));
  72. s.add(new Person1("zhangsan"));
  73. for (Iterator<Person1> iter = s.iterator(); iter.hasNext();) {
  74. System.out.println(iter.next().getName());
  75. }
  76. // 输出:
  77. // lisi
  78. // zhangsan
  79. }
  80. }
  81.  
  82. class Person {
  83. String name;
  84. public Person(String name) {
  85. this.name = name;
  86. }
  87. public String getName() {
  88. return name;
  89. }
  90. }
  91.  
  92. class Person1 {
  93. String name;
  94. public Person1(String name) {
  95. this.name = name;
  96. }
  97. public String getName() {
  98. return name;
  99. }
  100.  
  101. public boolean equals(Object obj) {
  102. if (this == obj) {
  103. return true;
  104. }
  105. if (obj instanceof Person1) {
  106. Person1 p = (Person1)obj;
  107. if (this.name.equals(p.getName())) {
  108. return true;
  109. }
  110. }
  111. return false;
  112. }
  113.  
  114. public int hashCode() {
  115. return name.hashCode();
  116. }
  117. }

版权声明:本文博客原创文章。博客,未经同意,不得转载。

java基金会成立Set的更多相关文章

  1. java基金会成立

    在java在,数据收集的操作,应使用非常.最近看了零星收集的小知识,在这里,一点点排序. 它基本上是四个常用的类操作点总结集合. 首先.集合大致分为两个方向.一种是普通的集合类型,通过接口collec ...

  2. .NET基金会成立

    作者 Jonathan Allen ,译者 臧秀涛 发布于 2014年4月8日 随着.NET基金会的成立,微软在成为主要的开源参与者的道路上又前进了一步.该基金会的宗旨是“成为越来越多的开源.NET项 ...

  3. 【Java基金会】Java整理面试问题和评论(一)

    1. ArrayList,Vector, LinkedList 存储性能及特点 ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便添加和插入元素,它们都 ...

  4. Java基金会——JUnit

    JUnit 測试的重要性毋庸质疑.但怎样使測试更加准确和全面.而且独立于项目之外而且避免硬编码,JUnit给了我们一个非常好的解决方式. 能够说JUnit是为单元測试而生的,一个Java语言的单元測试 ...

  5. 黑马程序猿——java基金会--jdk、变量

    学习内容: 1.Java发展历史 2.jdk和jre的差别,功能. 3.jdk和jre的下载和安装 4.配置环境.path和classpath 5.helloworld程序 6.进制之间的转换 7.凝 ...

  6. JAVA基金会 (三)反射 反思的深度分析

    上一页已经推出反映的一些基本概念,这主要是通过一个例子反映谈的过程,以及样品的实际应用. 这个样例是这种设计思路:从一个属性文件里读取一段字符串,然后,依据该字符串生成相应的类实例对象:这之后另一个增 ...

  7. java基金会 之 HashMap统计csvWord文档

    一:知识的补充( 这个HashMap Map 和 c++的Map还是有非常大的区别,惊人的差异大的人,当然,两者的作用是相同的,但函数名出一个非常大的.即使iterator的差是非常大的 ) (1)H ...

  8. 阿里雷卷:Reactive 基金会的成立将对开发方式带来哪些影响?

    作者 | 赵钰莹 近日,Linux 基金会宣布成立 Reactive 基金会.对于 Reactive,各位开发者应该并不陌生,尤其是 Node.js 开发者,但真正了解并意识到这件事情对开发方式带来的 ...

  9. 最好的Java IDE之争:Eclipse PK IntelliJ IDEA

    话说,好马配好鞍,一个好的工匠,必定要有一套好的工具才能打造出最好的工艺给大家.之前,Plumbr团队里的所有成员都使用Eclipse编辑器,而如今,大家都成为IntelliJ IDEA用户.那么,到 ...

随机推荐

  1. 通过无线连接的方式来做 Appium 自动化

    感谢TesterHome里各种大牛,提出的宝贵思路,我这里只是将他们的想法综合了一下,试出来的成果,谢谢大家分享你们的智慧. 简单说下背景: 由于公司要测试APP 产品的耗电问题,我们采取的办法很lo ...

  2. 微凉大大,教你一步一步在linux中正确的安装Xcache加速php。

    首先,强烈吐槽,百度上的教程,都左复制右复制的,乱七八糟,缺东缺西的.借此微凉大大我提供我苦心整理好的教程.以便各位小菜能顺利的使用Xcache加速php,假设看完了,也操作了,还是失败了的话,请联系 ...

  3. [Unity3D]Unity3D发展偷看游戏初期阶段NGUI

    朋友,大家晚上好. 我是秦培.欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei.近期博主開始研究NGUI了,由于NGUI是Unity3D中最为流行的界面插件,所以不管从学 ...

  4. Swift - 使用xib添加新界面

    除了使用storyboard外,我们还可以使用xib来设计并创建页面. 1,下面通过一个样例来演示: (1)点击主界面的“信息”按钮,页面切换到信息界面 (2)点击信息界面的“返回”,关闭信息界面,回 ...

  5. 配置QtCreator+CDB远程调试环境(要设置_NT_SYMBOL_PATH和QT_PLUGIN_PATH和Path)

    相关环境信息:开发机Win7 x64.远程机器WinXP.调试器是CDB.Qt版本5.2.1 一.部署远程机器环境 我这里用的是虚拟机(Windows XP),根据你要调试的程序选择安装不同架构的Wi ...

  6. 14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器

    14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器 这个章节描述技术关于移动或者copy ...

  7. 【Demo 0001】Java基础-数据类型

    本章学习要点:       1.  了解Java 语言       2.  了解Java程序结构;        3.  了解Java中基本数据类型;       4.  掌握基本数据类型之间的运算 ...

  8. XMPP入门

    本人原创,很多其它xmpp知识.ios知识.其它分享知识见:我的个人博客 简单介绍: 1.XMPP是可扩展消息与存在协议,主要用于im. 2.他是一种类似于http协议的传输数据协议.过程如:&quo ...

  9. A*寻路算法的实现

    原理:http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 算法理论请到原理这个传送门,代码中的注释,已经比较详细,所以我不会讲 ...

  10. DOM4J解析XML文档

    Tip:DOM4J解析XML文档 Dom4j是一个简单.灵活的开放源代码的库.Dom4j是由早期开发JDOM的人分离出来而后独立开发的.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j ...