繁体   English   中英

是什么使String不可变?

[英]What makes String immutable?

我知道String是不可变的,但是为什么呢?

哪个概念使字符串类不可变?

public class Mainclass
{
    public static void main(String[] args) 
    {
        String s = "Example";
        s.toUpperCase();
        System.out.println(s);
    }
}

结果:

Example

字符串是不可变的,因为无法更改其内部表示的内容,也无法获取对其内部表示的引用,并且不能将其子类化。 这意味着无论您对字符串进行什么操作,都无法更改其内容。

类似于toUpperCase()方法实际执行的操作是返回一个新的String,其内容与旧的String相同。 但是,新的String是一个单独的对象。 现在,对初始字符串的引用将不再指向新字符串。

如果要打印出toUpperCase()的结果,请按照以下步骤进行操作:

String s="Example";
String upperCase = s.toUpperCase();
System.out.println(upperCase);

编辑:引用与对象

Java中的变量是对对象的引用。 重现实质上是一个指示Java“您的对象在这里”的指针,指的是某个内存位置。 但是,引用和对象不是同一件事。 让我们看下面的例子

String s = "Test";
String a = s;
String s = "another test"

我在这里所做的一切都声明为一个名为s的引用,并将其指针设置为一个新创建的对象-在本例中为一个值为"Test"的String。 然后,我声明另一个引用a并将其设置为引用与s引用相同的对象。 注意,有两个引用,但只有一个对象。

从那里,我将引用s更改为指向另一个对象-在这种情况下,其字符串值为"another test" 尽管重用了引用,但这仍会创建一个新对象。 但是,引用a仍指向原始对象,该对象保持不变。 如果我们执行println(a) ,它将仍然打印"Test" 这是因为对象本身是不可变的。 指向它的所有内容将始终返回相同的值。 我可以使引用指向其他位置,但不能更改对象。

考虑一下变量,例如电话簿中的条目。 如果我为某人输入一个条目,并说他的姓氏为“ BOB”,后来又有人走过去并将其划掉并写下“ ALICE”,这不会突然改变Bob的性别或名字。 BOB不会自发变成驴友,因为有人重写了我的电话簿。 它仅更改我的电话簿中的值,而不更改实际的人。 我希望这个比喻能有所帮助。

任何不能被子类化并且不提供任何方式来修改其状态的类(例如,不提供任何设置器,保持其字段私有等)都是不可变的。 没有特别的魔法。

这些是使任何类型/类成为不可变的步骤

1)不要提供“ setter”方法-修改字段或字段引用的对象的方法。

2)将所有字段定为私有字段。

3)不允许成为子类,使类最终。

4)具有可变实例变量时要特别注意。

原因之一是安全性。 网络连接的参数是字符串类型。 它应该不容易修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM