我在做算法题的时候,发现很多人喜欢先把一个字符串转成charArray再做运算?
我不明白我们为什么要那样做?我的意思是,我可以使用 string.charAt()
,为什么要使用 string.toCharArray()
然后使用 charArray[i]
?它是一样的,甚至 charArray
使用 O(n) 内存。
谁能给我解释一下?
最佳答案
人们更喜欢 char[]
而不是 String
和 StringBuffer
有几个原因:
String
是不可变的。这意味着,如果您想在不使用任何实用程序类的情况下操作String
,您将经常复制String
,这会导致代码效率极低。访问
char[]
中的字符比使用charAt
快得多(尽管转换String
需要一些时间到char[]
,在优化时也应考虑):class Test{ public static void main(String[] args){ String s = "a"; char[] c = new char[]{'a'}; StringBuffer buffer = new StringBuffer("a"); char x; long time = System.nanoTime(); for(int i = 0 ; i < 1000 ; i++) x = s.charAt(0); time = System.nanoTime() - time; System.out.println("string: " + time); time = System.nanoTime(); for(int i = 0 ; i < 1000 ; i++) x = c[0]; time = System.nanoTime() - time; System.out.println("[]: " + time); time = System.nanoTime(); for(int i = 0 ; i < 1000 ; i++) x = buffer.charAt(0); time = System.nanoTime() - time; System.out.println("buffer: " + time); } }
运行这个简单的类会产生以下输出(在我的机器上,使用 javaSE 1.8.0 build b132):
string: 37895
[]: 18948
buffer: 85659很明显,通过
char[]
访问比使用String
或StringBuilder
访问要快得多。使用对象来操作单个字符将导致代码中塞满了
charAt()
和setCharAt()
,这可能被认为是难看的代码。安全性:
String
相当不安全,如果代码处理敏感数据,因为不可变的String
将存储在内存中。这意味着在 GC 将其从内存中删除之前,包含敏感数据的String
是可以访问的。另一方面,char[]
可以随时简单地覆盖,从而从内存中删除敏感数据。
关于java - 为什么我们在对字符串进行操作时将string转换为charArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32640593/