在Java中是否存在字符数组优于字符串的情况

在Java中是否存在字符数组优于字符串的情况,java,arrays,string,performance,Java,Arrays,String,Performance,我觉得字符串可以在所有场景中取代字符数组。即使考虑到字符串的不变性特征,在适当的范围内声明字符串和java的垃圾收集特性也可以帮助我们避免任何内存泄漏。我想知道在Java中是否存在使用字符数组而不是字符串的情况。字符串是一个类,而不是内置类型。它很可能通过在下面使用一个char数组来完成它所做的事情,但是不能保证。“我们不在乎它是如何实施的”。它有一些对字符串有意义的方法,比如比较字符串。比较数组??嗯,这样做真的没有意义。您可以检查它们是否相等,但小于或大于 回到正题。一种情况是您希望使用字符

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

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

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


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

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

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


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

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

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

在存储安全敏感数据时,字符数组比普通字符串稍有优势。在这方面有很多资源,例如这个问题:(和他自己)

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

  • 您对
    字符串在内存中停留的时间几乎没有影响。因此,您可能会通过内存转储泄漏敏感数据
  • 在应用程序日志中以明文形式意外泄漏敏感数据的可能性更大
更多阅读:


在存储安全敏感数据时,字符数组比普通字符串稍有优势。在这方面有很多资源,例如这个问题:(和他自己)

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

  • 您对
    字符串在内存中停留的时间几乎没有影响。因此,您可能会通过内存转储泄漏敏感数据
  • 在应用程序日志中以明文形式意外泄漏敏感数据的可能性更大
更多阅读:


除了查看JDK核心API中使用
char[]
的方法外,您无需再深入了解

例如(java.io.Reader):

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

参数:

  • cbuf-目标缓冲区
  • 返回: 读取的字符数,如果已到达流的结尾,则为-1
  • 抛出: IOException-如果
     public int read(char[] cbuf)
         throws IOException