9

我是一名刚刚从 C++ 转到 Java 的学生。

在 Java 中,为 Strings 和 Char 数组定义单独的数据类型的主要原因是什么?两者有什么区别?

因为我只学过C++,所以到现在我都觉得它们是一回事。如果可能,请澄清。

4

6 回答 6

17

String是不可变的。Char数组不是。字符串是用下面的 char 数组实现的,但是每次您尝试修改它(例如使用连接、替换等)时,它都会为您提供一个 String对象。

因此,String它表现为一个常量Char数组,但带有某些语法糖,这也使它们更易于使用。例如,加法+运算符也被重载为字符串连接运算符。

于 2013-08-20T15:12:20.570 回答
3

在 Java 中,String是一个基本的系统类,它本质上包装了一个char[]. 对于大多数用途来说,拥有一个完整的类比直接处理数组更可取,有几个原因:

  • Strings 是不可变的;一旦你引用了 some String,你就知道它永远不会改变。
  • Strings 提供了裸数组无法提供的有用方法,例如length(),并且具有明确定义的比较语义。
  • 您永远不必自己处理字符串终止。
  • Java 对“禁止运算符重载”的规则有一个特殊的例外,以支持字符串连接(with +)。

本质上,使用类将所需的行为和数据结构收集在同一个地方是一种很好的 OO 实践,并使用String您希望对字符串执行的有用操作来包装一个字符数组。

于 2013-08-20T15:15:52.147 回答
2

String是 Java 中的一个类,为您提供方法,也是一个对象。

字符串对象也是不可变的。

内部值是一个字符数组。

于 2013-08-20T15:11:39.920 回答
2

存在语义差异。仅仅因为数据以相同的方式存储,这并不意味着它是相同的东西。Dates并且Amounts也可能具有相同的内部表示(long对于时间戳或固定点现金),但它们并不相同。该char数组也可以表示 16 位图像。

在面向对象中,根据对象是什么和可以做什么来建模对象是一种很好的做法,而不是根据它们内部存储数据的方式。这允许您封装数据(并使用 getter/setter 限制或控制(观察者支持)访问,甚至使内部表示不可变或可池化),并为您的对象提供适当的方法

于 2013-08-20T15:25:00.483 回答
1

String 在 Java 中是不可变的,并存储在 String 池中。一旦创建它,​​它就会一直留在池中,直到垃圾收集。由于 String 是不可变的,因此日志记录密码是可读的字符串。它有更大的风险产生内存转储来查找密码。

其中 Char 数组是在堆中创建的,您可以使用一些虚拟值覆盖。

于 2017-11-21T13:13:44.937 回答
0

使用字符串对象的优点是它可以使用所有方法。例如:

stringExample1.equals(stringExample2);

String stringExample3 = stringExample1.replace(substring1, substring2);
于 2013-08-20T15:17:56.280 回答