string类型的常量池:
直接使用双引号声明出来的string对象会直接存储在常量池中
如果不是用双引号声明的string对象,可以使用string提供的intern方法。intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中。
如果常量池中存在当前字符串,就会直接返回当前字符串,如果常量池中没有此字符串,会将此字符串放入常量池中后,再返回。
intern的不当使用:
常量池的长度是1009且不可变的,因此一旦常量池中的字符串达到一定规模后,性能会急剧下降。
fastjson中对所有的json的key使用了intern方法,缓存到了字符串常量池中,这样每次读取的时候就会非常快,大大减少时间和空间。而且json的key通常都是不变的。但如果变化太大,会给字符常量池带来很大的负担。fastjson修复的办法是在程序中加入了一个最大的缓存大小,超过这个大小后就不会再往字符串常量池中放了。