Map map=new HashMap();
String s1=new String("AA");
String s3=new String("AA");
String s4="AA";
String s6="AA";
map.put(s1,"Value");
String s2=(String)map.get(s3);
String s5=(String)map.get(s4);
s1==s3 false s4==s6 true //这里的==比较的应该不是hashcode吧
s2,s5都可以得到值Value
这里以下是查找key是否存在Entry[] table中
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
1: hashcode的API上解释是 将该对象的内部地址转换成一个整数来实现的。这里的内部地址是该对象在堆中的地址还是对象的引用存储在栈中的地址计算出来的?
2: java中可以输出一个对象在堆中的地址吗?在同一个JVM进程中是否有可能不同的对象的引用输出相同的hashcode呢?
3:为什么s1,s3,s4的hashcode都是相同的在我机子上是2080。不是说s1,s3的引用是指向堆中的对象的实例吗?s4是方法区中得字符串常量池?这里的hashcode是引用本身存储在栈中的地址呢还是其指向的对象在堆中的地址?
4 :s1==s3 是比较哪个地址呢?
5:hashMap中查找key时 int hash = hash(key.hashCode());
不同的key经过hash()运算是否有可能的到相同的hash呢?
e.hash == hash && ((k = e.key) == key || key.equals(k))这里一定要比较2个hash值相等吗?为什么