Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Strings和substring方法_Java_String_Object_Substring_Allocation - Fatal编程技术网

Java-Strings和substring方法

Java-Strings和substring方法,java,string,object,substring,allocation,Java,String,Object,Substring,Allocation,我有一些问题想知道。我知道string在Java中是不可变的,因此在分配给现有string对象时,会创建一个新的string对象,而不是更改它 现在回答我的问题。假设我有以下代码: String a = "Hello World"; String b = "Hello World"; String res = a.substring(0,4) + b.substring(6,10); 第3行代码将创建多少个字符串对象?对子字符串的每次调用都会创建一个新的字符串对象吗?我上面的代码会生成3个新

我有一些问题想知道。我知道string在Java中是不可变的,因此在分配给现有string对象时,会创建一个新的string对象,而不是更改它

现在回答我的问题。假设我有以下代码:

String a = "Hello World";
String b = "Hello World";

String res = a.substring(0,4) + b.substring(6,10);
第3行代码将创建多少个字符串对象?对子字符串的每次调用都会创建一个新的字符串对象吗?我上面的代码会生成3个新的字符串对象吗


提前感谢

文字a是新创建的并保存在池中。文字b指的是a,它不会创建新的

第3行将创建3个新字符串,因为子字符串会创建一个新字符串,而“连接”每次都会创建新字符串

返回作为此字符串的子字符串的新字符串。子串 从指定的beginIndex开始,并延伸到 索引endIndex-1。因此,子字符串的长度是 endIndex beginIndex


Java中的字符串是不可变的。基本上这意味着,一旦创建了字符串对象,就不能修改/更改字符串的内容。因此,如果对字符串对象执行任何“似乎”更改字符串内容的操作,Java将创建一个新的字符串对象,并对新创建的字符串对象执行操作


基于此,上面的代码似乎创建了五个字符串对象—两个是通过声明创建的,两个是通过调用
子字符串创建的,最后一个是在连接两个片段之后创建的

然而,不变性导致了另一个有趣的结果。JVM在内部维护类似字符串池的东西,用于创建字符串文本。为了节省内存,JVM将尝试使用此池中的字符串对象。每当您创建一个新的字符串文本时,JVM将循环到池中,以查看是否可以使用任何现有字符串。如果有,JVM将简单地使用它并返回它

所以,从技术上讲,在Java7之前,JVM只会为您的整个代码创建一个string对象。即使您的
子字符串
调用也不会在池中创建新的字符串对象,它将使用现有的“Hello World”对象,但在这种情况下,例如,对于您第一次调用子字符串,它将只使用位置0到3的字符。从Java7开始,子字符串将不共享字符,而是创建一个新字符。因此,对象总数将为4-最后一个将通过两个子字符串的串联创建

编辑 要回答评论中的问题,请查看-

在Java编程语言中,与C不同,字符数组不是 字符串,并且字符串或字符数组均不以 “\u0000”(NUL字符)

字符串对象是不可变的,即其内容永远不会更改, 而char数组具有可变元素

类字符串中的tocharray方法返回一个字符数组 包含与字符串相同的字符序列。班级 StringBuffer在 人物


所以,不,字符数组在Java中不是不可变的,它们是可变的。

请解释为什么如Zim Zam所说是2而不是3?@ZiyaoWei编辑了我的答案。@Achtyajha有2
子字符串
调用+1串联。这种编辑不会改变它应该是3的事实,而这个答案是2。@ZiyaoWei我说2个新的带有子字符串,1个带有连接。从技术上讲,只创建了4个。代码中的字符串文本通过
String.intern()
解析,因此a和b在运行时都引用完全相同的字符串。感谢您的精彩回答。“两个由声明创建”?只有一个问题,字符数组在java中是可变的吗?java 7中最近实现的
String
在调用
substring()
时不再共享字符数组:它将创建一个新的字符数组来支持子字符串。