JAVA基础--java中equals,hashcode和==的区别

1、==
在谈JAVA中使用 == 前首先要明白Java中的数据类型分为两种,即基本数据类型和引用数据类型,在该两种情况下使用 所代表的含义也是不同。
基本数据类型:
Java中的基本数据类型包括四类八种,即
布尔型:boolean(1/8Byte);
字符型:char(2 Byte 一个字符可存储一个汉字);
整形:byte(1Byte) ,short (2Byte),int (4Byte), long (8Byte);
浮点型:float (4Byte),double (8Byte);
在基本数据类型中使用 == 表示的值之间的比较,返回的是boolean类型,例如

int a = 3;
char c = 'a';
System.out.println(a==c);

这里需要注意char中字符对应的是ASCII码值,其中’a’代表97,'A’代表65,例如:

int a = 97;
char c = 'a';
System.out.println(a==c);

输出结果则为true;

引用数据类型
在解释引用数据类型之前首先要明白两个概念,即栈和堆。
:执行先进后出,主要存储方法的局部变量,每个方法都会分配一块内存空间,方法一旦执行完成,就会将该空间释放;
:执行先进先出,主要存储数组和对象(即通过new出来的),因此堆中存储的都是实体。
例如执行如下语句:

Integer aInteger  = new Integer(3);

JVM在加载该语句所在的方法时,首先会在栈中定义一个变量aInteger ,然后在堆中分配一个内存地址来存储右边的实体,该实体存储的值是3,比如内存地址是0x001,最后将该地址赋给aInteger,这样aInteger 就引用了堆中的实体,也就是栈中存储的是地址值, 堆中存储的是实体值,当该语句所在的方法销毁后,该栈中的aInteger 也随之销毁,堆中的实体虽然不会马上销毁,但当JVM检测到该实体不存在被引用时,也会主动将其销毁,至此就完成了一个调用过程。
以上主要是想说明在引用数据类型使用 ==时,比较的是栈中的地址值,而不是堆中的实体值,比如:

Integer aInteger  = new Integer(3);
Integer bInteger  = new Integer(3);
System.out.println(aInteger == bInteger);

结果输出的为:false
除非将该地址的引用赋值给栈中的另一个变量,例如:

Integer aInteger  = new Integer(3);
Integer integer = new Integer(4);
integer = aInteger;
System.out.println(integer == aInteger);

刚开始aInteger 和integer 所指向堆中的实体值不同,当然其获取的地址值也不同,但由于aInteger将其地址值赋给integer,因此aInteger和integer同时指向了同一个堆中实体,此时如果输出integer的值则为3而不是4。

2 、equals
equals用于引用数据类型,不适于基本数据类型,在调用equlas时,默认调用的是object中的equlas中的方法:

public boolean equals(Object obj) {
        return (this == obj);
    }

而Object中的equals是判断栈中内存的地址值,因此在自定义引用数据类型时,需要重写equals方法,根据需求改写,例如:

	@Override
	public boolean equals(Object obj) {
		if(this ==obj) {
			return true;
		}else {
			return false;
		}
	}

通过自定义修改equals的方法是根据需求改写,而Java中基本的引用数据类型也是重写equals方法,例如Integer:

 public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

首先查看该对象是不是其类型(instanceof ),如果不是直接返回false,然后获取其实体值,因此其比较的则是堆中的实体值,而不是栈中的地址值。

猜你喜欢

转载自blog.csdn.net/xk7298/article/details/83689362