我读到的关于字符串的内容是在Java中创建字符串对象时它是不可变的。例如:
String s=new String();
s="abc";
s="xyz";
String s
是否不再指向"abc"
?
另一件事:s的大小是多少;
根据内存模型,String
对象是否类似于C中的char*
指针?
答案 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”。
一个重要的暗示,一个物体的记忆&引用一个对象需要不同的内存空间。
不可变:如果在实例化后无法更改其属性,则对象是不可变的。