我是一名刚刚从 C++ 转到 Java 的学生。
在 Java 中,为 Strings 和 Char 数组定义单独的数据类型的主要原因是什么?两者有什么区别?
因为我只学过C++,所以到现在我都觉得它们是一回事。如果可能,请澄清。
我是一名刚刚从 C++ 转到 Java 的学生。
在 Java 中,为 Strings 和 Char 数组定义单独的数据类型的主要原因是什么?两者有什么区别?
因为我只学过C++,所以到现在我都觉得它们是一回事。如果可能,请澄清。
String
是不可变的。Char
数组不是。字符串是用下面的 char 数组实现的,但是每次您尝试修改它(例如使用连接、替换等)时,它都会为您提供一个新 String
对象。
因此,String
它表现为一个常量Char
数组,但带有某些语法糖,这也使它们更易于使用。例如,加法+
运算符也被重载为字符串连接运算符。
在 Java 中,String
是一个基本的系统类,它本质上包装了一个char[]
. 对于大多数用途来说,拥有一个完整的类比直接处理数组更可取,有几个原因:
String
s 是不可变的;一旦你引用了 some String
,你就知道它永远不会改变。String
s 提供了裸数组无法提供的有用方法,例如length()
,并且具有明确定义的比较语义。+
)。本质上,使用类将所需的行为和数据结构收集在同一个地方是一种很好的 OO 实践,并使用String
您希望对字符串执行的有用操作来包装一个字符数组。
存在语义差异。仅仅因为数据以相同的方式存储,这并不意味着它是相同的东西。Dates
并且Amounts
也可能具有相同的内部表示(long
对于时间戳或固定点现金),但它们并不相同。该char
数组也可以表示 16 位图像。
在面向对象中,根据对象是什么和可以做什么来建模对象是一种很好的做法,而不是根据它们内部存储数据的方式。这允许您封装数据(并使用 getter/setter 限制或控制(观察者支持)访问,甚至使内部表示不可变或可池化),并为您的对象提供适当的方法。
String 在 Java 中是不可变的,并存储在 String 池中。一旦创建它,它就会一直留在池中,直到垃圾收集。由于 String 是不可变的,因此日志记录密码是可读的字符串。它有更大的风险产生内存转储来查找密码。
其中 Char 数组是在堆中创建的,您可以使用一些虚拟值覆盖。
使用字符串对象的优点是它可以使用所有方法。例如:
stringExample1.equals(stringExample2);
String stringExample3 = stringExample1.replace(substring1, substring2);