gpt4 book ai didi

java - Java 中字符串是如何创建和存储的?

转载 作者:行者123 更新时间:2023-11-30 08:07:57 24 4
gpt4 key购买 nike

为了了解 String 对象是如何创建和存储的,我尝试了以下程序,并且看到了我查询的输出。有人可以帮忙吗?

package corejava.immutable;

public class StringTester {

public static void main(String[] args) {
// TODO Auto-generated method stub

String s1 = "Omkar Patkar";
String s2 = "Omkar Patkar";
String s3 = "Omkar" + " Patkar";
String s4 = "Omkar";
String s5 = s4 +" Patkar";
String s6 = new String("Omkar Patkar");

System.out.println("Hashcode s1 = "+s1.hashCode());
System.out.println("Hashcode s2 = "+s2.hashCode());
System.out.println("Hashcode s3 = "+s3.hashCode());
System.out.println("Hashcode s4 = "+s4.hashCode());
System.out.println("Hashcode s5 = "+s5.hashCode());
System.out.println("Hashcode s6 = "+s6.hashCode());

System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

System.out.println("Indentity Hashcode s1 = "+System.identityHashCode(s1));
System.out.println("Indentity Hashcode s2 = "+System.identityHashCode(s2));
System.out.println("Indentity Hashcode s3 = "+System.identityHashCode(s3));
System.out.println("Indentity Hashcode s4 = "+System.identityHashCode(s4));
System.out.println("Indentity Hashcode s5 = "+System.identityHashCode(s5));
System.out.println("Indentity Hashcode s6 = "+System.identityHashCode(s6));
System.out.println("Indentity Hashcode intern s6 = "+System.identityHashCode(s6.intern()));

System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");

System.out.println("s1 == s2 : - "+(s1 == s2));
System.out.println("s1 == s3 : - "+(s1 == s3));
System.out.println("s1 == s4 : - "+(s1 == s4));
System.out.println("s1 == s5 : - "+(s1 == s5));
System.out.println("s1 == s6 : - "+(s1 == s6));

System.out.println("\ns2 == s3 : - "+(s2 == s3));
System.out.println("s2 == s4 : - "+(s2 == s4));
System.out.println("s2 == s5 : - "+(s2 == s5));
System.out.println("s2 == s6 : - "+(s2 == s6));

System.out.println("\ns3 == s4 : - "+(s3 == s4));
System.out.println("s3 == s5 : - "+(s3 == s5));
System.out.println("s3 == s6 : - "+(s3 == s6));

System.out.println("\ns4 == s5 : - "+(s4 == s5));
System.out.println("s4 == s6 : - "+(s4 == s6));

System.out.println("\ns5 == s6 : - "+(s5 == s6));

System.out.println("\ns1 == s6.intern() : - "+(s1 == s6.intern()));
System.out.println("s2 == s6.intern() : - "+(s2 == s6.intern()));
System.out.println("s3 == s6.intern() : - "+(s3 == s6.intern()));
System.out.println("s4 == s6.intern() : - "+(s4 == s6.intern()));
System.out.println("s5 == s6.intern() : - "+(s5 == s6.intern()));


}

}

我看到以下输出:-

Hashcode s1 = 2062602683
Hashcode s2 = 2062602683
Hashcode s3 = 2062602683
Hashcode s4 = 76311326
Hashcode s5 = 2062602683
Hashcode s6 = 2062602683
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Indentity Hashcode s1 = 4337374
Indentity Hashcode s2 = 4337374
Indentity Hashcode s3 = 4337374
Indentity Hashcode s4 = 18019860
Indentity Hashcode s5 = 31054905
Indentity Hashcode s6 = 605645
Indentity Hashcode intern s6 = 4337374
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
s1 == s2 : - true
s1 == s3 : - true
s1 == s4 : - false
s1 == s5 : - false
s1 == s6 : - false

s2 == s3 : - true
s2 == s4 : - false
s2 == s5 : - false
s2 == s6 : - false

s3 == s4 : - false
s3 == s5 : - false
s3 == s6 : - false

s4 == s5 : - false
s4 == s6 : - false

s5 == s6 : - false

s1 == s6.intern() : - true
s2 == s6.intern() : - true
s3 == s6.intern() : - true
s4 == s6.intern() : - false
s5 == s6.intern() : - false

s5和s6的身份哈希码与s1、s2、s3不同...为什么会这样?

这些对象是在内存的哪个区域创建的? ...对象图将有助于理解...

最佳答案

您已经创建了字符串文字和字符串对象。像 s1 和 s2 这样的字符串文字存储在字符串池中。因为它们是相同的字符串,所以它们具有相同的引用。这是有效的。

使用new关键字创建的字符串对象会产生存储在堆上的对象。它们的处理方式与任何其他对象相同。使用相同的 String 值创建 2 个对象将产生 2 个对象,每个对象都有自己的引用。使用 new 并不具有与字符串池中的字符串文字相同的效率。内部化 String 对象会将其移至 String 池。

当您使用 == 比较 2 个对象时,您正在比较它们的引用。因此,比较 2 个具有相同值的字符串文字将导致测试为真。但是,测试使用 new 关键字创建的 2 个对象则不会。这就是为什么您应该使用 equals 方法来比较对象。

编辑

由 2 个字符串文字串联创建的字符串将生成一个字符串文字,例如 s3。因此,s3 具有与 s1 和 s2 相同的身份哈希码。但是,s5 是根据字符串文字和对字符串文字的引用创建的,从而产生一个新对象。这解释了为什么它有不同的身份哈希码。

关于java - Java 中字符串是如何创建和存储的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30827572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com