1.Java封裝類
對于簡單類型數據,為了和Java面向對象的思想一致,Java對它們進行了封裝,使它們都有相應的封裝類
2.Java自動裝箱和拆箱定義
Java 1.5中引入了自動裝箱和拆箱機制:
自動裝箱:把基本類型用它們對應的引用類型包裝起來,使它們具有對象的特質,可以調用toString()、hashCode()、getClass()、equals()等方法。
Integer a=3;//這是自動裝箱
其實編譯器調用的是static Integer valueOf(int i)這個方法,valueOf(int i)返回一個表示指定int值的Integer對象,那么就變成這樣:
Integer a=3; => Integer a=Integer.valueOf(3);
拆箱:跟自動裝箱的方向相反,將Integer及Double這樣的引用類型的對象重新簡化為基本類型的數據。
int i = new Integer(2);//這是拆箱
編譯器內部會調用int intValue()返回該Integer對象的int值 注意:自動裝箱和拆箱是由編譯器來完成的,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動作。
一個簡單的例子
1. Integer integer1 = 100;
2. Integer integer2 = 100;
3. System.out.println("integer1==integer2: " + (integer1 == integer2));// true 自動裝箱的兩個緩存中的 Integer對象的引用比較
4. System.out.println("integer1.equals(integer2): " + (integer1.equals(integer2)));// true
5. System.out.println("integer1.compare(integer2): " + integer1.compareTo(integer2));// 0
6. Integer integer3 = 200;
7. Integer integer4 = 200;
8. System.out.println("integer3==integer4: " + (integer3 == integer4));// false 自動裝箱的兩個new Integer的引用比較
9. System.out.println("integer3>integer4: " + (integer3 > integer4)); // false 將兩個對象拆箱,再比較大小
10. System.out.println("integer3.equals(integer4): " + (integer3.equals(integer4)));// true
11. System.out.println("integer3.compare(integer4): " + integer3.compareTo(integer4));// 0
12. Integer integer5 = new Integer(100);
13. Integer integer6 = new Integer(100);
14. System.out.println("integer5==integer6: " + (integer5 == integer6)); // false 兩個不同的Integer對象引用的比較
15. System.out.println("integer5.equals(integer6): " + (integer5.equals(integer6)));// true
16. System.out.println("integer5.compare(integer6): " + integer5.compareTo(integer6));// 0
17. int int1 = 100;
18. System.out.println("integer1==int1: " + (integer1 == int1));// true Integer緩存對象拆箱后與int比較
19. System.out.println("integer1.equals(int1): " + (integer1.equals(int1)));// true
20. System.out.println("integer1.compare(int1): " + integer1.compareTo(int1));// 0
21. int int2 = 200;
22. System.out.println("integer3==int2: " + (integer3 == int2));// true Integer對象拆箱后與int比較
23. System.out.println("integer3.equals(int2): " + (integer3.equals(int2)));// true
1. System.out.println("integer3.compare(int2): " + integer3.compareTo(int2));// 0
3.源碼分析
1. public static Integer valueOf(inti) {
2. if(i >= -128 &&i <=IntegerCache.high)
3. return IntegerCache.cache[i + 128];
4. else
5. return new Integer(i);
6. }
IntegerCache內部類
1. private static class IntegerCache {static final
2. static final inthigh;
3. static final Integer cache[];
4. 5. static {
6. final int low = -128
7. int h = 127;
8. if (integerCacheHighPropValue !=null) {
9. int i=Long.decode(integerCacheHighPropValue).intValue();
10. i = Math.max(i, 127);
11. h = Math.min(i, Integer.MAX_VALUE - -low);
12. }
13. high = h;
14. cache =new Integer[(high - low) + 1];
15. int j = low;
16. for(int k = 0; k ++)
17. cache[k] =new Integer(j++);
18. }
19. }
用integerCacheHighPropValue變量設置自動裝箱池大小,設置-XX:AutoBoxCacheMax=選項再次測試<3>中代碼
在eclipse中,選中源文件,右鍵Run as—>RunConfiguratio--->Arguments,在VM arguments中做以下設置:
運行,控制臺報錯:Unrecognized VM option 'AutoBoxCacheMax=256'
找到JAVA_HOME/jre/lib/i386/jvm.cfg, 只需要把-server和-clent換個位置就行了.