访问哪个字符串对象?

Gau*_*ani 2 java string

我们知道当我们用new关键字创建新的String对象时,如下所示:

String str = new String("New String Will Have Two Objects");
Run Code Online (Sandbox Code Playgroud)

它将创建两个对象,一个在java堆内存上,另一个在String池上.

那么当我们调用访问"str"哪个字符串对象被访问时(堆对象或字符串池对象)?

根据我的理解,可以访问字符串池对象,如果是,那么堆对象会发生什么?

Nak*_*l91 7

如果要使用创建String对象 new

String str = new String("New String Will Have Two Objects");
Run Code Online (Sandbox Code Playgroud)

在这种情况下,JVM将在普通(非池)堆内存中创建一个新的字符串对象,文字"New String Will Have Two Objects"将放在字符串常量池中.该变量str将引用堆中的对象(非池).

方法'intern()'用法

这是java docs最好的描述

调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.

String str = new String("New String Will Have Two Objects");

str.intern();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢投票.:)直接字符串声明和关键字new之间的微小区别是当您使用双引号创建字符串时,如果存在或不存在,它将首先在池中检查.如果是,则返回相同的字符串.如果是`new`关键字,它将始终创建一个新字符串. (4认同)
  • 它将创建一个以字符串文字作为参数的对象.如果它已经存在,它将不会在池上创建任何新的String.在这种情况下,它将保留引用,它将引用计数为2,但是,当你来到关键字"new"时,JVM有义务在运行时创建一个新的String对象,而不是使用已存在的对象 (2认同)