当前位置: 首页 > 知识库问答 >
问题:

分配并创建新的字符串差异

弓温书
2023-03-14
        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运算符工作?

共有1个答案

庄经国
2023-03-14

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

相反,当您new字符串时,将创建一个不同的新字符串对象。这就是为什么s1==s2false的原因。(这是new的一个基本属性。如果正常完成,它保证创建并返回一个新对象。)

但是,无论哪种情况,字符串都将具有相同的字符,这就是equals返回true的原因。

虽然理解是怎么回事很重要,但真正的教训是比较Java字符串的正确方法是使用equals而不是==

如果您希望安排字符串对象可以使用==进行相等性测试,则可以使用String.intern方法“实习”它们。但是,你必须始终如一地这样做...而且实习在各个方面都是一个昂贵的过程...所以这通常不是一个好主意。

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

 类似资料:
  • 问题内容: 和创建之间有什么区别?请告诉我 在String中,我们只有String对象,然后为什么要区别对待这两个对象。s1和s2具有不同的存储地址,而s3和s4具有相同的存储地址。为什么它基于 运算符。 问题答案: 加载定义Java字符串中代表字符串文字的对象的类时,它们将被添加到共享池中。这样可以确保String文字的所有“副本”实际上是同一对象……即使该文字出现在多个类中。这就是为什么是。

  • 我对神谕主题有意见 我们有一个表,其中一列存储由逗号(,)ex分隔的数据 我们需要能够分离这个值,并得到这样的结果 但是这个列的数量并不是固定的,一些类型可能是不同的数据湖,我们需要动态响应,例如 如果我为1运行进程,结果与以前一样 但是如果我为类型2运行它,结果应该如下 我们可以将项目字段转换为varchar2表,但我们找不到如何将其转换为使用游标。任何想法?非常感谢!对不起,如果我的英语不被理

  • 我有一个相对简单的数据框,看起来像这样(见下文)。其中一列“书”是一个字符串列表。 我的目标是为“Book”中三个不同的值中的每一个创建新的数据帧。也就是说,一个包含国际上出现的每个产品、国内出现的每个产品以及订阅的数据框架。 我不知道如何创建一个新的数据帧,它是由匹配现有数据帧中的部分字符串构建的。是否有一个内置的功能,或者我应该构建一个循环,在数据帧上迭代,并据此构建一个新的循环? df 我曾

  • 我读过很多关于创建字符串时内存分配的相互矛盾的文章。一些文章说new operator在堆中创建一个字符串,String literal在String Pool[heap]中创建,而一些文章说new operator在堆中创建一个对象,在String Pool中创建另一个对象。 为了分析这一点,我写了下面的程序,打印字符串字符数组和字符串对象的hashcode: 此程序打印以下输出: 从这个输出中

  • 我想解组一个具有' 有没有办法在不使用替换/replace的情况下取消对字符串的排序?

  • 问题内容: 有没有办法从Java中的String变量创建新类? 另外,如果可能,生成的对象是否必须为Object类型? 也许有更好的方法,但是我希望能够从XML文件中检索值,然后实例化以这些字符串命名的类。这些类中的每一个都实现相同的接口,并从相同的父类派生,因此我将能够在该类中调用特定的方法。 问题答案: 这是你想做的: 请注意,newInstance方法不允许使用参数化的构造函数。(请参阅Cl