这个访谈问题的共同商定答案是代码创建了两个对象.但我不这么认为; 我写了一些代码来确认.
public class StringTest {
public static void main(String[] args) {
String s1 = "a";
String s2 = "a";
String s3 = new String("a");
System.out.println("s1: "+s1.hashCode());
System.out.println("s2: "+s2.hashCode());
System.out.println("s3: "+s3.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:

这是否意味着只创建了一个对象?
重申:我的问题是以下代码创建了多少个对象:
String s = new String("xyz")
Run Code Online (Sandbox Code Playgroud)
而不是StringTest代码.
在@Don Branson的启发下,我调试了以下代码:
public class test {
public static void main(String[] args) {
String s = new String("abc");
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:

s的id是84,"abc"的id是82.这究竟是什么意思?
所以,我意识到我要提出的问题涉及到一次又一次被打死的话题,然而,即使在阅读了我能找到的所有答案和文档之后,我仍然对此感到困惑.字符串实习.也许是因为我对JVM缺乏了解; 也许这是由于Java 7中引入的变化使许多上述答案和文档贬值.无论哪种方式,我都被困住了,我希望有人可以帮助我更清楚地理解这个概念......
String a = "text";
String b = new String("text");
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我理解将创建两个String对象.我也明白在内存中只有一个包含序列't','e','x'和't'的char数组.但是,内存中的每个字符串对象实际存储在哪里?如果我读过的内容我已经正确阅读:变量的引用't', 'e', 'x', and 't'将存储在常量池中,而引用a将存储在堆中,对吧?如果是这种情况,我对实习池如何维护实习字符串感到困惑.它是否跟踪常量池中定义的字符串以及b从堆中手动内化(调用)的字符串?JVM是否创建常量池中定义的字符串对象并将它们加载到实习池中?我很困惑这一切是如何运作的......
再次,对于提出这样令人困惑/愚蠢的问题感到遗憾,这只是因为我对结构和内部工作方式相对较新,.intern()而且很多问题让我头晕目眩.谢谢!
这是关于Java字符串常量池.在我的一个程序中,我正在解密数据库的密码并将其存储在字符串中.我听说Java Strings将存储在一个常量池中,它们不会被VM重新启动或加载String Quits的ClassLoader破坏.
如果是这种情况,我的密码将存储在字符串池中.我非常关心这个问题.有没有其他方法来摧毁这些文字或我能做的任何其他事情.
请在此建议,
此致,Sunny.
我最近几天试图理解String常量池和inter的概念,在阅读了很多文章之后我理解了它的一些部分,但仍然对以下几点感到困惑: -
1. String a = "abc" 这会在字符串常量池中创建一个对象,但是以下代码行是否在字符串常量池中创建对象"xyz"?
String b = ("xyz").toLowerCase()
2.
String c = "qwe"
String d = c.substring(1)
d.intern()
String e = "we"
Run Code Online (Sandbox Code Playgroud)
在类加载期间是否应将字符"we"添加到String consant池中,如果是这样,为什么d==e即使d未指向String Constant池也会返回true