前言
==
String
在java领域中使用的应该说是最广泛的了。相信刚开始学习Java
的伙伴们经常使用==
来进行比对的
问题描述
====
- 在
==
中并不是我们认为的相等判断 。所以有时候程序会偏离我们的原定路线执行的。先看看下面这段代码吧
public static void main(String[] args) throws InterruptedException {
String text1 = new String("nihao");
String text2 = new String("nihao");
System.out.println(text1==text2);
}
- 刚入门的你一定会认为输出的是
true
。 但是事实往往并不是如此(事实一定不是如此)
解析
==
- 在java中
==
是将两个对象实际地址块进行比较的。也就是说两个变量对应再内存中地址的比较 - 而new是java的关键字。每次都会在内存中开辟新的空间。新的空间地址肯定是不一样的所以通过
==
返回false - 另外一个
equals
是比较两个对象的tostirng
方法的内容。
public static void main(String[] args) throws InterruptedException {
String text1 = new String("nihao");
String text2 = new String("nihao");
System.out.println(text1.equals(text2));
}
equals
======
- 我们点进去源码看看在
equals
里面 。 首先通过==
比较内存地址因为这样是比较快的。这里我们也可以叫做快速比较 - 如果快速比较没有通过的话,在开始比较长度然后将两个字符串中的字符逐个对位比较是否相同。有一个值的不同的则返回false
升级思考
====
String text = new String("nihao")
到底在内存中做了啥。为什么会导致两个对象内存地址不一样。- 在java中凡是通过new的都是开辟空间存储的。第一次new会在堆中开辟空间存储
nihao
- 第二次new还会在堆中开辟空间存储'nihao' 。 两次是没有任何联系的只不过两次存储的值都是
nihao
。 - 这里你就理解成第一次是你在纸上写下nihao这个单词并防止在桌子上。第二次你又写了一个
nihao
放在桌子上。此时两个虽然都是nihao
但是是在两张纸上。所以此时他们==
比较是不相等的。而通过equal
则会比较两张纸上内容是啥。两个内容都是nihao
那么就认为你是相等的。
总结
==
- 虽然是简单的比较问题但是内部确涉及到JVM内存结构的问题。哪些存在栈中哪些存在堆中。而且还需要我们理解下堆的作用才能充分理解
==
和equals
的区别 我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!