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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jxlovqqvo 中级黑马   /  2014-12-18 16:13  /  1096 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个内存地址真的只能存放一个对象?,但HashSet中出现了两个甚至更多相同hashCode值,但是它们内容不一样,难道一个内存地址可以放几个对象?无法理解这个
  1. public class HashSetDome {

  2.        
  3.         public static void main(String[] args) {
  4.                
  5.                
  6.                 HashSet hs = new HashSet();
  7.                 Person p1 = new Person("a1", 11);
  8.                 Person p2 = new Person("a2", 13);
  9.                 Person p3 = new Person("a3", 13);
  10.                

  11.                 hs.add(p1);
  12.                 hs.add(p2);
  13.                 hs.add(p3);
  14.                
  15.                
  16.        
  17.                 Iterator it = hs.iterator();
  18.                
  19.                 while(it.hasNext()){
  20.                         Person p = (Person)it.next();
  21.                         System.out.println(p.getName()+"....."+p.getAge());
  22.                 }

  23.         }

  24. }

  25. class Person{
  26.        
  27.         private String name;
  28.         public String getName() {
  29.                 return name;
  30.         }

  31.         public void setName(String name) {
  32.                 this.name = name;
  33.         }

  34.         public int getAge() {
  35.                 return age;
  36.         }

  37.         public void setAge(int age) {
  38.                 this.age = age;
  39.         }
  40.         private int age;
  41.         public Person(String name ,int age){
  42.                 this.name = name;
  43.                 this.age = age;
  44.                
  45.         }
  46.        
  47.         public int hashCode(){
  48.                
  49.                 return 60;//地址值改为一样的了
  50.         }
  51.         public boolean equals(Object obj){
  52.                
  53.                 if(!(obj instanceof Person)){
  54.                         return false;
  55.                 }
  56.                 Person p = (Person)obj;
  57.                 return this.name.equals(p.name)&&this.age == p.age;
  58.         }
  59.        
  60.        
  61. }
复制代码

7 个回复

倒序浏览
看不懂,大概几个人也可以坐在同一个座位上吧
回复 使用道具 举报
HashSet存值先比较HashCode(调用hashCode()),再比较实例对象(调用equals()),仅HashCode一样不代表你存的值是一样的
回复 使用道具 举报
摘得别人的:哈希值和地址值是不一样的,哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关,是系统分配的,是不存在相同的,而哈希值是可以通过强制手段设置为相同的,也就是说哈希值是一种逻辑上的确保唯一性,而地址值就是物理上确保唯一性。仅供参考!我的理解:一块内存地址肯定只能放一个对象,否则,就不会产生有内存溢出的问题了。
回复 使用道具 举报 1 0
huoxy 发表于 2014-12-18 18:28
摘得别人的:哈希值和地址值是不一样的,哈希值是通过哈希算法散列得来的,而地址值是通过是和物理层面有关 ...

哈希值和地址值不一样么?问题打印出来的结果是一样的啊
回复 使用道具 举报
hashcode并不指的是内存地址。
回复 使用道具 举报
哈希值是基于物理内存地址通过哈希算法得到的,不是真正的数据存储地址。
回复 使用道具 举报
Honelyboy 发表于 2014-12-18 20:11
哈希值是基于物理内存地址通过哈希算法得到的,不是真正的数据存储地址。 ...

意思是直接对象的引用打印出来的也是根据地址算出的哈希值?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马