我需要存储一个代码的常量类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];
最好的方法是什么?请记住纠正,表现等。
答案 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类是一种保存不可变字符集的轻量级方法,并为搜索等内容提供了高效的方法。它是开源的。