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

时间:2018-09-22 09:59:55

标签: java arrays string performance

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

4 个答案:

答案 0 :(得分:3)

在存储对安全敏感的数据时,字符数组相对于纯字符串具有一些轻微的优势。有很多资源,例如以下问题:Why is char[] preferred over String for passwords?(本人为an answer by Jon Skeet)。

通常可以归结为两点:

  • 您对String保留内存的时间影响很小。因此,您可能会通过内存转储泄漏敏感数据。
  • 由于纯文本更有可能使用明文,因此意外泄漏应用程序日志中的敏感数据

更多阅读内容:

答案 1 :(得分:1)

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

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

关于另一个注释(与问题无关),如果要经常修改字符串,可以使用StringBuilder。它的性能更好。

答案 2 :(得分:1)

您无需比使用<?php echo "Hello"; ?> 的JDK核心API中的方法更深入。

例如this one(java.io.Reader):

char[]
  

将字符读入数组。该方法将一直阻塞,直到有可用的输入,发生I / O错误或到达流的末尾为止。

     

参数:

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

他们要求您传入 public int read(char[] cbuf) throws IOException 而不是返回String,以用作将结果写入其中的缓冲区。原因是效率。

答案 3 :(得分:0)

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