从String到==和hashcode
从String到==和hashcode
1 public static void main(String[] args) { 2 String s1 = "ni"; 3 String s2 = "hao"; 4 String s3 = "nihao"; 5 String s4 = "ni" + "hao"; 6 String s5 = s1 + s2; 7 System.out.println(s3 == s4); 8 System.out.println(s3 == s5); 9 System.out.println(s3.equals(s5)); 10 System.out.println(s3.hashCode() == s5.hashCode()); 11 }
执行结果
true false true true
第一个输出结果大伙应该都知道,String在常量池里找到”nihao”就直接返回地址引用
第二个是因为等号后面有变量(假设是String s5 = s1 + “hao”结果也是一样),他都必须new一个新的String对象出来,就不回去常量池里找了
第三个大伙应该也知道String的equals方法被重写了,比较的是值一不一样而不是地址值
第四个就是典型地验证了 == 不相等的哈希值可能相等,估摸着就是算着俩对象一样哈希值一样拉链法给s5扔s3那颗红黑树里了(更可能是链表,就这么小的世界不会那么巧8 ^ ^_ )
根据第四个延申会不会两个对象长一样哈希值就一样呢,立刻实验
1 public class WhatEver implements Cloneable{ 2 public static void main(String[] args) { 3 WhatEver o1 = new WhatEver(); 4 WhatEver o2 = null; 5 try { 6 o2 = (WhatEver) o1.clone(); 7 } catch (CloneNotSupportedException e) { 8 e.printStackTrace(); 9 } 10 System.out.println(o1.hashCode() == o2.hashCode()); 11 } 12 }
执行结果
false
clone出来基本保证俩对象一样,结果却是false,俺也不知道咋回事了,懂的评论一下,去研究hashcode了