前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java面试之对象比较

Java面试之对象比较

原创
作者头像
黄桂期
发布2018-07-25 23:44:57
5700
发布2018-07-25 23:44:57
举报
文章被收录于专栏:土豆专栏土豆专栏

最近整理了一些面试资料,希望大佬们多多指点~

在比较对象时,”==” 运算符和 equals 运算有何区别

==主要是两个变量的比较,返回值为true或者false

代码语言:javascript
复制
int a=10;
int b=10;
System.out.println(a==b);//结果为true

原因是基本类型的变量存在栈中,系统先创建一个变量为a的引用然后查找栈中是否存在10这个值,如果没找到,就将10存放进来,a指向10。同理b也是一样,创建一个变量为10的引用,这里栈中10已经存在了,把b指向10,所以在比较的过程中,a和b在内存中指向的位置是相同的。

而对于下面情况:

代码语言:javascript
复制
String a=new String(“abc”);
String b=new String(“abc”);
System.out.println(a==b);//结果为false

这是因为对于对象的比较是对对象引用的比较,对于a和b,他们在内存中对应的地址是不一样的,实例化时会重新开辟内存空间,把”abc”存到里面,所以a==b返回的值false。

在看看下面的情况;

代码语言:javascript
复制
String str1=”abc”;
String str2=”abc”;
System.out.println(str1==str2);//结果为true

str1和str2指向同一个地址,创建多个”abc”字符串,在内存中只是存在一个对象,这种写法有利于节省内存空间,同时它可以在一定程度上提高程序的运行速度

所以得出结论:

==操作符并不涉及对象内同的比较,若要对对象内容进行比较,则用equals,如果在本例中,a.equals(b)则返回一个true值

总而言之,==是对象地址的比较,而equals是对对象内容的比较。对与基本数据类型,一般用==,而对于字符串的比较,一般用equals

如果要重写一个对象的equals方法,还要考虑什么

先来了解以下hashcode,是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值

代码语言:javascript
复制
public int hashCode(){
};//返回对象的哈希值

在Java应用程序执行期间,在对同一对象多次调用hashCode方法时,必须一直返回相同的整数,前提是将对象进行hashcode比较的时候所用的信息没有被修改.

两个hashCode()返回的结果相等,则两个对象的equals()方法不一定相等

如果根据equals方法,两个对象不想等,那么对这两个对象中的任意对象上调用hashCode()方法不一定生成不同的整数结果,但是我们应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能

hashMap对象是根据key的hashcode来获取相应的值

所以在重写父类equals方法的时候,也要重写hashcode方法,使相等的两个对象获取的hashCode也相等,这样当此对象做Map类的key的时候,两个equals为真的对象获取的value都是同一个,比较符合实际。

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

不对,他们有相同的hashCode

注意以下两点:

对象相等则hashCode一定相等

hashCode相等对象未必相等

备注:问题来源于唐尤华

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在比较对象时,”==” 运算符和 equals 运算有何区别
  • 如果要重写一个对象的equals方法,还要考虑什么
  • 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档