new String和直接赋值的一些问题

分析1

我们先看以下代码:

java 复制代码
String str1 = "abc";  // 在常量池中

String str2 = new String("abc"); // 在堆上

System.out.println(str1 == str2)

以上结果的输出是什么?

输出:false

前置知识:

  • 在JVM中,对象的创建默认在堆中。

  • 字符串常量池(String Pool):Java中有一个特殊的区域称为字符串常量池。这个区域用来存储字符串常量,可以帮助节省内存,因为它确保所有相同的字符串常量都共享同一份内存。如果常量池中已经存在相同的字符串,就不会再创建新的相同字符串。

分析如下:

Java为了提高访问效率,当你 对一个字符串直接赋值时, 也就是执行第一句语句的时候,它会在方法区的字符串常量池中生成一个对应的字符串, 把该地址传递给 str1。当你 new 一个新的字符串时,它首先会检查 方法区中字符串常量池 中是否有对应的字符串,如果没有,则会持续生成一份。接着会在 JVM堆 中生成一个新的对象,把该对象在堆的引用传递给 str2。所以他们两个是不相等的。

分析2

java 复制代码
String str1 = "abc";  // 在常量池中

String str2 = "abc"; // 在堆上

System.out.println(str1 == str2)

以上结果的输出是什么?

输出 true

通过以上的分析你应该知道,第二个str2 会直接去字符串常量池中查找有无对应的字符串,如果有,直接返回该地址,所以str1和str2指向的是同一个地址空间,答案为true。

分析3

java 复制代码
String str1 = "abc";  // 在常量池中

String str2 = "abc"; // 在堆上

System.out.println(str1.equals(str2)

以上结果的输出是什么?

输出 true

String 类重写了 equals方法,它不是比较地址,是直接比较字符串的内容是否相等。

参考:参考1

相关推荐
hello14121919 小时前
洛谷P10677题解
c++·算法·字符串
燕山罗成8 天前
【动态规划-状态机模型】:大盗阿福、股票买卖Ⅳ、股票买卖Ⅴ、设计密码【已更新完成】
c++·算法·动态规划·字符串·kmp算法·状态机
闻缺陷则喜何志丹9 天前
【马拉车 中心扩展】1745. 分割回文串 IV
c++·算法·leetcode·字符串·分割·回文·中心扩展
Dearingxxx12 天前
蓝桥杯经典算法题 确定字符串是否是另一个的排序
职场和发展·蓝桥杯·字符串·排序
闻缺陷则喜何志丹12 天前
【广度优先搜索 深度优先搜索 图论】854. 相似度为 K 的字符串
c++·深度优先·字符串·力扣·图论·宽度优先·相似度
Dearingxxx14 天前
蓝桥杯 经典算法题 压缩字符串
职场和发展·蓝桥杯·字符串·连通块
Tisfy17 天前
LeetCode 2288.价格减免:模拟
linux·算法·leetcode·字符串·题解
闻缺陷则喜何志丹19 天前
【字符串】65. 有效数字
c++·算法·字符串·力扣·有效数字·小数·指数
一直学习永不止步20 天前
LeetCode题练习与总结:单词接龙--127
java·数据结构·算法·leetcode·字符串·哈希表·广度优先搜索
炫酷的伊莉娜1 个月前
【一刷《剑指Offer》】面试题 28:字符串的排列
算法·字符串·dfs·剑指offer·全排列