本帖最后由 王明(1988) 于 2012-4-23 11:08 编辑
嗯 不错的问题!让传说哥给你一个清晰的答案。
第一:你所打印的数组引用(或者对象引用)的结果都是一串字符这串字符其实是对象的toString()方法的返回值,java中是这样定的(比如类实例化的对象):类名(包含包)+@+内存地址
而这个内存地址是根据哈希算法计算出来的十六进制值,在java中表示内存地址,哈希值只是对内存地址的一种表现形式,因为哈希值会出现重复。
果断上代码上图:- package com.heima;
- public class HashCodeTest {
- public static void main(String[] args) {
- HashCodeTest h = new HashCodeTest();
- System.out.println(h);
- }
- }
复制代码 输出结果:
注意: 哈希码(hashcode)并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以hashcode可以做到尽可能的不一样,但我们要清楚一点,既然是用到hash技术,就是要解决冲突的,
所以hashcode是会出现相同的时候,我们可以将hashCode相同的看成放入同一个桶中。
第二:用例子证明hashcode会出现重复的可能。(说明美国的大神也并非算法天衣无缝)
果断上图上代码:- package com.heima;
- import java.util.ArrayList;
- import java.util.List;
- public class HashCodeTest2 {
-
- public static void main(String[] args) {
- //用List根据hashcode的不同,来装对象
- List<Integer> list = new ArrayList<Integer>();
- //装8000个,看看是否hashcode有重复的。。。
- for (int i = 0; i < 8000; i++) {
- HashCodeTest2 h = new HashCodeTest2();
- if (!list.contains(h.hashCode()))
- list.add(h.hashCode());
- }
- System.out.println("list中的hashcode个数为:"+list.size());
- }
- }
复制代码 输出结果:
我原想他会装8000个,但是少了2个hashcode值,这不说明了在8000个中有两个hashcode被重复了吗!。其实内存地址是不会重的。
打印的引用只是hashcode值,他可能冲突。
|