黑马程序员技术交流社区

标题: 关于 HashSet 的有关问题 [打印本页]

作者: 学习代码    时间: 2014-3-22 21:17
标题: 关于 HashSet 的有关问题
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                         HashSet st = new HashSet();
  6.                         st.add("javac");
  7.                         st.add("javac");//想知道为什么"javac"的地址值是一样的啊 怎么 Object的方法的
  8.                         st.add("javac1");
  9.                         st.add("javac1");
  10.                         st.add("javac2");
  11.                         Iterator it = st.iterator();
  12.                         while(it.hasNext())
  13.                         {
  14.                                 sop(it.next());
  15.                         }
  16.         }

  17. public static void sop(Object obj)
  18.                 {
  19.                         System.out.println(obj);
  20.                 }

  21. }
复制代码

哪位帅哥 美女帮忙给解释一下  谢谢  
作者: 郝林杰    时间: 2014-3-22 22:04
st.add("javac");
st.add("javac");
当执行第一条st.add("javac");时HashSet调用它的add()方法将要添加的内容javac与st里面的内容相比较 如果st里没有javac元素,则添加成功;
当执行第二条st.add("javac");时HashSet调用它的add()方法将要添加的内容javac与st里面的内容相比较 此时因为已经有了javac元素(第一条语句执行完添加进去的),所以添加失败
所以元素javac的地址值是一样的
作者: Sage    时间: 2014-3-22 22:51
关于HashSet:
1.底层实现:哈希表
2.确保元素唯一性(即不重复):hashCode方法和equals方法
3.元素之间的比较顺序:先通过hashCode方法比较hashCode值,如相同,不会执行equals方法而直接认为元素相同,否则,执行equals方法。
4.hashSet中的比较:一般情况下,建议重写hashCode方法和equals方法,而不是使用Object类中的,想要更深入的了解,推荐你看下这两种方法的源代码
作者: 学习代码    时间: 2014-3-22 23:31
Sage 发表于 2014-3-22 22:51
关于HashSet:
1.底层实现:哈希表
2.确保元素唯一性(即不重复):hashCode方法和equals方法

谢谢 兄弟的指教    我再看看
作者: 郭黎明    时间: 2014-3-22 23:33
HashSet保证了值的唯一性,在HashSet中封装的有hashCode( )和equals方法判断两个对象是否相同,如果相同就只会保留一个。
作者: ς高眼光の目标    时间: 2014-3-23 05:00
你没有用hashCode方法和equals方法,你这样写,
st.add("javac");
st.add("javac");
2个“jvac“ 都会打印出来的
就好像 建立 2个 String 对象一样
当添加第一个个”javac“ 在内存中建立了 ,第二个”javac“会因为在内存中已经存在”javac“,
而不再重新建立对象,所以他们的地址值是一样的
通常使用Hashset,都用Hashcode和eqyals方法的
这是我的理解,希望帮到你




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2