string不可变
1.string缓存在常量池,java多线程环境修改string会有风险;
2.打开文件/网络连接/数据库链接都可以使用string,比如说string文件名,获取权限open之后如果string可以修改,那其他文件的也能得到权限;
3.map大量使用string作为key,当key可以修改,那hashcode不变情况,map中value会丢失
对于敏感信息char[]比string存储更好
1.由于string的不可变性,string存在就不能修改,而且可能存在内存中不被gc回收,通过java的dump文件可以获取到缓存的string;
2.打印日志误操作打印string,char[]直接打印是不会打印字符串;
note:下面链接1提到substring造成内存泄漏新的jdk已经修复,substring会new一个新的string,以前是直接通过改变value[]的offset来重新new的,value[]太大substring一个小的string还是会缓存很大的value[]