字符串记忆模型

时间:2011-07-18 16:33:01

标签: java

我读到的关于字符串的内容是在Java中创建字符串对象时它是不可变的。例如:

String s=new String();
s="abc";
s="xyz";

String s是否不再指向"abc"

另一件事:s的大小是多少; 根据内存模型,String对象是否类似于C中的char*指针?

3 个答案:

答案 0 :(得分:2)

不,Java String在C中不是char *。如果你在java中寻找类似的char []是这样的。

String是一个包装char数组并提供许多功能的类。此外,它是不可变的,即你不能改变它的内容。您只能创建另一个字符串。另外String是final,所以你不能将它子类化。

String是特殊类。只有字符串支持运算符(+)。所有其他类根本不支持运算符,甚至是原始包装器(Integer,Double等)。代码“foobar”中存在字符串常量调用java.lang.String构造函数。

答案 1 :(得分:1)

是的,Java中的字符串是不可变的。也就是说,字符串变量指向的内容在初始化后无法更改。使用您自己的示例来说明:

String s=new String();

在上面的代码中,您创建了一个新的空字符串并将其分配给 s 变量。

s="abc";

您已创建另一个新字符串,这次是内容“abc”。您已将变量 s 设置为指向此新String。您之前的空字符串将在以后的某个时刻收集垃圾。

s="xyz";

与上述类似。您已创建另一个新字符串,其内容为“xyz”,并将变量 s 设置为指向它。之前的“abc”字符串将在以后的某个时刻收集垃圾。

请注意,您实际上没有将空字符串修改为“abc”,或修改“abc”字符串以变为“xyz” 即可。串联,转换大小写或以其他方式修改String的String上的所有操作实际上返回带有函数结果的新String。举例说明:

String s = new String("Hello");
String b = s.concat(" World");
System.out.println(s); // This will NOT produce 'Hello World'

System.out.println(b); // Whereas, this will

至于问题的最后一部分,您可以使用 length() 函数来确定字符串的“大小”。请注意,这是基于Unicode编码,可能不是您期望的长度如ANSI C中所定义。

答案 2 :(得分:0)

Que:String不再指向“abc”吗?

答:不,它指的是关于你的代码的“xyz”。

阙:s的大小是多少?

Ans:它有点棘手,“s”是对“xyz”的引用。对于引用对象的任何声明变量都是如此。所以最好说,s指的是“xyz”。

一个重要的暗示,一个物体的记忆&引用一个对象需要不同的内存空间。

不可变:如果在实例化后无法更改其属性,则对象是不可变的。