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