Java中的字符串和字符数组 我是一个刚从C++到java的学生。

Java中的字符串和字符数组 我是一个刚从C++到java的学生。,java,string,char,primitive-types,Java,String,Char,Primitive Types,在Java中,为字符串和字符数组定义单独数据类型的主要原因是什么?两者之间有什么区别? 因为我只学习C++,到现在我还以为它们是一样的东西。如果可能,请澄清 是Java中的一个类,提供方法,也是一个对象 字符串对象也是不可变的 内部值是一个字符数组。String是不可变的字符数组不可用。字符串是用下面的字符数组实现的,但每次尝试修改它(如使用串联、替换等)时,它都会给您一个新的string对象 因此,String表现为一个常量Char数组,但它附带了一些语法上的糖分,这也使得它们更易于使用。例如

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

<>因为我只学习C++,到现在我还以为它们是一样的东西。如果可能,请澄清

是Java中的一个类,提供方法,也是一个对象

字符串对象也是不可变的


内部值是一个字符数组。

String
是不可变的<代码>字符数组不可用。字符串是用下面的字符数组实现的,但每次尝试修改它(如使用串联、替换等)时,它都会给您一个新的
string
对象


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

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

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

本质上,使用类在同一位置收集所需的行为和数据结构是一种良好的OO实践,
String
用您想要对字符串执行的有用操作来包装一个字符数组。

使用String对象的优势在于它可以使用的所有方法。 例如:

stringExample1.equals(stringExample2);

String stringExample3 = stringExample1.replace(substring1, substring2);
这是语义上的差异。仅仅因为数据是以相同的方式存储的,这并不意味着它是相同的东西<代码>日期和金额也可能具有相同的内部表示形式(
long
表示时间戳或固定金额的现金),但它们不相同。
char
数组也可以表示16位图像


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

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


其中as Char数组是在堆中创建的,您可以使用一些伪值进行覆盖。

感谢您的响应。我还有一个疑问-我可以像char[]一样使用String对象吗?如果我想在任意点访问一个随机元素,或者在任意索引处存储一个字符,那么可以在字符串中这样做吗?这本书值得一读<代码>字符串是不可变的,这意味着一旦创建它就不能修改
charAt
将提供对支持数组中单个字符的只读访问
StringBuilder
(以及较旧、速度较慢的
StringBuffer
)提供了有关
char[]
的读写语义,一旦构建完成,就可以将其转换为只读
字符串。感谢您的响应。我还有一个疑问-我可以像char[]一样使用String对象吗?如果我想在任意点访问一个随机元素,或者在任意索引处存储一个字符,那么可以在字符串中这样做吗?拉维的答案应该被接受。为了进一步说明他的答案,编程时使用的最常见的数据结构之一是
String
s,因为计算机系统与人类交互的内在需要。Java的设计者认识到了这一点,并将char[]包装到一个名为String的特殊对象中,以使与字符串的交互更加频繁convenient@iluvthee07-是的。对于第一种情况,您需要
string.charAt(index)
。对于第二种情况,您需要使用子字符串,或者使用
string.tocharray()
并使用它。有关如何使用
String
s的更多详细信息,我建议您在此处查看
String
javadoc:并非所有字符串都存储在池中。池中只存储字符串文本、使用
intern()
方法创建的字符串以及其他一些案例。此外,存储在池中的字符串不会被垃圾收集。另请参阅