【发布时间】:2013-08-22 17:10:16
【问题描述】:
我是一名刚从 C++ 转到 Java 的学生。
在 Java 中,为 Strings 和 Char 数组定义不同数据类型的主要原因是什么?两者有什么区别?
因为我只学过C++,所以到现在我都觉得它们是一回事。如果可能,请澄清。
【问题讨论】:
标签: java string char primitive-types
我是一名刚从 C++ 转到 Java 的学生。
在 Java 中,为 Strings 和 Char 数组定义不同数据类型的主要原因是什么?两者有什么区别?
因为我只学过C++,所以到现在我都觉得它们是一回事。如果可能,请澄清。
【问题讨论】:
标签: java string char primitive-types
String 是不可变的。 Char 数组不是。字符串是用下面的 char 数组实现的,但是每次您尝试修改它(例如使用连接、替换等)时,它都会为您提供一个 new String 对象。
因此,String 的行为类似于常量 Char 数组,但带有某些语法糖,这也使它们更易于使用。例如,加法+ 运算符也已重载作为字符串连接运算符。
【讨论】:
Strings,因为计算机系统与人类交互的内在需求。 Java 的设计者意识到了这一点,并将 char[] 包装到一个特殊的 Object 中,称为 String,以便与 String 交互更方便
string.charAt(index)。其次,您需要使用子字符串,或者使用string.toCharArray() 并使用它。有关您可以使用Strings 做什么的更多详细信息,我建议您在此处查看String javadoc:docs.oracle.com/javase/6/docs/api/java/lang/String.html
在 Java 中,String 是一个基本的系统类,它本质上包装了一个 char[]。对于大多数用途来说,拥有一个完整的类比直接处理数组更可取的原因有几个:
Strings 是不可变的;一旦你引用了一些String,你就知道它永远不会改变。Strings 提供了裸数组无法提供的有用方法,例如 length(),并且具有明确定义的比较语义。+)。本质上,使用类在同一个地方收集所需的行为和数据结构是一种很好的 OO 实践,String 用您想要对字符串执行的有用操作包装了一个字符数组。
【讨论】:
String 是不可变的,这意味着它一旦创建就无法修改。 charAt 将提供对支持数组中单个字符的只读访问。 StringBuilder(以及较旧的、较慢的 StringBuffer)围绕 char[] 提供读写语义,一旦您完成构建,就可以将其转换为只读的 String。
【讨论】:
有一个语义的区别。仅仅因为数据以相同的方式存储,这并不意味着它是相同的东西。 Dates 和 Amounts 也可能具有相同的内部表示(long 用于时间戳或定点现金),但它们并不相同。 char 数组也可以表示 16 位图像。
在面向对象中,根据对象是什么和可以做什么来建模对象,而不是根据对象内部存储数据的方式,这是一种很好的做法。这允许您封装数据(并使用 getter/setter 限制或控制(观察者支持)访问,甚至使内部表示不可变或可池化),并提供适当的方法 为您的对象。
【讨论】:
String 在 Java 中是不可变的,并且存储在 String 池中。一旦创建它,它就会一直留在池中,直到垃圾收集。由于 String 是不可变的,因此日志记录密码是可读的字符串。它有更大的风险产生内存转储以找到密码。
其中 Char 数组是在堆中创建的,您可以用一些虚拟值覆盖。
【讨论】:
intern() 方法创建的字符串以及其他一些情况存储在池中。此外,存储在池中的字符串不会被垃圾回收。
使用字符串对象的好处是它可以使用所有方法。 例如:
stringExample1.equals(stringExample2);
String stringExample3 = stringExample1.replace(substring1, substring2);
【讨论】: