Char Array vs String:最好存储一组字母

时间:2009-04-29 10:33:33

标签: java performance coding-style constants

我需要存储一个代码的常量类4字母。我能做到:

static final String CODE_LETTERS = "TRWAG";

static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'};

之后,我可以通过两种方式获得其中一个角色:

final char codeLetter = CODE_LETTERS.charAt(index);

final char codeLetter = CODE_LETTERS[index];

最好的方法是什么?请记住纠正,表现等。

10 个答案:

答案 0 :(得分:8)

两者都不正确,但由于您将单独处理char,我个人会使用char []。也就是说,即使可衡量,这对性能的影响也可以忽略不计。

答案 1 :(得分:7)

在这种情况下,性能无关紧要。如果它确实应该是常数,则不能使用char[]方法。考虑:

public class Test
{
  static final char[] CODE_LETTERS = {'T', 'R', 'W', 'A', 'G'};

  public static void main(String[] args) throws Exception
  {
    System.out.println(CODE_LETTERS[0]); // T
    CODE_LETTERS[0] = 'x';
    System.out.println(CODE_LETTERS[0]); // x
  }
}

答案 2 :(得分:6)

除非您要连续几百万次获取角色,否则您无需担心性能。

答案 3 :(得分:5)

这几乎肯定是过早的优化。如果您需要将其提供给其他方法,那么使用字符数组在性能上节省的任何内容都可能会失去可读性,因为接受String而不是char[]更为规范。

答案 4 :(得分:5)

字符串是不可变的,char []不是。如果在类中将其定义为公共“常量”,则String是实常数。

例如,如果你有这个:

public class MyClass { 
    public static final char[] CODE_LETTERS = {'h', 'e', 'l', 'l', 'o'};
    ....
}

我可以偷偷摸摸地做到这一点:

MyClass.CODE_LETTERS[0] = 'Q';

Bam,我已经改变了你的“常数”的价值。

final关键字仅影响对数组的引用,它不适用于数组元素。我一直看到类似的错误Collections.unmodifiableList(),人们认为它保护了他们的列表,但客户端代码仍然可以访问和修改列表元素。

所以要回答你的问题,请使用字符串。

答案 5 :(得分:2)

String的含义确实匹配一组char。所以char[]作为一种实现,虽然没有意义设定,但不会增加String的额外含义。 OTOH,你可能会在String找到有用的方法。第三方面,java.util.Arrays也有一些有用的方法,如[binarySearch] [2]。

也许您想要做的是为一组char引入一个抽象,这可能会改变使用String作为最简单的可能有效的实现,char[]的线性扫描(快速,如果你不扫描很远),二进制搜索,位设置。稀疏位集,散列,泛洪滤波等

[2]:http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#binarySearch(char[],int,int,char)

答案 6 :(得分:1)

由于String使用char []来保存你的字母,所以真正的答案是char []更快。如果有疑问请查看源代码,那么String中没有任何神奇之处,它就像其他类一样使用像int和char []这样的原语。

你真的不应该关心像这样微不足道的事情。在程序中发生了很多事情,担心单个String是否比使用char数组更快。

答案 7 :(得分:1)

您将看到String和字符数组之间的性能差异的唯一时间是在探查器下,然后只是因为探查器会做错误的事情。一旦JVM确定它足够热以进行优化,现代JVMS(JDk 6+)将为两次访问生成相同的代码。

尽管回答你的问题;如果您使用的是Java 5,请使用枚举,如果您使用的是Java5之前的内容,请使用Java enumeration Pattern

它将使您的代码更具可读性,因为您不需要在某处跟踪偏移量,您只需使用枚举即可。此外,它更快,因为您将能够执行以下操作:


  final char codeLetter = enum.getCodeLetter(); 

答案 8 :(得分:1)

看起来您应该考虑使用枚举。 见Enum Types

答案 9 :(得分:0)

好笑,我昨天刚刚写了blog entry。你需要一个包含char []的专门类。我的Characters类是一种保存不可变字符集的轻量级方法,并为搜索等内容提供了高效的方法。它是开源的。