为什么Java Swing用char[]来存储密码,而不是String

因为String是不可变的(immutable)。 这意味着在String对象被垃圾回收前,密码会一直存在于内存中。 (虽然可以通过反射来修改String对象的field的访问权限,进而修改String对象。) 使用char[]来存储密码的好处是使用后可以马上抹掉char[]的内容。

安全总是相对的。一种可能性(取决于JVM实现)是在抹掉char[]之前发生了GC,移动了char[]对象 (比如从Eden移动到Survivor),使得老的char[]还驻留在内存里。

还有一点要注意的是不要在log里(无意地)打印敏感信息,比如密码等。