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ì)象的共享。