为什么我们有String类,如果StringBuilder或StringBuffer可以做String的作用?

Abh*_*hek 2 c# java

我一直想知道为什么JAVA和C#有String(immutable&threadsafe)类,如果它们有StringBuilder(mutable¬ threadsafe)或StringBuffer(mutable&threadsafe)类.上课不是StringBuilder/ StringBuffer超集String吗?我的意思是,String如果我选择使用StringBuilder/ ,我为什么要使用课程StringBuffer

例如,而不是使用以下,

String str;
Run Code Online (Sandbox Code Playgroud)

为什么我不能总是使用以下?

StringBuilder strb; //or
StringBuffer strbu;
Run Code Online (Sandbox Code Playgroud)

简而言之,我的问题是,如果我StringStringBuffer类替换,我的代码将如何生效?此外,StringBuffer还增加了可变性的优势.

Jon*_*eet 16

我的意思是,如果我可以使用StringBuilder/StringBuffer,我为什么要使用String类?

正是因为它是不可改变的.不可变性有许多好处,主要是它使得更容易推理你的代码,而无需在任何地方创建数据副本"以防万一"某些东西决定改变价值.例如:

private readonly String name;

public Person(string name)
{
    if (string.IsNullOrEmpty(name)) // Or whatever
    {
        // Throw some exception
    }
    this.name = name;
}

// All the rest of the code can rely on name being a non-null 
// reference to a non-empty string. Nothing can mutate it, leaving
// evil reflection aside.
Run Code Online (Sandbox Code Playgroud)

不变性使分享变得简单而有效.这对多线程代码特别有用.它使得"修改"(即创建具有不同数据的新实例)更加痛苦,但在许多情况下这是绝对正常的,因为值在没有被修改的情况下通过系统.

不变性是特别为"简单"类型,例如字符串,日期,数字(有用BigDecimal,BigInteger等).它允许它们更容易在地图中使用,它允许简单的相等定义等.

  • @Abhishek:"并增加了可变性的优势" - 不,这是一个*劣势*.这意味着有人可以调用`Person p = new Person(builder);`使用*最初*通过我的验证标准的构建器 - 然后在之后修改它,而没有`Person`类在其中有任何发言权.为了避免这种情况,`Person`类需要复制经过验证的数据.可变性是一个巨大的*问题*,而不是一个优势.软件设计的关键是管理复杂性 - 而大规模的可变性是其中的一大敌人. (7认同)
  • @Abhishek:这是一种允许程序员管理复杂性的方法,使得更容易推理他们的代码.这远远超出了调试. (2认同)