黑马程序员技术交流社区

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

作者: dicegame    时间: 2013-7-29 19:36
标题: 关于HashSet的问题
本帖最后由 杜光 于 2013-7-30 10:34 编辑
  1. package qbb;

  2. import java.util.*;

  3. public class HashSetTest {
  4.         public static void main(String[] args) {
  5.                 HashSet hs = new HashSet();
  6.                 hs.add("java1");
  7.                 hs.add("java2");
  8.                 hs.add("java3");
  9.                 hs.add("java4");
  10.                 Iterator it = hs.iterator();
  11.                 while(it.hasNext()) {
  12.                         System.out.println(it.next());
  13.                         System.out.println(it.next().hashCode());
  14.                 }
  15.         }
  16. }
复制代码
运行结果:
java1
100899409
java2
100899410
问题:
1.对象的地址和哈希码是什么关系呢?
2.HashSet中存放的是地址还是哈希码呢?
3.运行结果中为什么没有java3和java4呢?


作者: 哪颗最亮的星星    时间: 2013-7-29 20:44
HashSet的底层数据结构就是哈希码。
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
你这里java3和java4打印就是它的哈希值。
作者: Joesph    时间: 2013-7-29 21:56
我就补充一下了,权当复习
while(it.hasNext())
{

                        System.out.println(it.next());

                        System.out.println(it.next().hashCode());

                }

首先判断是否有下一个元素,有,true,进入循环体,打印java1,打印java3的哈希值,之后再判断条件,有,true,进入循环体,打印Java2,再打印java4的哈希值,在判断,false,退出

还有hashset是无序的(存入和取出的顺序不一定一致),所以就可能是
java1
100899409
java2
100899410

作者: dicegame    时间: 2013-7-30 00:56
谢谢各位,现在懂了
对象的地址和对象的哈希码不同
HashSet的底层数据结构是哈希表,存放的是对象的哈希码
对象的哈希码一般通过哈希函数算出
哈希函数和对象的属性有关
while循环中有两个next方法
所以每while一次,游标向前移动两次
本来想打印每个对象和对应的哈希码
正确的代码是:
Object obj = it.next();
System.out.println(obj);
System.out.println(obj.hashCode);




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