java中“==”,“equals”,hashcode之间关系

 代码如下:

 

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方法了。

 

你可能感兴趣的:(HashCode,“==”,“equals”)