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

字符串实习生方法与普通字符串创建的区别[重复]

司寇望
2023-03-14

我无法理解internat方法提供程序按字符串类的用法。

String s1 = "vivek"; //Stmt 1
String s2 = "vivek"; //Stmt 2
String s3 = s1.intern(); //Stmt 3

System.out.println(s1 == s2);// prints true
System.out.println(s1 == s3);// prints true

我读了那个内部编译器做了一个实习生,但是在哪个对象上呢?编译器怎么知道他必须为s1做实习生才能创建s2

这里STMT2STMT3有什么区别?两者总是一样吗?如果是,Java的internat方法有什么特别之处?

共有1个答案

濮金鑫
2023-03-14

不同之处在于变量的初始化方式决定了变量的保存位置;

  1. 如果它具有相同的值和相同的初始化方法,并且使用new关键字初始化-它将把它保存在堆中,并且将每个变量保存为新对象,即使它具有相同的值。
  2. 如果它具有相同的值和相同的初始化方法并且直接初始化-它将在JVM池内存中引用它。

字符串实习Oracle引用。

String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object
s1 == s1;         // true, same pointer
s1 == s2;         // true, s1 and s1 share storage in common pool
s1 == s3;         // true, s3 is assigned same pointer as s1
s1.equals(s3);    // true, same contents
s1 == s4;         // false, different pointers
s1.equals(s4);    // true, same contents
s4 == s5;         // false, different pointers in heap
s4.equals(s5);    // true, same contents
    null
 类似资料:
  • 对性能是否有影响? 不同Java版本的行为是否有差异?

  • 我试图理解String#intern方法。现在,这引起了更多的混乱。 上面的代码打印为true。如果我注释第3行并取消注释第5行,则打印为false 对于第3行,将检查SCP,并将字符串添加到SCP中。但在这种情况下,s2如何等于s4呢 s2仍在引用堆中指向SCP常量的对象。正当 有人能解释一下发生了什么吗?我已经经历了不同的SO问题,但仍然无法理解。 EDIT 我只是想了解实习生方法。我知道b/

  • 我的代码正在工作,但我认为这是一种糟糕的方法。(使用 system() 存在安全问题,并且仅仅因为不接受 ss.str() 而创建字符串)。你知道更好的方法吗? argv[2] 来自: int main (int argc, char *argv[]) {... 有更好的主意吗?

  • 来自String类的intern方法的javaDocs: 调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。 考虑以下用例: 有人能解释为什么为真而以下为假吗: <代码>系统。出来println(fifth==第五个.intern()) <代码

  • 问题内容: 为什么Python仅内置字符串?应该可以扩展到可哈希和可比较的类,对吗? 问题答案: 内联事物的目的是能够通过比较它们的内存地址来进行比较。您要确保永远不要创建两个具有相同值的对象(当程序请求创建一个与现有对象具有相同值的第二个对象时,它会收到对先前存在的对象的引用)。这要求你要实习的东西是 不变的 ; 如果一个被拘禁对象的值可以改变,那么按地址比较它们是行不通的。 在Python中,

  • 我对编码非常陌生,刚刚接触过静态方法,所以我为这些愚蠢的错误提前道歉。在main下调用该方法时,该方法应该显示一个三角形,但我得到的控制台是空的,没有输出。但是,如果我将此写在main下: 然后,三角形将显示在控制台中,但是对于这个赋值,字符串/三角形必须仅通过使用来调用