String 字符串浅析

测试环境为 JDK 1.8

测试 1

        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);

显示结果为 true。

解释

创建 String 字面量时,虚拟机在编译期间把该字面量放到字符串常量池中。创建 s2 所代表的 “abc” 时,首先检查常量池中是否已经存在相同的字面量(此处已经存在 s1 代表的 “abc” 了),如果存在直接返回该字面量的引用,否则创建新的字符串。所以 s2 和 s1 是同样的引用,完全相等。

测试 2

        String s1 = "abc";
        String s2 = new String("abc");
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));

显示结果为 false, true。

解释

“new String(“abc”)” 首先在字符串常量池中创建字面量 “abc”(此处由于 s1 已经创建过了,所以不会再重复创建),然后在堆中创建 String 对象。所以这一句话将会让字符串常量池和堆内存中都有 “abc”。

s1 持有字符串常量池中的 “abc” 的引用,s2 持有堆中 “abc” 对象的引用,显然不在同一内存中,所以使用 “==” 比较时结果为 false。使用 “equals” 方法只比较它们的值,所以返回 true。

发布了10 篇原创文章 · 获赞 0 · 访问量 311

猜你喜欢

转载自blog.csdn.net/Victorgcx/article/details/103882272