java - 分配和创建新的字符串差异

标签 java string

        String s1 = new String("string");
        String s2 = new String("string");

        String s3 = "string";
        String s4 = "string";

        System.out.println(s1 == s2);      //FALSE
        System.out.println(s2.equals(s1)); //TRUE

        System.out.println(s3 == s4);      //TRUE
        System.out.println(s3.equals(s4)); //TRUE

创建 s1s3 有什么区别? 请告诉我

在 String 中,我们只有 String 对象,那么为什么它以不同的方式对待这两个对象。 s1 和 s2 具有不同的内存地址,而 s3 和 s4 具有相同的内存地址。 为什么它基于 new operator.?

最佳答案

String在 Java 源代码中表示字符串文字的对象被添加到共享 String当定义它们的类被加载时池1。这确保了 String 文字的所有“副本”实际上是同一个对象......即使文字出现在多个类中也是如此。这就是为什么 s3 == s4true .

相比之下,当你 new一个字符串,一个不同的新字符串对象被创建。这就是为什么 s1 == s2false . (这是 new 的基本属性。它保证创建并返回一个新对象......如果它正常完成。)

然而,无论哪种情况,字符串都将具有相同的字符,这就是为什么 equals正在返回 true .


虽然了解正在发生的事情很重要,但真正的教训是比较 Java 字符串的正确方法是使用 equals而不是 == .

如果您想安排可以使用 == 来测试您的 String 对象是否相等, 你可以使用 String.intern “实习”他们方法。但是,您必须始终如一地这样做……而实习在各个方面都是一个昂贵的过程……所以这通常不是一个好主意。


1 - 实际上,它比那要复杂一点。它们的对象在类加载和首次使用文字之间的某个时间被添加到池中。精确的时间未指定并且依赖于 JVM 实现。然而,它保证只发生一次,并且在任何应用程序代码看到 String 之前发生。文字对应的对象引用。

关于java - 分配和创建新的字符串差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15986188/

相关文章:

c# - 通过 [] 运算符访问字符串中的 char 是更快还是通过 [] 运算符访问 char[] 中的 char 更快?

java nio 和 stdin、stdout、stderr 的流结束

php - 这个简单的查询有问题。有人能看到吗?

java - Swing 动画暂停和恢复

java - 使焦点不转到第一个组件

c - 我的程序在某些情况下似乎无法分隔单词

用于正确连接的 MySQL 字符串操作

php - 查找字符串中是否存在子字符串

java - "<identifier> expected"Java 编译错误

java - (作业)Java错误: Incompatible Types