Java面试之对象比较

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

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

==主要是两个变量的比较,返回值为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

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

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

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相等对象未必相等

备注:问题来源于唐尤华

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏积累沉淀

linux shell函数定义和调用

说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自...

29170
来自专栏java工会

Java基础第一阶段知识点,招实习的面试官都在问这些

23190
来自专栏Python小屋

Python标准库base64用法简介

base64模块提供了大量函数用来把二进制数据编码为可打印的ASCII字符,以及将其解码为二进制数据。提供了RFC3548中Base16、Base32、Base...

96680
来自专栏nnngu

如何用java语言实现C#中的ref关键字(按引用传递参数)的效果

在上一篇文章中(Java的参数传递是值传递还是引用传递),主要分析了java语言的参数传递只有按值传递而没有按引用传递。 先看一下微软的C#文档对按引用传递的定...

47860
来自专栏编程心路

Java基础-Object类中的方法

下面这些是 Java 中的 Object 类中方法,共 11 个,9 种方法,wait() 方法被重载了。

14830
来自专栏WindCoder

数组排序

8210
来自专栏null的专栏

挑战数据结构与算法面试题——统计上排数在下排出现的次数

题目来源“数据结构与算法面试题80道”。在此给出我的解法,如你有更好的解法,欢迎留言。 ? 分析: 本题应该是一个确定的问题,即上排的是个数是题目中给定的...

33260
来自专栏西安-晁州

js数组去重

对于如下对象数组 [{id: 0, name: "name1"}, {id: 1, name: "name2"},{id: 1, name: "name2"},...

30600
来自专栏自然语言处理

Python读书笔记:需要注意的70个小问题

4 单双引号括起来的,字符串可以包含引号和撇号。用法:"this's a cup"

13620
来自专栏代码世界

Python基础数据类型之集合以及其他和深浅copy

一、基础数据类型汇总补充 list  在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错(可以从后向前循环删除,这样不会改变未删元素的索...

31790

扫码关注云+社区

领取腾讯云代金券