Java對(duì)象池
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
在JDK5.0里,JVM在啟動(dòng)的時(shí)候會(huì)實(shí)例化9個(gè)對(duì)象池,這9個(gè)對(duì)象池分別用來(lái)存儲(chǔ)8種基本數(shù)據(jù)類型的包裝類對(duì)象和String對(duì)象。當(dāng)我們直接用8種基本類型的包裝類的對(duì)象或用雙引號(hào)括起來(lái)一個(gè)字符串時(shí),JVM就要在其對(duì)象池里面去找是否有一個(gè)相同的對(duì)象,如果有,就直接從對(duì)象池中拿這個(gè)現(xiàn)成的對(duì)象,如果沒(méi)有,就在對(duì)象池里面創(chuàng)建一個(gè)新的對(duì)象。
1、基本類型的包裝類對(duì)象池
Integer i1 = 5;//5在對(duì)象池中取
Integer i2 = 5;
System.out.println(i1==i2);//true,i1和i2都是從對(duì)象池中取的同一個(gè)對(duì)象
而:
Integer j1 = 200;//超過(guò)Integer對(duì)象池存放數(shù)的范圍,即:直接賦給一個(gè)Integer對(duì)象
Integer j2 = 200;
System.out.println(j1==j2);//false
由于Integer對(duì)象池只存放從-128--127之間的整數(shù),若超過(guò)這個(gè)范圍,則直接創(chuàng)建一個(gè)新的Integer對(duì)象!
類似還有Long、Byte、Short、Float……
2、String類
創(chuàng)建String對(duì)象有兩種方法:
String str1 = "xcbeyond";
String st2 = new String("xcbeyond");
這兩種不同的創(chuàng)建方法是有差別的,第一種方式是在對(duì)象池中拿對(duì)象,第二種方式是直接在堆內(nèi)存空間創(chuàng)建一個(gè)新的對(duì)象。
因此,就有System.out.println(str1==str2);//false
總結(jié):對(duì)象池是為了避免頻繁的創(chuàng)建和銷毀對(duì)象而影響系統(tǒng)性能,其實(shí)現(xiàn)了對(duì)象的共享。