如何在java中处理字符串

时间:2015-06-15 10:47:31

标签: java string

String a = "abc";

这会在字符串池中创建文字"abc"

String b = "abc";

没有创建新的文字。 b指向现有的"abc"

String c = new String("abc");

现在,对象在堆中创建,c指向堆。文字也在字符串池中创建。

但是,如果池已经有文字"abc"会怎样?池中会出现重复的文字吗?

5 个答案:

答案 0 :(得分:6)

  

但是,如果游泳池已经有文字" abc"会发生什么?池中会出现重复的文字吗?

没有

String c = new String("abc");

在语义上等同于

String tmp = "abc";
String c = new String(tmp);

通过这个,应该很清楚,因为文字用作字符串构造函数的参数,所以不会创建字符串池中的额外条目。

new String(...)在堆上创建一个字符串是正确的,因此查看堆和字符串池时,会有多个对象代表"abc",但不会超过一个字符串池。

  

[...]那是我们使用字符串文字的时候。但是,如果我们给出String a = new String("abc");

,是否可以重用字符串池中的文字

是的,如果您给出" abc"将会重复使用字符串池文字。作为构造函数的参数。但是,生成的String对象不在池中,而是在堆上。

答案 1 :(得分:3)

  

但是,如果池已经有文字“abc”会发生什么?

它将被重复使用。

如果您在某个地方String x = "abc";和其他地方String y = "abc";,则x == y始终为true。这证明实际上文字被重复使用。

答案 2 :(得分:0)

String池中不会有重复的条目,它将被另一个引用重用。

String s1="foo";字面意思将进入池中,s1将引用。

String s2="foo";这次它会检查" foo" literal已经在StringPool中可用,因为它现在已存在,所以s2将引用相同的文字。

String s3=new String("foo");

"富" ,通过字符串arg构造函数String对象将被创建,即" foo"在堆中由于通过new运算符创建对象,然后s3将引用它。

String interning using inter() method
  

Java默认情况下不会将所有String对象放入String池中,   相反,它们为您提供了显式存储任意任意的灵活性   String池中的对象。您可以将任何对象放入String池中   调用java.lang.String类的intern()方法。虽然,当你   使用String的字面文字表示法创建,它会自动调用   intern()方法将该对象放入String池中,前提是它   不在游泳池中。

答案 3 :(得分:0)

在执行此代码的任何之前,字符串池中的字符串文字"abc" 。它由编译器和类加载器放在那里。在执行此代码时不会发生这种情况。

答案 4 :(得分:0)

String c = new String("abc");
  

现在,对象在堆中创建,c指向堆。的   文字也会在字符串池中创建。

不会将字面值创建到字符串池中。它只会保留在堆中。 看到这张照片。

http://www.journaldev.com/797/what-is-java-string-pool

  

但是,如果游泳池已经有文字" abc"会发生什么?将   池中有重复的文字?

池中不能有重复值。因为字符串是java中的不可变对象。请参阅roger_that的这篇文章中的第二个答案。

String is immutable. What exactly is the meaning?