Java String类实例是常量

时间:2011-11-01 10:58:57

标签: java string

这可能是一个简单的问题,但在现阶段不适合我。

我读过(我引用)“String类的所有实例都是常量,这意味着它们在创建后无法更改。但字符串可以替换。”

这令人困惑。什么意思是String变量不能改变但字符串可以?

任何人都可以给我一些代码示例,我们会尝试更改变量但是失败了吗?

欢呼帮助。

4 个答案:

答案 0 :(得分:3)

当你写:

String myString = "Hi!";

你做了两件事。第一个是定义名为 myString 的引用,第二个是创建String对象。 String对象包含“Hi!”,并且没有办法改变它。换句话说,没有set方法来更改字符串:

myString.set("another content");

但是,您可以创建一个新对象并将myString引用更改为指向它。重要的是你的 myString 不是字符串对象本身,而只是对它的引用。

myString = "New content";

当你这样做时,旧的String不再被任何变量指向,并且是垃圾收集的候选者。 String上的任何其他操作,如子字符串,大写等,都将创建一个新的String对象。

创建对象后无法更改的对象称为 Immutable 。在Java中,字符串不仅是不可变的,而且也是最终的,因此您不能将String子类化以更改其行为。

答案 1 :(得分:2)

字符串不是常量,它们是 不可变 ,这完全不同于其他东西。这意味着你不能修改字符串对象的内容,但你可以根据第一个来创建一个新内容,例如。

String hw = "hello world";
hw.ToUpperCase();

后者不会更改原始字符串hw,但会创建一个新字符串,其中所有字符都为大写。

答案 2 :(得分:1)

  

无法更改String变量但字符串可以是什么意思?

实际上,您引用的文字与此完全相反。

可以将String变量分配给(即替换)。例如:

String s = "first";
s = "second";

这会将对“first”的引用替换为对“second”的引用。

我不能给你一个改变String的内容/状态的合法例子,因为你不能这样做 *

*实际上,可以通过使用反射破坏String对象的封装来实现它。但这是一个非常非常糟糕的主意。

答案 3 :(得分:0)

问题的答案是这样的:在Java中string literalimmutable object

正如其他程序员所说 - 你可以更改引用,是的,但是你可能永远不会更改不可变对象(保证不能更改它)。