Java 需要了解字符串、字符串常量池和字符串intern方法
如果字符串常量池中没有字符串,如果我说Java 需要了解字符串、字符串常量池和字符串intern方法,java,string,string-interning,string-pool,Java,String,String Interning,String Pool,如果字符串常量池中没有字符串,如果我说 String s = "Java"; 那么将创建多少个对象 现在池子里又没东西了,我说 String s = new String("Java"); String s = new String("Java"); s.intern(); String s = new String("Java"); String s1 = s.intern(); 现在,将创建多少个对象 现在池子里又没东西了,我说 String s = new String("Java
String s = "Java";
那么将创建多少个对象
String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
现在,将创建多少个对象String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
实习的方法会做什么String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
现在会发生什么字符串
现在将创建多少个对象
将创建一个字符串
,池中仍有一个字符串
实习的方法会做什么
它将尝试将一个“Java”
放入池中,在那里找到另一个“Java”
,并从步骤1返回对该“Java”
的引用
现在会发生什么
步骤1中的“Java”
将返回,并且s1
现在引用它
如果字符串常量池中没有字符串,如果我说
字符串s=“Java”
那么将创建多少个对象
在实习生池中创建一个字符串对象。
s
由该引用指定
现在池子里又没东西了,我说
String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
字符串s=新字符串(“Java”);
现在将创建多少个对象。
创建两个字符串对象
一个是interned“Java”
,另一个是与“Java”
内容相同的新字符串
现在池子里又没东西了,我说
String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
字符串s=新字符串(“Java”);
s、 实习医生();
实习的方法会做什么
该方法将:
调用intern方法时,如果池中已经包含一个字符串,该字符串等于equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用
因此,在本例中,该字符串被添加到池中,并返回对该字符串的引用
最后一个问题是:
现在池子里又没东西了,我说
String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
字符串s=新字符串(“Java”);
字符串s1=s.intern();
现在会发生什么
这里发生的是:
字符串“Java”被添加到池中
新字符串被创建,由相同的char[]
数组“Java”支持
s.intern()
我将假设在下面的每个示例中,您只需在新的JVM中加载和执行代码一次。(我还假设代码中没有其他地方使用文字“Java”
…因为这会使事情复杂化。)
1) 假设字符串常量池中没有字符串,如果
说
那么将创建多少个对象
加载方法时,将创建一个字符串并将其添加到池中
2) 现在池子里又没东西了,我说
String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
现在将创建多少个对象
加载方法时,将创建一个字符串并将其添加到池中
运行代码时,new
会创建第二个字符串,并且不会将其添加到池中
3) 现在池子里又没东西了,我说
String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
实习的方法会做什么
加载方法时,将创建一个字符串并将其添加到池中
第二个字符串是由新建的
创建的,它不会添加到池中
intern
调用返回第一个字符串。(你没有保留参考资料…)
4) 现在池子里又没东西了,我说
String s = new String("Java");
String s = new String("Java");
s.intern();
String s = new String("Java");
String s1 = s.intern();
现在会发生什么
与示例3相同。因此,s1
将保存对表示“Java”
字符串文本的字符串的引用
我在SCJP5 Kathy Sierra的书中读到,当你用new
创建一个字符串时,会创建两个对象,一个在堆上,一个在池中
我怀疑这本书说的是否准确。(你在释义,我认为你的释义有点不准确。)
不过,您的解释大致正确(这很重要!)表示文字的string对象是在加载代码片段1时创建并添加到池中的,而不是在执行代码片段时
为了解决另一个困惑点:
“实际上,我的意思是,从您给出的答案来看,字符串常量池中似乎总是会添加一个字符串。”
这是不正确的。这是一个错误的概括
虽然上述4种情况都是如此,但其他情况则不然。这取决于原始字符串的来源。在典型应用程序中,大多数文本数据都是从文件、套接字或用户界面读取的。在这种情况下,字符串将直接或通过库调用从字符数组中创建
下面是一个简单(但不切实际)的示例,演示如何从字符串的组成字符创建字符串
String s = new String(new char[]{'J', 'a', 'v', 'a'});
在上面的代码段中,只创建了一个字符串,它不在字符串池中。如果希望生成的字符串位于字符串池中,则需要显式调用intern
如下所示:
String s = new String(new char[]{'J', 'a', 'v', 'a'});
s = s.intern();
。。。这将(如有必要)在字符串池2中创建第二个字符串
1-显然,在一些JVM中,创建和插入字符串文字是惰性的,因此不可能100%确定地说它是什么时候创建的