澶у濂斤紝鎴戞槸Guava銆傛垜鏄胺姝屽紑婧愮殑锛岀洰鍓嶆垜鍦℅itHub涓婃湁39.9k鐨勭矇涓濓紝杩欒瘉鏄庝簡鎴戠殑鍙楁杩庣▼搴︺€傛垜鐨勪富浣撲富瑕佸寘鍚繖鍑犱釜甯哥敤妯″潡锛氶泦鍚圼collections]銆佺紦瀛榌caching]銆佸師鐢熺被鍨嬫敮鎸乕primitivessupport]銆佸苟鍙戝簱[concurrencylibraries]銆佸父鐢ㄦ敞瑙commonannotations]銆佸瓧绗︿覆澶勭悊[stringprocessing]銆両/o绛夋垜宸茬粡鐩存帴寮曞叆鏂扮増JDK浜嗐€傚彲鎯宠€岀煡锛屾垜鏈夊浼樼锛屼笉绂佸緱鎰忋€傝繖涔堣鍚э紝瀛︿細鐢ㄥソ鎴戯紝浼氳浣犵紪绋嬫洿蹇箰锛屽啓鍑烘洿浼橀泤鐨勪唬鐮侊紒PS锛氫负浜嗗府鍔╂洿澶欽ava鐖卞ソ鑰咃紝銆奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬪凡缁忓紑婧愬埌GitHub锛堟湰鏂囧凡鏀跺綍锛夈€傝涓撴爮宸茬粡鑾峰緱浜?54棰楁槦銆傚鏋滀綘涔熷枩娆㈣繖涓笓鏍忥紝瑙夊緱鏈夊府鍔╋紝鍙互鐐逛釜star锛屾柟渚夸互鍚庢洿绯荤粺鐨勫涔狅細https://github.com/itwanger/toBeBetterJavaer02銆傚紩鍏uava濡傛灉鎯冲湪Maven椤圭洰涓娇鐢ㄦ垜锛岄渶瑕佸厛鍦╬om.xml鏂囦欢涓紩鍏ユ垜鐨勪緷璧栥€?dependency>com.google.guavaguava30.1-jre涓€涓姹傦紝JDK鐗堟湰闇€瑕佸湪8.03浠ヤ笂銆傚熀纭€宸ュ叿java.util.concurrent鍖呯殑浣滆€匘ougLea鏇剧粡璇磋繃锛氣€渘ull鐪熺殑寰堢碂绯曗€濄€俆onyHoare锛屽浘鐏靛寰椾富锛屽揩閫熸帓搴忕畻娉曠殑浣滆€咃紝褰撶劧涔熸槸null鐨勫垱閫犺€咃紝璇磋繃绫讳技鐨勮瘽锛氣€渘ull鐨勪娇鐢ㄨ鎴戞崯澶变簡鍗佷嚎缇庡厓銆傗€濆嚭浜庤繖涓師鍥狅紝鎴戜娇鐢∣ptional鏉ヨ〃绀轰竴涓彲鑳戒负绌虹殑瀵硅薄銆備唬鐮佺ず渚嬪涓嬫墍绀恒€侽ptionalpossible=Optional.of(5);possible.isPresent();//杩斿洖truepossible.get();//returns5鎴戝ぇ鍝ava鍦↗DK8涓姞鍏ヤ簡Optional绫伙紝鏄庢樉鏄垜浠庝互鍓嶅€熸潵鐨勶紝涓嶈繃浠栫殑鍜屾垜鐨勬湁鐐逛笉涓€鏍枫€傛垜鐨凮ptional鏄娊璞$殑锛岃繖鎰忓懗鐫€鎴戝彲浠ユ湁瀛愮被瀵硅薄锛涙垜鍏勫紵鐨勬槸final鐨勶紝杩欐剰鍛崇潃娌℃湁瀛愮被瀵硅薄銆傛垜鐨凮ptional瀹炵幇浜哠erializable鎺ュ彛锛屽彲浠ヨ搴忓垪鍖栵紱鎴戝摜鍝ョ殑娌℃湁銆傛垜鐨勪竴浜涙柟娉曚篃涓庢垜鍝ュ摜鐨勪笉鍚屻€傞櫎浜嗚祴浜堢┖璇箟鍜屽鍔犲彲璇绘€т箣澶栵紝浣跨敤Optional鐨勬渶澶т紭鍔垮湪浜庡畠鏄竴绉嶄竾鏃犱竴澶辩殑淇濇姢銆侽ptional杩娇鎮ㄧН鏋佹€濊€冪己灏戠殑寮曠敤锛屽洜涓烘偍蹇呴』鏄庣‘鍦颁粠Optional鑾峰彇寮曠敤銆傞櫎浜哋ptional涔嬪锛屾垜杩樻彁渚涗簡锛欳ommonObject鐨勫弬鏁版牎楠屾柟娉曪紝姣斿Objects.equals锛孫bjects.hashCode锛孞DK7寮曞叆鐨凮bjects绫讳篃鎻愪緵浜嗗悓鏍风殑鏂规硶锛屽綋鐒朵篃鏄彈鍒颁簡鎴戠殑鍚彂銆傛洿寮哄ぇ鐨勬瘮杈冨櫒04.Sets棣栧厛璇翠竴涓嬩负浠€涔堥渶瑕乮mmutablesets銆備繚璇佺嚎绋嬪畨鍏ㄣ€傚湪骞跺彂绋嬪簭涓紝浣跨敤涓嶅彲鍙橀泦鍚堜笉浠呬繚璇佷簡绾跨▼鐨勫畨鍏紝鑰屼笖澶уぇ鎻愰珮浜嗗苟鍙戠殑鏁堢巼锛堜笌骞跺彂閿佹柟寮忕浉姣旓級銆傚鏋滀竴涓璞′笉闇€瑕佹敮鎸佷慨鏀规搷浣滐紝涓嶅彲鍙橀泦鍚堜細鑺傜渷绌洪棿鍜屾椂闂村紑閿€銆傚彲浠ュ綋浣滀竴涓父閲忥紝闆嗗悎涓殑瀵硅薄浠ュ悗涓嶄細鏀瑰彉銆備笌JDK涓彁渚涚殑涓嶅彲鍙橀泦鍚堢浉姣旓紝鎴戞彁渚涚殑Immutable鏄湡姝g殑涓嶅彲鍙樸€傛垜涓轰粈涔堣繖涔堣锛熺湅鐪嬩笅闈㈢殑渚嬪瓙銆備笅闈㈢殑浠g爜浣跨敤JDK鐨凜ollections.unmodifiableList(list)寰楀埌涓€涓笉鍙慨鏀圭殑闆嗗悎unmodifiableList銆侺istlist=newArrayList();list.add("闆峰啗");list.add("涔斿竷鏂?);ListunmodifiableList=Collections.unmodifiableList(list);unmodifiableList.add("椹簯");杩愯浠g爜瀹冨皢鍑虹幇浠ヤ笅寮傚父锛欵xceptioninthread"main"java.lang.UnsupportedOperationExceptionatjava.base/java.util.Collections$UnmodifiableCollection.add(Collections.java:1060)atcom.itwanger.guava.NullTest.main(NullTest.java:29)寰堝ソ锛屾墽琛寀nmodifiableList.add()鏃舵姏鍑篣nsupportedOperationException锛岃鏄嶤ollections.unmodifiableList()杩斿洖鐨勬槸涓€涓笉鍙彉闆嗗悎銆備絾浜嬪疄鐪熺殑濡傛鍚楋紵鎮ㄥ彲浠ュ皢unmodifiableList.add()鏇挎崲涓簂ist.add()銆侺istlist=newArrayList();list.add("闆峰啗");list.add("涔斿竷鏂?);ListunmodifiableList=Collections.unmodifiableList(list);list.add("椹簯");娌℃湁鎶ラ敊锛屼綘浼氬彂鐜皍nmodifiableList涓湡鐨勫浜嗕竴涓厓绱犮€傝繖鏄粈涔堟剰鎬濓紵Collections.unmodifiableList(鈥?涓嶆槸鐪熸鐨勪笉鍙彉闆嗗悎銆傚綋鍘熷闆嗗悎琚慨鏀规椂锛屼笉鍙彉闆嗗悎涓殑鍏冪礌涔熶細鍙戠敓鍙樺寲銆傛垜涓嶄細鐘繖涓敊璇紝鐪嬬湅涓嬮潰鐨勪唬鐮併€侺iststringArrayList=Lists.newArrayList("闆峰啗","涔斿竷鏂?);ImmutableListimmutableList=ImmutableList.copyOf(stringArrayList);immutableList.add("椹簯");褰撴偍灏濊瘯immutableList.add()鏃舵姏鍑篣nsupportedOperationException銆傛垜宸插純鐢ㄦ簮浠g爜涓殑add()鏂规硶銆?***淇濊瘉鎶涘嚭寮傚父骞朵繚鎸侀泦鍚堜笉鍙樸€?*@throwsUnsupportedOperationException鎬绘槸*@deprecated涓嶆敮鎸佺殑鎿嶄綔銆?/@CanIgnoreReturnValue@Deprecated@Overridepublicfinalbooleanadd(Ee){ThrownewUnsupportedOperation()}褰撳皾璇晄tringArrayList.add()淇敼鍘熷闆嗗悎鏃讹紝immutableList涓嶄細琚敼鍙樸€傞櫎浜嗕笉鍙彉闆嗗悎锛屾垜杩樻彁渚涗簡鏂扮殑闆嗗悎绫诲瀷锛屾瘮濡傦細Multiset锛屽彲浠ュ娆℃坊鍔犵浉绛夌殑鍏冪礌銆傚綋Multiset琚涓轰竴涓櫘閫氱殑Collection鏃讹紝瀹冪殑琛屼负灏卞儚涓€涓棤搴忕殑ArrayList锛涘綋Multiset琚湅浣滀竴涓狹ap鏃讹紝瀹冧篃鎻愪緵浜嗘弧瓒虫€ц兘棰勬湡鐨勬煡璇㈡搷浣溿€侻ultimap锛屽彲浠ヨ交鏉惧湴灏嗕竴涓敭鏄犲皠鍒板涓€笺€侭iMap锛屼竴绉嶇壒娈婄殑Map锛屽彲浠ヤ娇鐢╥nverse()鏉ュ弽杞珺iMap鐨勯敭鍊兼槧灏勶紱鍊间繚璇佹槸鍞竴鐨勶紝鍥犳values()杩斿洖涓€涓猄et鑰屼笉鏄櫘閫氱殑Collection銆?5.瀛楃涓插鐞嗗瓧绗︿覆琛ㄧず涓€涓笉鍙彉鐨勫瓧绗﹀簭鍒楋紝涓€鏃﹀垱寤哄氨涓嶈兘鏀瑰彉銆傚湪鎴戜滑鐨勬棩甯稿伐浣滀腑锛屽瓧绗︿覆鐨勪娇鐢ㄩ鐜囧緢楂橈紝鐔熺粌鐨勬搷浣滃畠浠彲浠ュぇ澶ф彁楂樻垜浠殑宸ヤ綔鏁堢巼銆傛垜鎻愪緵浜嗕竴涓繛鎺ュ櫒鈥斺€擩oiner锛屽畠鍙互杩炴帴甯﹀垎闅旂鐨勫瓧绗︿覆搴忓垪銆備笅闈㈢殑浠g爜浼氳繑鍥炩€淟eiJun;Jobs鈥濓紝鍙互浣跨敤useForNull(String)鏂规硶灏唍ull鏇挎崲涓哄瓧绗︿覆锛岃€屼笉鏄儚skipNulls()鏂规硶閭f牱鐩存帴蹇界暐null銆侸oinerjoiner=Joiner.on(";").skipNulls();returnjoiner.join("闆峰啗",null,"涔斿竷鏂?);鎴戣繕鎻愪緵浜嗕竴涓媶鍒嗗櫒鈥斺€擲plitter锛屽彲浠ユ牴鎹寚瀹氱殑鍒嗛殧绗tring搴忓垪杩涜鎷嗗垎銆係plitter.on(',').trimResults().omitEmptyStrings().split("闆峰啗锛屼箶甯冩柉锛屾矇榛樹箣鐜婭I");06.CacheCache鍦ㄥ緢澶氬満鏅笅閮介潪甯告湁鐢ㄣ€傛偍搴旇鎰忚瘑鍒版绱竴涓€肩殑鎴愭湰寰堥珮锛屽挨鍏舵槸褰撴偍闇€瑕佸娆℃彁鍙栬鍊兼椂锛屾偍搴旇鑰冭檻浣跨敤缂撳瓨銆傛垜鎻愪緵鐨凜ache鍜孋oncurrentMap绫讳技锛屼絾涓嶅畬鍏ㄤ竴鏍枫€傚熀鏈尯鍒湪浜嶤oncurrentMap淇濈暀鎵€鏈夋坊鍔犵殑鍏冪礌锛岀洿鍒版槑纭垹闄ゃ€傜浉姣斾箣涓嬶紝鎴戞彁渚涚殑Cache閫氬父璁剧疆涓鸿嚜鍔ㄥ洖鏀跺厓绱狅紝浠ラ檺鍒跺唴瀛樹娇鐢ㄣ€傚鏋滀綘鎰挎剰娑堣€椾竴浜涘唴瀛樼┖闂存潵鎻愰珮閫熷害锛屼綘鍙互棰勬湡涓€浜沰ey浼氳鏌ヨ涓嶆涓€娆★紝骞朵笖缂撳瓨涓瓨鍌ㄧ殑鏁版嵁鎬婚噺涓嶄細瓒呰繃鍐呭瓨瀹归噺锛屼綘鍙互浣跨敤Cache銆備妇涓緥瀛愬ぇ瀹舵劅鍙椾竴涓嬨€侤TestpublicvoidtestCache()throwsExecutionException,InterruptedException{CacheLoadercacheLoader=newCacheLoader(){//濡傛灉娌℃湁鎵惧埌鍏冪礌锛岃繖灏嗚璋冪敤@OverridepublicAnimalload(Strings){returnnull;}};LoadingCacheloadingCache=CacheBuilder.newBuilder().maximumSize(1000)//capacity.expireAfterWrite(3,TimeUnit.SECONDS)//杩囨湡鏃堕棿.removalListener(newMyRemovalListener())//澶辨晥listener.build(cacheLoader);//loadingCache.put("鐙?,newAnimal("鏃鸿储",1));loadingCache.put("鐚?,鏂板姩鐗?"姹ゅ",3));loadingCache.put("鐙?,newAnimal("鐏扮嫾",4));loadingCache.invalidate("鐚?);//鎵嬪姩浣緼nimal澶辨晥animal=loadingCache.get("wolf");System.out.println(鍔ㄧ墿);绾裤€傜潯鐪狅紙4*1000锛夛紱//鐙煎凡缁忚嚜鍔ㄨ繃鍘讳簡锛屾姤閿欎负绌哄€?鍔ㄧ敾al>{@OverridepublicvoidonRemoval(RemovalNotificationnotification){Stringreason=String.format("key=%s,value=%s,reason=%s",notification.getKey(),閫氱煡銆俫etValue(),notification.getCause());System.out.println(鍘熷洜);}}classAnimal{绉佹湁瀛楃涓插悕绉帮紱绉佷汉鏁存暟骞撮緞锛沺ublicAnimal(Stringname,Integerage){this.name=name;杩欎釜銆傚勾榫?骞撮緞锛泒}鍦–acheLoader涓噸鍐欎簡load鏂规硶銆傚綋鏌ヨ缂撳瓨鏈懡涓椂灏嗚皟鐢ㄦ鏂规硶銆傛垜杩欓噷鐩存帴杩斿洖null銆傚叾瀹炶繖鏍峰湪娌℃湁鍛戒腑鐨勬儏鍐典笅浼氭姏鍑篊acheLoaderreturnednullforkey寮傚父淇℃伅銆侻yRemovalListener鏄紦瀛樺厓绱犲け鏁堟椂鐨勭洃鍚被锛屽綋鍏冪礌缂撳瓨澶辨晥鏃朵細鑷姩璋冪敤onRemoval鏂规硶銆傝繖閲岄渶瑕佹敞鎰忕殑鏄紝杩欎釜鏂规硶鏄竴涓悓姝ユ柟娉曘€傚鏋滆繖閲岃€楁椂杈冮暱锛屽氨浼氶樆濉烇紝鐩村埌澶勭悊瀹屾垚銆侺oadingCache鏄€嬧€嬬紦瀛樼殑涓昏鎿嶄綔瀵硅薄锛屽父鐢ㄧ殑鏈塸ut鍜実et鏂规硶銆?7.鏈€鍚庝粙缁嶄簡鎴戣涓烘渶甯哥敤鐨勫姛鑳姐€備綔涓篏oogle寮€婧愮殑Java寮€鍙戞牳蹇冨簱锛屼釜浜鸿寰楄繕鏄緢瀹炵敤鐨勶紙涓嶇劧鍛紵鍢垮樋鍢匡級銆傚紩鍏ュ埌浣犵殑椤圭洰涓悗锛屼笉浠呭彲浠ュ揩閫熷疄鐜颁竴浜涘紑鍙戜腑甯哥敤鐨勫姛鑳斤紝杩樺彲浠ヨ浠g爜鏇村姞浼橀泤绠€娲併€傛垜璁や负瀹冮€傜敤浜庢瘡涓€涓狫ava椤圭洰銆傝嚦浜庡叾浠栫殑鍔熻兘锛屾瘮濡傚搱甯屻€佷簨浠舵€荤嚎銆佹暟瀛﹁繍绠椼€佸弽灏勭瓑锛屽氨绛変綘鍘诲彂鐜颁簡銆傝繖鏄€奐ava 绋嬪簭鍛樿繘闃朵箣璺€嬩笓鏍忕殑绗?0绡囷紙璁板緱鐐逛釜star锛夈€傛湰涓撴爮骞介粯椋庤叮锛岄€氫織鏄撴噦锛屽Java鐖卞ソ鑰呮瀬鍏跺弸濂藉拰鑸掑績馃槃锛屽唴瀹瑰寘鎷絾涓嶉檺浜嶫ava鍩虹銆丣ava闆嗗悎妗嗘灦銆丣avaIO銆丣ava骞跺彂缂栫▼銆丣ava铏氭嫙鏈恒€丣ava浼佷笟寮€鍙戯紙Maven銆丟it锛夈€丼SM銆丼pringBoot锛夌瓑鏍稿績鐭ヨ瘑鐐广€俬ttps://github.com/itwanger/toBeBetterJavaer璁╂垜浠竴璧锋垚涓烘洿濂界殑Java宸ョ▼甯堬紒