当前位置: 首页 > 面试题库 >

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

苗盛
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

s1 和创建之间有什么区别s3?请告诉我

在String中,我们只有String对象,然后为什么要区别对待这两个对象。s1和s2具有不同的存储地址,而s3和s4具有相同的存储地址。为什么它基于
new 运算符。


问题答案:

加载html" target="_blank">定义StringJava字符串中代表字符串文字的对象String的类时,它们将被添加到共享池中。这样可以确保String文字的所有“副本”实际上是同一对象……即使该文字出现在多个类中。这就是为什么s3 == s4true

相反,当您new使用String时,会创建一个不同的新String对象。这就是为什么s1 == s2false。(这是的基本属性new。如果正常完成,则可以保证创建并返回一个新对象。)

但是,无论哪种情况,字符串都将具有相同的字符,这就是为什么equals要返回true

尽管了解发生了什么很重要,但 真正的 教训是,比较Java字符串的 正确 方法是使用equals而不是==

如果您希望使用来测试String对象的相等性==,则可以使用String.intern方法“实习”它们。但是,您必须始终如一地进行此操作……并且在各个方面进行实习都是一个昂贵的过程……因此通常不是一个好主意。



 类似资料:
  • 创建和有什么区别?请让我知道 在String中,我们只有String对象,那么为什么它将这两个对象区别对待。s1和s2具有不同存储器地址,而s3和s4具有相同的存储器地址。为什么它基于运算符工作?

  • 我对神谕主题有意见 我们有一个表,其中一列存储由逗号(,)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