String为什么要重写equals方法,你真的知道吗?

前言

前几天去一家上市公司面试的时候,技术问出了这个问题,这个之前还没有考虑过,其实面试中会有很多这种扩散性思维的问题出现,这个就需要我们有足够的知识储备和一定的思考能力。大家可以先自己想一下重写equals是什么原因,可能善于思考的朋友已经有一些自己的见解,话不多说,开始正题。

涉及知识点

==和equals的区别

这个是比较基础的一个问题,想必大家都知道。
==:当是基本数据类型进行比较时,比较的是值,当是对象进行比较时,比较的是指向的内存地址。
equals:当对象没有重写equals时,比较的是指向的内存地址(Object作为java中所有类的父类,实现了equals方法),当对象重写后,调用的是重写的equals方法内的具体逻辑,而String的equals就是进行字符串比较

方法区(元数据区)存放什么数据

方法区:加载进内存的class信息、常量池、class类的静态变量、JIT(just in time,即时编译技术)编译后的代码等数据
而常量池又分为什么呢?
答:Class 文件常量池、运行时常量池、字符串常量池
那么既然字符串声明后,都是在字符串常量池里面,直接通过==判断内存地址是否一样不是也能实现同样效果吗,为什么还要重写equals呢?
在这里插入图片描述
这段代码执行后,得出了结果也是可能正确判断字符串的呀,下面我们带着疑问接着看

String s =“a”;和String s = new String(“a”);的区别

在这里插入图片描述
为什么会输出上边的结果呢,String a = “a” 的方式,Java 虚拟机会将其分配到常量池中,而常量池中没有重复的元素,比如当执行“a”时,java虚拟机会先在常量池中检索是否已经有“a”,如果有那么就将“a”的地址赋给变量,如果没有就创建一个,然后在赋给变量;而 String c= new String(“a”) 则会被分到堆内存中,即使内容一样还是会创建新的对象。
看到这,大家应该明白为什么String需要重写equals的原因了,单纯的使用Object提供的equals方法,只能比较内存引用,而字符串显示的new String("");是分配到堆空间,而不是常量池,所以需要重写equals的方式,来支持字符串的值相同也返回true。

猜你喜欢

转载自blog.csdn.net/kolbjbe/article/details/114228938