有一个面试官问了这么一个问题:String为什么要设计为不可变?当时回答的并不好,且觉得这个问题比较好,所以就决定整理一下。
思路:我们要知道可变的字符串,Java已经给我们提供了StringBuilder,StringBuffer,那么我觉得我们可以通过对比和StringBuilder使用的不同场景和不可变性带来的便利。
一.提供与StringBuilder不一样的功能
对字符串value进行修改使用StringBuilder;
StringBuilder强调的是对字符串对象本身的操作,类中的方法返回值也是以对象本身为主(return this),比如:sb.append("a").insert("b").deleteCharAt(0);
字符串需要多次多处重复使用,使用String,是其使用场景
String的使用是作为数据源,类本身提供的方法返回的是对数据源处理后的字符串,以 return new String("")为主,而对象本身是不变的,不管是substring或者concat方法;
二.不可变带来的优势和便利
1.线程安全性
String的value不可变,天然地保证了使用中的线程安全性
2.作为HashMap的key
基于不可变,String可以根据value缓存hashCode和覆写基于value的equals方法,正因此String类同包装类一样,是我们HashMap的key常用类型。字符串是我们日常中常用的数据类型,自然将字符串放进不同集合也是很常见的使用场景(HashSet同理因为就是基于HashMap的)
3.维护字符串常量池,减少开销
由于不可变且是线程安全的,JVM才可以维护字符串的常量池,减少对象的创建
总结
我们重点理解String和StringBuilder的区别就可以了,尤其线程安全和维护常量池