【问题标题】:Java mutable "String" with efficient per-char operations: toCharArray() or getBytes()?Java 可变“字符串”,具有高效的每个字符操作:toCharArray() 或 getBytes()?
【发布时间】:2014-01-21 09:35:16
【问题描述】:

我想在 java 字符串中进行一些有效的每个字符替换,这是更好的方法,可以使用 .toCharArray().getBytes() 吗?

示例代码:

// big loop {
    String s = "..###.##...#";
    char[] c = s.toCharArray();
    c[4] = '$';
    c[8] = 'A';
    // etc
// }

如果这两种方法之间存在一些差异,或者如果其中一种方法优于另一种方法,我会很高兴听到。

【问题讨论】:

  • 看看类似的帖子stackoverflow.com/questions/8894258/…(迭代字符串中所有字符的最快方法)
  • @BrianRoach 正在寻找效率(基于数组的操作),而不是构建者
  • @NeerajKrishna 正在寻找 modify 字符串,而不仅仅是迭代,所以这个问题不一样。
  • @vikingsteve 忽略你不太可能需要这样的“效率”...... StringBuilderchar[] 的包装器,并且完全按照您的描述想要做,提供方法。它有一个构造函数,您可以将现有的String 传递给。

标签: java arrays string character mutable


【解决方案1】:

toCharArray 更好。这样你就不必处理编码。至少在正常情况下不会(Unicode BMP 之外的字符除外,它们被编码为两个代理字符)。基本上,如果你不用处理中文文本,那都不是问题。

Stringchar 数组的转换比toBytes() 更快:它基本上是一个数组副本,没有字符编码问题。在内部,String 包含 char[],并且(至少对于 Java 7 和更高版本),仅此而已。

char 数组返回String 也比从byte 数组返回更快,因为不需要字符编码。

【讨论】:

  • 谢谢托马斯,这正是我要找的信息。
【解决方案2】:

如果要比较字符值,请使用toCharArray()

如果要比较 UTF-8 编码的二进制值 字符,使用getBytes()

toCharArray 通常比toByteArray 快​​,但通常比charAt 慢。

【讨论】:

    【解决方案3】:

    使用StringBuilder,就像一个可变字符串:

    String s = "..###.##...#";
    StringBuilder sb = new StringBuilder(s);
    sb.setCharAt(4, '$');
    

    您可以使用许多其他方法来更改内容。完成后:

    s = sb.toString();
    

    【讨论】:

    • s/StringBuffer/StringBuilder/ ...除非你真的需要线程安全
    • 我正在寻找效率,所以数组比缓冲区更适合我。我应该补充一点,我的字符串是固定长度的。
    • 你对一个类的“效率”做出假设,却不知道它实际上是如何工作的。想猜测一下 inside StringBuilder 是什么?
    • @JonSkeet 我发誓我在考虑 StringBuilder ......当然应该是这样。欢呼
    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2015-03-08
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多