String哪些你并不那么认为的那些事 | Java Debug 笔记

2023-11-28 15:44:17 浏览数 (1)

前言

==

String在java领域中使用的应该说是最广泛的了。相信刚开始学习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方法的内容。
代码语言:java复制
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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞