在 Java 中,是否有字符数组比字符串更好的情况



我觉得字符串可以在所有情况下替换字符数组。即使考虑到字符串的不可变性特征,在适当的范围内声明字符串和java的垃圾收集功能也应该可以帮助我们避免任何内存泄漏。我想知道是否有任何极端情况应该使用字符数组而不是 Java 中的字符串。

在存储安全敏感数据方面,字符数组比纯字符串略有优势。有很多关于这个问题的资源,例如这个问题:为什么 char[] 比字符串更适合密码?(乔恩·斯基特本人回答(。

一般来说,它归结为两件事:

  • 您对String在内存中保留的时间几乎没有影响。因此,您可能会通过内存转储泄漏敏感数据。
  • 使用
  • 纯字符串更有可能在应用程序日志中意外泄漏敏感数据作为明文

更多阅读:

  • 为什么我们从控制台读取字符数组而不是字符串的密码
  • https://www.codebyamir.com/blog/use-character-arrays-to-store-sensitive-data-java
  • https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/amp/
  • https://www.baeldung.com/java-storing-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-storing-password-in-java/amp/

字符串是一个类,而不是内置类型。它很可能通过在下面使用 char 数组来执行它所做的事情,但不能保证。"我们不在乎它是如何实施的"。它具有对字符串有意义的方法,例如比较字符串。比较数组??嗯,这样做真的没有意义。您可以检查它们是否相等确定,但小于或大于...

回到正题。一种情况是您希望使用字符而不是字符串进行操作。例如,您有字母表中的字母并希望对它们进行排序。或 A-F 系统中的成绩,您想对它们进行排序。通常,将未连接的字符放在一起具有某种含义(例如在消息字符串或文本消息中(是有意义的。您现在通常不需要对短信的字符进行排序,对吗?因此,您使用数组。 例如,要排序,您可以利用 Arrays.sort(( 方法,而我认为没有一种方法可以对字符串执行此操作。也许是第三部分库。

另一方面(与问题无关(,如果你想经常修改字符串,你可以使用StringBuilder。它的性能更好。

您不必再看 JDK 核心 API 中使用char[]的方法。

比如这个(java.io.Reader(:

public int read(char[] cbuf)
throws IOException

将字符读入数组。此方法将阻塞,直到某些输入可用、发生 I/O 错误或到达流的末尾。

参数:

  • cbuf - 目标缓冲区
  • 返回: 读取的字符数,如果已到达流的末尾,则为 -1
  • 抛出: IOException - 如果发生 I/O 错误

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

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

相关内容

最新更新