【问题标题】:What makes String immutable?是什么让 String 不可变?
【发布时间】:2015-04-13 19:05:44
【问题描述】:

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

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

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

结果:

Example

【问题讨论】:

标签: java string class immutability


【解决方案1】:

String 是不可变的,因为无法更改其内部表示的内容,无法获得对其内部表示的引用,并且不能被子类化。这意味着无论您对字符串做什么,都无法更改其内容。

toUpperCase() 这样的方法实际上是返回一个新的字符串,它的内容与旧的字符串相同。但是,新的 String 是一个单独的对象。对初始字符串的引用现在不会指向新字符串。

如果您想打印出toUpperCase() 的结果,请执行以下操作:

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

编辑:引用与对象

Java 中的变量是对对象的引用。 recerence 本质上是一个指针,它告诉 Java “你的对象在这里”,指的是某个内存位置。但是引用和对象不是一回事。让我们看下面的例子

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

我在这里所做的是声明一个名为s 的引用,并将其指针设置为一个新创建的对象——在本例中是一个值为"Test" 的字符串。然后我声明另一个引用 a 并将其设置为引用 s 引用的同一对象。请注意,有两个引用,但只有一个对象。

从那里我将引用 s 更改为指向不同的对象 - 在本例中为值为 "another test" 的字符串。尽管引用被重用,但这会创建一个新对象。但是,引用a 仍然指向原始对象,该对象保持不变。如果我们这样做println(a),它仍然会打印"Test"。这是因为对象本身是不可变的。任何指向它的东西都会返回相同的值。我可以将引用指向其他地方,但不能更改对象。

想想电话簿中的条目等变量。如果我为某人输入一个条目并说他的姓氏是“BOB”,然后有人过来并把它划掉并写下“ALICE”,这不会突然改变 Bob 的性别或他的名字。 BOB 不会因为有人改写了我的电话簿而自发地变成了 ALICE。它只是改变了我电话簿中的值,而不是实际的人。我希望这个比喻有所帮助。

【讨论】:

  • 字符串是不可变的,但下面的例子改变了值怎么可能?字符串 s="示例"; s="样品"; System.out.println(s);结果:样本
  • @Albertkaruna 我不知道你的评论应该意味着什么。请澄清您的评论,以便我能够连贯地回应它。
  • @Albertkaruna 该对象仍然是不可变的,您只需让s 指向不同的引用。
  • 现在我明白了。但是字符串主要用于安全目的,现在我更改了对其他对象的引用。我怎样才能得到我的原始对象(“示例对象”)?
  • @Albertkaruna 您需要了解值和变量(对象和引用)之间的区别。如果对象的状态不能改变,那么我们说它是不可变的,如果变量不能被重新分配给不同的对象,那就意味着它是final。仅仅因为您可以为变量分配新值并不意味着旧值的状态已经改变。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这些是您可以将任何类型/类设为不可变的步骤

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

    2) 将所有字段设为最终字段和私有字段。

    3) 不允许成为子类,将类设为 final。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 2016-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 2010-09-21
        相关资源
        最近更新 更多