代码如下:
package com.lcp.testJava; public class TestHashCode { /** * @param args */ private int i; public static void main(String[] args) { // TODO Auto-generated method stub int a = 1; int b = 1; System.out.print(a==b); String s = new String("abcde"); String s1 = "abcde"; String s3 = "abcde"; String s2 = new String("abcde"); System.out.println(s==s1); System.out.println(s.equals(s1)); System.out.println(s2==s1); System.out.println(s==s2); System.out.println(s1==s3); System.out.println("s.hashCode is: " + s.hashCode()); System.out.println("s1.hashCode is: " + s1.hashCode()); System.out.println("s2.hashCode is:" + s2.hashCode()); System.out.println(s.equals(s2)); System.out.println(s1.equals(s2)); } }
结果如下:
truefalse true false false true s.hashCode is: 92599395 s1.hashCode is: 92599395 s2.hashCode is:92599395 true true
1.基本类型“==”比较的是值,a,b值相等,所以进宪“==”操作时强果为true.
2.s是new出来,不管内存之间有没有“abcde”,JVM都会new个新的“abcde”;
s1是在编译时期就具有的 字符串常量,“abcde”是存在于栈区的,这不同于new关键字new出来的都是放在堆 区 的。
所以“==”操作比较的是二个不同的对象,结果为false;
s.equals(s1)在String类型中比较的是值,s,s1的值都为“abcde”,所以结果为ture.
3.明显 s3是s1的一个拷贝,“==” 与“equals”都为ture.
4.s,s1,s2 它们的hashcode完全是一样, 实际是可以是指内容一样。
对象相等,hashcode一定相等
反之则不是: hashcode相等,对象不一定相等。
总结一下:
==或!= 在比较基本类型时,比较的是值。 在比较【对象】时,比较的是对象的引用。如果想比较对象的值,就要用equals方法了。