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

相关推荐
Tisfy1 天前
LeetCode 3498.字符串的反转度:一次遍历
leetcode·字符串·题解·遍历
Logic1012 天前
C语言/数据结构滑动窗口题解:替换k个字符后的最长连续相同字符子串(LeetCode 424)
c语言·数据结构·字符串·滑动窗口·时间复杂度·频率统计·算法题
Tisfy6 天前
LeetCode 2472.不重叠回文子字符串的最大数目:动态规划(贪心)
动态规划·字符串·题解·贪心·dp·回文字符串
Logic1018 天前
C语言/数据结构字符串题解:找出DNA序列中未配对的独特序列——排序+遍历(O(nlogn))
c语言·数据结构·字符串·数组·排序·时间复杂度·算法题
2601_9620994610 天前
Python中的find()函数:用法和示例
python·字符串·索引·子字符串·find函数
小白快快跑哦14 天前
python-字符串全解(四):字符串方法
开发语言·python·字符串
轩情吖14 天前
Python基础知识点完整总结
python·字符串·编程语言·函数·列表·元组·字典
lvwangshu19 天前
AC 自动机
算法·字符串
Tisfy1 个月前
LeetCode 3720.大于目标字符串的最小字典序排列:状态机 —— :从左往右枚举,失败则退回(最多退回一次)
linux·数据库·leetcode·字符串·状态机·构造
Tisfy1 个月前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口