缓冲池和String池
在內存中虛擬出了一個池子,
在棧內存中有一個x1,他就會指向池中的一個對象,池子的作用是當在出項一個x2是,則會指向池中尋找,看是否有這個對象。緩存的大小是:-128-127,這時一個字節。即一個ASCll表。
?
由方法返回的都在對內存中的。
?
?
package toto.learn1;
?
publicclass StringDemo {
?
??? /**
??? ?* Java為了優化字符串的操作,提供了一個緩沖池
??? ?* 1、String str="abc";和String str=new String();
??? ?* 2、String str=new String("abc");創建了幾個對象(2個或1個)
??? ?* 3、String str="a"+"b"+"c"+"d";創建了幾個對象
??? ?* 4、String s1="a"; Strings2="b"; String s3=s1+s2; s3="ab";
??? ?*/
??? publicstaticvoid main(String[] args) {
?????? // 1、首先會取出池里面有沒有“abc”對象,通過(equals)
?????? //找到了,直接返回引用;沒找到,會創建一個對象,緩沖到池里,返回引用
?????? /*String s1="abc";
?????? String s2="abc";
?????? System.out.println(s1==s2);*/??
??????
?????? //2、String str=new String("abc");//不管池里有沒有緩沖,都會在堆內存中創建
?????? //一個新的對象,返回引用。此時負責檢查并維護緩沖池。實際上對內存創建的對象是緩沖到池中對象的一個拷貝。
?????? /*
?????? String s1=new String("abc");//創建了兩個對象
?????? String s2=new String("abc");//創建了一個對象
?????? System.out.println(s1==s2);//此時結果為false.
?????? */
?????? //3、String str="a"+"b"+"c"+"d";
?????? //編譯器有一個優化功能,并合并已知量(得是已知量),其在編譯階段就合并,
?????? //故上面創建了一個對象。
??????
?????? /**
?????? ?* String s3=s1+s2;實際上通過:、
?????? ?* StringBuilder sb=newStringBuilder();
?????? ?* sb.append(s1);
?????? ?* sb.append(s2);
?????? ?* */
?????? String s1="a";
?????? String s2="b";
?????? String s3=s1+s2;//字符串是不能相加的。
?????? }
??????
}
?
把一個對象存到集合中,這個對象的地址仍然沒變,緩沖池就相當于一個集合。
?
內存中沒有單獨的一片地址表示池。緩沖池相當于一個集合,存放的是對象的地址。存多少個對象,取決于自己定義的池的大小。
?
?
2. 基本數據類型的包裝類
int --> Integer
byte --> Byte
short --> Short
long --> Long
char --> Character
double --> Double
float --> Float
boolean --> Boolean
?
1) Integer x = 1; x = x + 1;? 經歷了什么過程?裝箱à拆箱à裝箱
2) 為了優化,虛擬機為包裝類提供了緩沖池,Integer池的大小 -128~127 一個字節的大小
3) String池
/*1. String s = "abc", 虛擬機首先會檢查String池里有沒有"abc"對象(通過equals方法)
?????? // 如果有,直接返回引用,如果沒有,會在池里創建一個“abc”對象,并返回引用
?????? Strings1 = "abc";
?????? Strings2 = "abc";
?????? System.out.println(s1==s2); // result: true
?????? */
??????
?????? /* 2.String str = new String("abc"); 不管緩沖池是否有"abc", 都會在堆內存創建一個"abc"對象,返回引用
?????? // 此時,負責檢查并維護緩沖池,其實堆內存的對象是緩沖池中"abc"對象的一個拷貝
?????? Strings1 = new String("abc");
?????? Strings2 = new String("abc");
?????? System.out.println(s1==s2);// result: false
?????? */
??????
?????? /* 3.String s = "a" + "b" + "c" + "d";? java編譯器有個合并已知量的優化功能
?????? // 在編譯階段就把"a" + "b" + "c" + "d" 合并為”abcd“
?????? String s= "a" + "b" + "c" + "d";
??? //? String s = "abcd";
?????? System.out.println(s=="abcd");//result: true
?????? */
??????
?????? /*4.? String s1 = "a"; String s2= "b"; String s3 = s1 + s2;
?????? //String是常量,不能相加的,java如何實現的?
?????? ?StringBuilder sb = new StringBuidler(s1);
?????? ?sb.append(s2);
?????? ?s3 = sb.toString();
?????? ?
?????? ?也就是說實際上s3是方法返回的String對象
?????? ?凡是方法返回的字符串對象都是在堆內存的,并且不負責維護緩沖池
?????? */
?????? ?String s1 = "a";
?????? ?String s2 = "b";
?????? ?String s3 = s1 + s2; // 堆內存的對象
?????? ?
?????? ?System.out.println(s3=="ab");//result: false
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的缓冲池和String池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斯柯达明锐尾灯螺丝是几号的
- 下一篇: 增强for循环,Map,集合应用