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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chenwei 中级黑马   /  2012-4-22 21:10  /  3585 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

int [] a1= new int[1];
System.out.println(a1);
打印的是[I@af993e
有的老师说是hashcode值
有的老师说是内存地址
有什么关系吗

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

9 个回复

倒序浏览
就是数组创建之后在内存中开辟的空间。这块空间的地址就是通过哈希值算得出来的,System.out.println(a1);这是打印内存的地址值,地址是用哈希值表示的,所以你打印出来的就是哈希值。
回复 使用道具 举报
内存地址是用哈希值表示的
[I@af993e这段字符串中,@后面的是内存地址也就是哈希值,老毕视频里有讲到~
回复 使用道具 举报
内存地址是用十六进制的哈希值表示的。哈希值只是对内存地址的一种表现形式。就好比一个取了一个名字,不过这里内存地址的人名是用十六进制表示的哈希值。
回复 使用道具 举报
对象一定有内存地址,所以一定有哈希值,因为哈希值是根据地址生成的整数;

Object 的hashCode方法里面就一句返回语句  是 return 类名的 +@+对象内存地址值 , 所以肯定和内存地址值有关系的,这个版主说过。- -
回复 使用道具 举报
如果你没有自定义hashcode方法的话,那么内存地址就是windows自己用hash算法算出来的hash值并被java虚拟机调用的
回复 使用道具 举报
王勃 中级黑马 2012-4-23 10:31:00
7#
本帖最后由 王明(1988) 于 2012-4-23 11:08 编辑

嗯 不错的问题!让传说哥给你一个清晰的答案。
第一:你所打印的数组引用(或者对象引用)的结果都是一串字符这串字符其实是对象的toString()方法的返回值,java中是这样定的(比如类实例化的对象):类名(包含包)+@+内存地址
         而这个内存地址是根据哈希算法计算出来的十六进制值,在java中表示内存地址,哈希值只是对内存地址的一种表现形式,因为哈希值会出现重复。
         
果断上代码上图:
  1. package com.heima;

  2. public class HashCodeTest {
  3.         public static void main(String[] args) {
  4.                 HashCodeTest h = new HashCodeTest();
  5.                 System.out.println(h);
  6.         }

  7. }
复制代码
输出结果:
  


  
注意: 哈希码(hashcode)并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
          Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以hashcode可以做到尽可能的不一样,但我们要清楚一点,既然是用到hash技术,就是要解决冲突的,
          所以hashcode是会出现相同的时候,我们可以将hashCode相同的看成放入同一个桶中。
第二:用例子证明hashcode会出现重复的可能。(说明美国的大神也并非算法天衣无缝)
       果断上图上代码:
  1. package com.heima;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. public class HashCodeTest2 {
  5.         
  6.         public static void main(String[] args) {
  7.                 //用List根据hashcode的不同,来装对象
  8.                 List<Integer> list = new ArrayList<Integer>();
  9.                 //装8000个,看看是否hashcode有重复的。。。
  10.                 for (int i = 0; i < 8000; i++) {
  11.                         HashCodeTest2 h = new HashCodeTest2();
  12.                         if (!list.contains(h.hashCode()))
  13.                                 list.add(h.hashCode());
  14.                 }
  15.                 System.out.println("list中的hashcode个数为:"+list.size());
  16.         }
  17. }
复制代码
输出结果:

   我原想他会装8000个,但是少了2个hashcode值,这不说明了在8000个中有两个hashcode被重复了吗!。其实内存地址是不会重的。
   打印的引用只是hashcode值,他可能冲突。

评分

参与人数 1技术分 +2 收起 理由
岳民喜 + 2 说得很好,赞!

查看全部评分

回复 使用道具 举报
王勃 中级黑马 2012-4-23 10:40:01
8#
怎么才能上大图呢,总是被缩小,郁闷中。。。。
回复 使用道具 举报
王明(1988) 发表于 2012-4-23 10:40
怎么才能上大图呢,总是被缩小,郁闷中。。。。

哈哈,小图浏览的时候一点就大了。郁闷啥。
回复 使用道具 举报
嗯,我想不用单击,图片就很清晰,一直都是这样,郁闷的很啊,看来戴志康这两天不好好干了。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马