Java中字符串为什么需要作为对象?

3
我知道Java中的字符串不像int或float那样是普通变量,而是对象。但我的问题是为什么需要这样做?为什么字符串不能像字符序列一样成为普通变量?是什么原因促使Java设计者将字符串定义为对象?

2
这并非必需,但很有用。String 包含关于其状态的信息,并将方法组合在一起,例如 String.lengthString.containsString.hashCode 等等。值得注意的是,你也可以使用字符数组,但会失去许多 String 的实用功能。 - George
你可以在以下链接中找到关于Java字符串的讨论:https://dev59.com/NHI-5IYBdhLWcg3wHUhB - Ravi
@George,正是我想知道的。我们可以使用char数组来传统地创建字符串,但这样我们就无法使用预定义的方法来计算长度,在某些位置给出字符等,对吧? - thisisbhavin
从实际角度来看,是的。还有其他次要原因,通过使用字符串内部池来优化String,以便进行内存优化,同时通过String对象是不可变/不变的方式进行性能优化。 - George
1
@Allan,正是你的评论帮了我! - thisisbhavin
显示剩余2条评论
2个回答

4
我认为Java中存在许多与整数/字节/双精度等类型的包装类存在原因相近的原因,其中包括:
  • 允许null
  • 将其包含在Collection
  • 作为Object一起具有泛型和多态的强大功能,与其他对象一样使用
  • 具有处理字符串对象的String类的所有精彩方法
  • String池可正常工作并保存内存(如果字符串在堆栈而不是堆中,则会很困难)
  • 等等。
链接:

4
主要区别在于String和其他原始类型(例如int)的值需要根据字符串长度变化来使用可变内存。这使得将它们保存在堆栈上变得困难。
另一方面,我们有字符串连接运算符s1 + s2和字符串字面量"abc",这使它与任何其他对象不同。

是的,但是实际上由于字符串是不可变的,它们在创建时大小就已经固定了,因此它们也可以像字符数组一样保存在堆栈中。 - Allan
1
@Allan 字符串变量不是不可变的,例如 s="a"; s="abc"。你会为 s 分配多少内存?而字符数组也不在堆栈上。 - Henry
字符串变量是不可变的:s 不是一个对象,而是一个指向对象的引用!因此,您可以更改它并使其指向一个新的字符串对象 abc。但是我同意您关于内存分配的观点,因此在使用 char 数组时,在 C++ 中所做的工作是具有 MAX 固定大小,并使用 \0 来查找 char 数组的实际大小,如果您想要在堆栈上使用它们或者您想要动态分配,则需要选择堆。 - Allan
1
@Allan,字符串对象是不可变的,而类型为String的变量可以更改(无论它是否包含对字符串对象或假设的原始字符串值的引用)。但我认为我们的意思是一样的。 - Henry
没错,不是字符串变量,而是字符串对象!:-) 无论如何,祝您周日愉快 :-) - Allan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接