有一個面試官問了這么一個問題:String為什么要設(shè)計為不可變?當(dāng)時回答的并不好畏吓,且覺得這個問題比較好,所以就決定整理一下菲饼。
思路:我們要知道可變的字符串肾砂,Java已經(jīng)給我們提供了StringBuilder,StringBuffer,那么我覺得我們可以通過對比和StringBuilder使用的不同場景和不可變性帶來的便利。
一.提供與StringBuilder不一樣的功能
對字符串value進(jìn)行修改使用StringBuilder镐确;
StringBuilder強(qiáng)調(diào)的是對字符串對象本身的操作饼煞,類中的方法返回值也是以對象本身為主(return this)源葫,比如:sb.append("a").insert("b").deleteCharAt(0);
字符串需要多次多處重復(fù)使用砖瞧,使用String息堂,是其使用場景
String的使用是作為數(shù)據(jù)源,類本身提供的方法返回的是對數(shù)據(jù)源處理后的字符串,以 return new String("")為主荣堰,而對象本身是不變的床未,不管是substring或者concat方法;
二.不可變帶來的優(yōu)勢和便利
1.線程安全性
String的value不可變振坚,天然地保證了使用中的線程安全性
2.作為HashMap的key
基于不可變薇搁,String可以根據(jù)value緩存hashCode和覆寫基于value的equals方法,正因此String類同包裝類一樣渡八,是我們HashMap的key常用類型啃洋。字符串是我們?nèi)粘V谐S玫臄?shù)據(jù)類型,自然將字符串放進(jìn)不同集合也是很常見的使用場景(HashSet同理因為就是基于HashMap的)
3.維護(hù)字符串常量池呀狼,減少開銷
由于不可變且是線程安全的裂允,JVM才可以維護(hù)字符串的常量池,減少對象的創(chuàng)建
總結(jié)
我們重點理解String和StringBuilder的區(qū)別就可以了哥艇,尤其線程安全和維護(hù)常量池