Java中的字符串和字符数组

10

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

在Java中,为什么要定义单独的字符串和字符数组数据类型?它们之间有什么区别?

由于我只学过C++,所以一直以来我认为它们是同一种东西。如果可能的话,请澄清一下。


请参考 https://dev59.com/nXA85IYBdhLWcg3wCe9Z。 - Radiodef
6个回答

17

String是不可变的,而Char数组则不是。字符串是由一个字符数组实现的,但每次你试图修改它(例如通过拼接、替换等操作),它都会给你一个新的String对象。

因此,String行为类似于常量Char数组,但还带有特定的语法糖,使它们非常易于使用。例如,加号+运算符被重载为字符串拼接运算符。


谢谢您的回复。我还有一个疑问 - 我可以像使用char[]一样使用String对象吗?例如,如果我想在任何时候访问随机元素或在任何索引处存储char,是否可以在String中实现? - iluvthee07
1
Ravi应该得到他的答案被接受的回报。为了更详细地阐述他的答案,编程时最常用的数据结构之一是String,因为计算机系统与人类交互的内在需求。Java的设计者们认识到这一点,并将char[]封装成一个称为String的特殊对象,以使与字符串的交互更加方便。 - StormeHawke
1
@iluvthee07 - 是的。对于第一个情况,您将需要使用string.charAt(index)。对于第二个情况,您需要使用子字符串进行操作,或者使用string.toCharArray()并进行处理。有关您可以使用String进行哪些操作的更多详细信息,我建议查看此处的String javadoc: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html - StormeHawke

3
在Java中,String是一个基本的系统类,它本质上包装了一个char[]。有几个原因,使得在大多数情况下使用完整的类比直接处理数组更为可取:
  • String是不可变的;一旦你有了对某个String的引用,你就知道它永远不会改变。
  • String提供了一些有用的方法,裸数组无法提供,例如length(),并且具有清晰定义的比较语义。
  • 你永远不必自己处理字符串终止符。
  • Java为支持字符串连接(使用+)而有一个特殊的例外规则,称之为“无运算符重载”。

从本质上讲,使用类将所需的行为和数据结构收集到同一位置是良好的面向对象编程实践,并且String包装了一个字符数组,并提供了你想要在字符串上执行的有用操作。


谢谢您的回复。我还有一个疑问 - 我可以像使用char[]一样使用String对象吗?例如,如果我想在任何时候访问随机元素或在任何索引处存储char,是否可以在String中实现? - iluvthee07
Javadoc 值得一读。String 是不可变的,意味着创建后不能修改。charAt 将提供对后备数组中单个字符的只读访问。StringBuilder(以及早期、较慢的 StringBuffer)围绕一个 char[] 提供了读写语义,可以在构建完成后转换为只读 String - chrylis -cautiouslyoptimistic-

2

String是Java中的一个类,提供了许多方法,也是一个对象。

一个String对象是不可变的。

内部值是一个char数组。


2

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

在面向对象编程中,按照对象的实际属性建模是最佳实践,并且不应该根据对象内部数据存储方式进行建模。这样可以允许您对数据进行封装(使用getter/setter限制或控制访问权限,甚至使内部表现形式不可变或可池化),并为对象提供适当的方法。


1
Java中的String是不可变的,并存储在String池中。一旦创建,它会一直留在池中,直到被垃圾收集。由于String是不可变的,记录密码时作为可读字符串存在更大的风险,可能会产生内存转储以查找密码。
相反,Char数组在堆中创建,您可以用一些虚假值覆盖它。

并非所有的字符串都存储在池中。只有字符串字面值、使用intern()方法创建的字符串和一些其他情况下的字符串才会存储在池中。此外,存储在池中的字符串不会进行垃圾回收。 - Radiodef

0
使用字符串对象的优点在于它拥有许多可用的方法。 例如:
stringExample1.equals(stringExample2);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接