在Java中,字符数组是否比字符串更好?

Is there any scenario where character array is better than Strings in Java

我觉得字符串可以在所有场景中取代字符数组。即使考虑字符串的不可变特性,适当范围内的字符串声明和Java的垃圾收集功能也可以帮助我们避免任何内存泄漏。我想知道在Java中是否有字符数组被用来代替字符串的任何角落情况。


在存储安全敏感数据方面,字符数组比普通字符串稍有优势。在这方面有很多资源,例如这个问题:为什么对于密码,char[]比string更受欢迎?(乔恩·斯基特亲自回答)。

一般来说,它归结为两个方面:

  • 你对String在内存中的停留时间影响很小。因此,您可能会通过内存转储泄漏敏感数据。
  • 在应用程序日志中意外泄漏敏感数据,因为纯文本更可能是纯字符串。

更多阅读:

  • 为什么我们在char数组而不是字符串中从控制台读取密码?
  • https://www.codebyamir.com/blog/use-character-array-to-store-sensitive-data-java
  • https://www.geeksforgeks.org/use-char-array-string-storeing-passwords-java/amp/
  • https://www.baeldung.com/java-storeing-passwords/密码
  • https://javarevisited.blogspot.com/2012/03/why-character-array-is-better-than.html
  • https://javainsider.wordpress.com/2012/12/10/character-array-is-better-than-string-for-storeing-password-in-java/amp/

除了JDK核心API中使用char[]的方法外,您不必再深入研究其他方法。

比如这个(Java.IO。Reader):

1
2
 public int read(char[] cbuf)
     throws IOException

Reads characters into an array. This method will block until some input is available, an I/O error occurs, or the end of the stream is reached.

Parameters:

  • cbuf - Destination buffer
  • Returns:
    The number of characters read, or -1 if the end of the stream has been reached
  • Throws:
    IOException - If an I/O error occurs

他们不返回String,而是要求您传入一个char[]作为缓冲区,将结果写入。原因是效率。


字符串是类,而不是内置类型。它很可能通过在下面使用char数组来完成它的工作,但这并不能保证。"我们不在乎它是如何实现的。它有一些对字符串有意义的方法,比如比较字符串。比较数组?嗯。做这件事真的不太有意义。你可以检查它们是否相等,但小于或大于…

回到原点。一种情况是您希望使用字符而不是字符串进行操作。例如,您有字母表中的字母,希望对它们进行排序。或者A-F系统中的分数,你想对它们进行排序。一般来说,如果字符没有连接在一起就有意义(比如在消息字符串或文本消息中)。您现在一般不需要对文本消息的字符进行排序,是吗?所以,使用一个数组。例如,为了排序,您可以利用array.sort()方法,但我认为没有一种方法可以对字符串进行排序。也许是第三部分图书馆。

另一方面(与问题无关),如果您想经常修改字符串,可以使用StringBuilder to。更擅长表演。


您可能知道字符串是不可变的,以及子串如何导致Java中的内存泄漏。由于字符串在Java中是不可变的,如果您将密码存储为纯文本,则它将在内存中可用,直到垃圾收集器清除它,并且由于字符串在字符串池中用于可重用性,因此很有可能在长时间内将其留在内存中,从而造成安全威胁。因为任何有权访问内存转储的人都可以用明文找到密码。由于字符串是不可变的,所以无法更改字符串的内容,因为任何更改都将生成新的字符串,而如果char[],则仍然可以将其所有元素设置为空或零。因此,将密码存储在字符数组中可以明显降低窃取密码的安全风险。