【问题标题】:Performance comparison of charAt() method of String vs StringBuilder in JavaJava中String与StringBuilder的charAt()方法的性能比较
【发布时间】:2021-09-03 10:11:29
【问题描述】:

我知道StringBuilder 在涉及需要某种突变的操作时比String 快。但是,如果我只想访问特定字符而不需要其他操作,那么两者的charAt() 方法之间是否存在性能差异?

作为一个简单的例子,如果我需要打印字符串的备用字符,从第一个字符开始,下面给出的两种方法中是否有任何首选方法?

// 1
String dummyStr = "fhweyxnqwiynfgHINYUIYIOhuiw12341dfs";
for (int i = 0; i < dummyStr.length(); i += 2) {
    System.out.print(dummyStr.charAt(i));
}

// 2
StringBuilder dummySb = new StringBuilder(dummyStr);
for (int i = 0; i < dummySb.length(); i += 2) {
    System.out.print(dummySb.charAt(i));
}

此外,以这种方式(使用char[])这样做有什么好处/缺点吗?

// 3
char[] dummyArr = dummyStr.toCharArray();
for (int i = 0; i < dummyArr.length; i += 2) {
    System.out.print(dummyArr[i]);
}

请注意:
对于这个问题,我只关心时间方面的性能,而不关心使用的额外内存。此外,System.out.print() 仅用于本示例的占位符操作。

【问题讨论】:

  • 这取决于您的数据,所以如果您真的想知道是否有任何差异,请运行您自己的基准测试(也就是自己做research) 使用与您要检查的场景匹配的实际数据。但是,即使您可以衡量差异,我敢打赌,考虑到可能发生的所有其他情况,它对代码的整体性能没有任何影响。这是过早优化的一个例子,你应该继续前进,把时间花在真正重要的事情上。

标签: java string time stringbuilder


【解决方案1】:

StringStringBuilder 都由数组支持,charAt() 获取指定索引处的值。

由于String 是不可变的,它必须在返回数组之前进行防御性复制。所以它有一些额外的开销。但是imo,这只会是非常大的字符串或将许多字符串重复转换为数组的问题。这完全取决于您如何使用它。

【讨论】:

  • 这是否意味着所有 3 种方法都基本相同?另外,如果charAt() 被多次调用(无论是在循环中,还是在程序中的不同点),是每次都创建一个新数组,还是编译器对其进行优化或以某种方式缓存该数组?
  • @KabirKanhaArora 对charAt 的调用根本不会创建一个新数组,您为什么认为它会创建一个新数组(仅供参考,源代码包含在Java 中,因此您可以查看实现的内容)确实如此)。
  • 是每次都创建一个新数组,还是编译器优化它或以某种方式缓存数组? 为什么不从同一个字符串创建两个数组,看看引用是否比较?那应该回答你的问题。
猜你喜欢
  • 2017-02-26
  • 2019-02-20
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2011-05-09
  • 2015-10-22
  • 2013-12-19
  • 2013-12-24
相关资源
最近更新 更多