9_(JAVA基础300集最全课程 学习)自动装箱和拆箱
9_(JAVA基础300集最全教程 学习)自动装箱和拆箱
在JDK5.0中新增了自动装箱和拆箱,为开发人员解决了很多开发中的效率问题,下面看看是怎么个流程:
1.
结果为:
1
2.
结果为:
Exception in thread "main" java.lang.NullPointerException
at ArrayListTest.main(ArrayListTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
3.缓存机制:默认情况下-XX:AutoBoxCacheMax设置的大小即为缓存的大小,当未设置时即为默认大小-128到127之间的数据全部装箱缓存,在需要时直接获取即可。
可以通过以下方式验证:
结果为:
false
true
true
true
在JDK5.0中新增了自动装箱和拆箱,为开发人员解决了很多开发中的效率问题,下面看看是怎么个流程:
1.
Integer c=1; int d=c; System.out.println(d);
结果为:
引用
1
2.
Integer a=null; int b=a; System.out.println(b);
结果为:
引用
Exception in thread "main" java.lang.NullPointerException
at ArrayListTest.main(ArrayListTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
3.缓存机制:默认情况下-XX:AutoBoxCacheMax设置的大小即为缓存的大小,当未设置时即为默认大小-128到127之间的数据全部装箱缓存,在需要时直接获取即可。
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. During VM initialization the * getAndRemoveCacheProperties method may be used to get and remove any system * properites that configure the cache size. At this time, the size of the * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>. */ // value of java.lang.Integer.IntegerCache.high property (obtained during VM init) private static String integerCacheHighPropValue; static void getAndRemoveCacheProperties() { if (!sun.misc.VM.isBooted()) { Properties props = System.getProperties(); integerCacheHighPropValue = (String)props.remove("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) System.setProperties(props); // remove from system props } } private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} } /** * Returns a <tt>Integer</tt> instance representing the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */ public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
可以通过以下方式验证:
Integer e=1234111; Integer f=1234111; System.out.println(e==f); System.out.println(e.equals(f)); Integer g=100; Integer h=100; System.out.println(g==h); System.out.println(g.equals(h));
结果为:
引用
false
true
true
true