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数组。

存在语义差异。 仅仅因为数据以相同的方式存储,这并不意味着它是一回事。 DatesAmounts也可能具有相同的内部表示(时间戳或固定点金额的long ),但它们不一样。 char数组也可以表示16位图像。

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

String在Java中是不可变的并存储在String池中。 一旦创建它,​​它将保留在池中直到垃圾收集。因为,String是不可变的,日志密码是可读字符串。它产生内存转储以查找密码的风险更大。

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

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

 stringExample1.equals(stringExample2); String stringExample3 = stringExample1.replace(substring1, substring2);