【问题标题】:String and Character Array in JavaJava中的字符串和字符数组
【发布时间】:2013-08-22 17:10:16
【问题描述】:

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

在 Java 中,为 Strings 和 Char 数组定义不同数据类型的主要原因是什么?两者有什么区别?

因为我只学过C++,所以到现在我都觉得它们是一回事。如果可能,请澄清。

【问题讨论】:

标签: java string char primitive-types


【解决方案1】:

String 是不可变的。 Char 数组不是。字符串是用下面的 char 数组实现的,但是每次您尝试修改它(例如使用连接、替换等)时,它都会为您提供一个 new String 对象。

因此,String 的行为类似于常量 Char 数组,但带有某些语法糖,这也使它们更易于使用。例如,加法+ 运算符也已重载作为字符串连接运算符。

【讨论】:

  • 感谢您的回复。我还有一个疑问 - 我可以像 char[] 一样使用 String 对象吗?就像我想在任何时候访问一个随机元素或在任何索引处存储一个字符一样,是否可以在字符串中这样做?
  • Ravi 的回答值得被接受。为了扩展他的答案,您在编程时使用的最常见的数据结构之一是Strings,因为计算机系统与人类交互的内在需求。 Java 的设计者意识到了这一点,并将 char[] 包装到一个特殊的 Object 中,称为 String,以便与 String 交互更方便
  • @iluvthee07 - 是的。对于第一种情况,您需要string.charAt(index)。其次,您需要使用子字符串,或者使用string.toCharArray() 并使用它。有关您可以使用Strings 做什么的更多详细信息,我建议您在此处查看String javadoc:docs.oracle.com/javase/6/docs/api/java/lang/String.html
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回复。我还有一个疑问 - 我可以像 char[] 一样使用 String 对象吗?就像我想在任何时候访问一个随机元素或在任何索引处存储一个字符一样,是否可以在字符串中这样做?
  • The Javadoc 值得一读。 String 是不可变的,这意味着它一旦创建就无法修改。 charAt 将提供对支持数组中单个字符的只读访问。 StringBuilder(以及较旧的、较慢的 StringBuffer)围绕 char[] 提供读写语义,一旦您完成构建,就可以将其转换为只读的 String
【解决方案3】:

String 是 Java 中的一个类,它为您提供方法,也是一个对象。

字符串对象也是不可变的。

内部值是一个字符数组。

【讨论】:

    【解决方案4】:

    有一个语义的区别。仅仅因为数据以相同的方式存储,这并不意味着它是相同的东西。 DatesAmounts 也可能具有相同的内部表示(long 用于时间戳或定点现金),但它们并不相同。 char 数组也可以表示 16 位图像。

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

    【讨论】:

      【解决方案5】:

      String 在 Java 中是不可变的,并且存储在 String 池中。一旦创建它,​​它就会一直留在池中,直到垃圾收集。由于 String 是不可变的,因此日志记录密码是可读的字符串。它有更大的风险产生内存转储以找到密码。

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

      【讨论】:

      • 并非所有字符串都存储在池中。只有字符串字面量、使用intern() 方法创建的字符串以及其他一些情况存储在池中。此外,存储在池中的字符串不会被垃圾回收。
      【解决方案6】:

      使用字符串对象的好处是它可以使用所有方法。 例如:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-07
        • 2018-10-11
        • 1970-01-01
        • 2014-04-18
        • 2013-04-15
        • 2014-12-15
        • 2018-08-10
        • 2012-04-20
        相关资源
        最近更新 更多