String是不可改变的对象,也就是说一旦你创建了String对象,那么在垃圾回收之前你是没有办法手动销毁这个String对象的,如果有个程序能dump内存,恰好这时垃圾回收未执行(垃圾回收执行是不确定的),dump下来的内存可以清晰读取String,这样就有了暴露密码的风险。
char []数组呢,你可以在使用完后直接清除数据,而且你也可以随意更改数组内的内容,而且密码不会在系统中任何地方出现,即使是在垃圾回收之前。
那么理解这个问题就很简单了,这就是个安全策略问题,使用String你很可能会不小心打印到日志或者其他不安全的地方,而使用char[]则不会有这样的问题,免于二次攻击。