最近整理了一些面试资料,希望大佬们多多指点~
==
主要是两个变量的比较,返回值为true或者false
int a=10;
int b=10;
System.out.println(a==b);//结果为true
原因是基本类型的变量存在栈中,系统先创建一个变量为a的引用然后查找栈中是否存在10这个值,如果没找到,就将10存放进来,a指向10。同理b也是一样,创建一个变量为10的引用,这里栈中10已经存在了,把b指向10,所以在比较的过程中,a和b在内存中指向的位置是相同的。
而对于下面情况:
String a=new String(“abc”);
String b=new String(“abc”);
System.out.println(a==b);//结果为false
这是因为对于对象的比较是对对象引用的比较,对于a和b,他们在内存中对应的地址是不一样的,实例化时会重新开辟内存空间,把”abc”存到里面,所以a==b
返回的值false。
在看看下面的情况;
String str1=”abc”;
String str2=”abc”;
System.out.println(str1==str2);//结果为true
str1和str2指向同一个地址,创建多个”abc”字符串,在内存中只是存在一个对象,这种写法有利于节省内存空间,同时它可以在一定程度上提高程序的运行速度
所以得出结论:
==
操作符并不涉及对象内同的比较,若要对对象内容进行比较,则用equals
,如果在本例中,a.equals(b)则返回一个true值
总而言之,==
是对象地址的比较,而equals
是对对象内容的比较。对与基本数据类型,一般用==
,而对于字符串的比较,一般用equals
。
先来了解以下hashcode,是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
public int hashCode(){
};//返回对象的哈希值
在Java应用程序执行期间,在对同一对象多次调用hashCode方法时,必须一直返回相同的整数,前提是将对象进行hashcode比较的时候所用的信息没有被修改.
两个hashCode()返回的结果相等,则两个对象的equals()方法不一定相等
如果根据equals方法,两个对象不想等,那么对这两个对象中的任意对象上调用hashCode()方法不一定生成不同的整数结果,但是我们应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能
hashMap对象是根据key的hashcode来获取相应的值
所以在重写父类equals方法的时候,也要重写hashcode方法,使相等的两个对象获取的hashCode也相等,这样当此对象做Map类的key的时候,两个equals为真的对象获取的value都是同一个,比较符合实际。
不对,他们有相同的hashCode
注意以下两点:
对象相等则hashCode一定相等
hashCode相等对象未必相等
备注:问题来源于唐尤华
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。