
[英]What makes immutable objects to be published without safe publication techniques?
[英]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.