A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dicegame 中级黑马   /  2013-7-29 19:36  /  900 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 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呢?

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

3 个回复

倒序浏览
HashSet的底层数据结构就是哈希码。
哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
你这里java3和java4打印就是它的哈希值。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
我就补充一下了,权当复习
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

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
谢谢各位,现在懂了
对象的地址和对象的哈希码不同
HashSet的底层数据结构是哈希表,存放的是对象的哈希码
对象的哈希码一般通过哈希函数算出
哈希函数和对象的属性有关
while循环中有两个next方法
所以每while一次,游标向前移动两次
本来想打印每个对象和对应的哈希码
正确的代码是:
Object obj = it.next();
System.out.println(obj);
System.out.println(obj.hashCode);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马