Java自动装箱

来源:互联网 发布:厦门房叔快修网络 编辑:程序博客网 时间:2024/06/05 03:24

http://blog.csdn.net/mlc0202/article/details/7393471

http://blog.csdn.net/rock_ray/article/details/19496693

1,自动装箱作用是自动打包,将基本类型数据转换为对象 ,

2,自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,如果超出了这个值的范围就不会被重用的,所以每次new出来的都是一个新的对象    

<span style="font-size:14px;">Integer data1 = 500;  </span>
<span style="font-size:14px;">Integer data2 = 500; </span>
<span style="font-size:14px;">System.out.println(data1==data2);  falseI</span>
<span style="font-size:14px;">Integer a = 127; Integer b = 127;</span><pre class="java" name="code"><span style="font-size:14px;">System.out.println("a==b:"+(a==b));<span><span>  </span></span><span class="comment">//结果为true,因为a和b指向了同一个Integer对象,</span> </span>

                                                              //因为当数值在byte范围内时,对于新特性,如果该数值的对象已经存在,则不会再开辟新的空间。  

                                                             //byte的范围:-128~127  ,  Integer x =new Integer("123");//此对象表示字符串参数所指示的int值 

  Integer y = new Integer(123); //此对象表示指定的int值

 sop("x==y:"+(x==y));//两个对象,内存地址不同,false

  sop("x.equals(y):"+x.equals(y));//两个对象内容相同,即int值相同,true


3,Integer i =null;//表明i没有参考至任何对象int j = i ;//相当于 int j = i.intValue()

      这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的

4,基本数据类型转成字符串。

     基本数据类型+""

     基本数据类型.toString(基本数据类型值)

     如:Integer.toString(34); //将整数34变成字符串"34

5,字符串转成基本数据类型。

     static int parseInt(String str):将字符串参数作为有符号的十进制整数进行解析。

     xxx a = Xxx.parseXxx(String);

       例:

     int num = Integer.parseInt("123");

     double num = Double.parseDouble("12.34");

     boolean b = Boolean.parseBoolean("true");

     方法二(非静态)

     Integer的非静态方法intValue(),使用前要创建Integer对象。

     例: Integer i = new Integer("123");

     int num = i.intValue();


<span style="font-size:14px;"><a target=_blank target="_blank" href="http://,包装类都实现了Comparable接口,可以实现对象之间的比较,所以包装类之间的比较尽量用compareTo,而不是><=这些运算符。切记。">http://blog.csdn.net/derson2388/article/details/8026518</a></span>

1,为什么讲基本类型转为类,包装类作为类,可以容纳更多的信息,可以提供更多的操作。另外,包装类都实现了Comparable接口,可以实现对象之间的比较,所以包装类之间的比较尽量用compareTo,而不是><=这些运算符。切记。

 2,显式赋值,我们可以理解为有赋值符号出现的情况,比如,Integer i = 11;这里编译器会自动的帮你完成把11这个int的基本类型装箱成包装类实例的工作,这样就不用我们再手动的转换了。

隐式赋值,就是没有复制符号出现的情况,这点我们很多人经常忽略,比如方法调用时候的参数传递,比如我们有一个接受Integer类型参数的方法(void method(Integer i)),我们在调用的时候可以直接传递一个基本类型的实参进去(method(5))

装箱/拆箱原则,就是基本类型可以先加宽(比如int转换为long),再转变成宽类型的包装类(Long),但是不能转变成宽类型的包装类型。

比如我们有个方法 void method(long l),我们通过method(5)是可以调用该方法的,因为int类型的5被加宽成了long类型;但是如果这个方法变成void method(Long l),我们通过method(5)就不能调用它了,因为int类型的5是不能直接转换成Long包装类的。切记。


http://bbs.csdn.net/topics/390277568


<span style="font-size:14px;">        int n=420;        Integer i = new Integer(n);        List<Integer> l=new ArrayList<Integer>();        l.add(i);        l.add(i);        System.out.println(l.get(0)==l.get(1)); //true   原因:只new了一个对象i</span><pre name="code" class="java"><span style="font-size:14px;">                int n=420;        List<Integer> l=new ArrayList<Integer>();        l.add(n);        l.add(n);        System.out.println(l.get(0)==l.get(1));  false//原因:自动生成两个Integer对象来封装n,两个对象肯定是两个不同hashCode,所以输出false</span>

http://bbs.csdn.net/topics/390639736?page=1
<span style="font-size:14px;">           Integer a=1;        Integer b=2;        Integer c=3;        Integer d=3;        <code class="java spaces"></code><code class="java plain">Long g=3L;</code>               System.out.println("c==d is:"+(c==d));   //true  <span>自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,</span> 存放在一个地方<span></span></span><span><span style="font-size:14px;">    </span></span><span style="font-size:14px;">         System.out.println("c==(a+b) is:"+(c==(a+b)));    //true   转为int        System.out.println("c.equals(a+b) is:"+(c.equals(a+b)));  //true</span><span style="font-size:14px;">        System.out.println("g==(a+b) is:"+(g==(a+b)));                //true  a+b拆箱为int,LONG拆箱为int,比较的是值</span><span style="font-size:14px;">        </span><pre name="code" class="java">        <span style="font-size:14px;"> System.out.println("g==(a+b) is:"+(g==c));     </span>           <span style="font-size:14px;">//编译不能通过,不同类型不能比较</span>

 System.out.println("g.equals(a+b) is:"+(g.equals(a+b)));//equals是值比较,但只能用作同类型的object作比较。 Long 对比Integer就相当于对比null。然后就false。 }
http://blog.csdn.net/jackiehff/article/details/8509056

<span style="font-size:14px;">Integer integer1 = 100; <span><span class="keyword">int</span><span> int1 = </span><span class="number">100</span><span>;</span></span><span>System.out.println(<span class="string">"integer1==int1: "</span><span> + (integer1 == int1));</span><span class="comment">// true  Integer缓存对象拆箱后与int比较</span><span>  </span></span></span>

1,Integer 的缓存[-127,128];

这就归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)。
为了加大对简单数字的重利用,java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象 

2, 其它基本数据类型对应的包装类型的自动装箱池大小

          Byte,Short,Long对应的是-128~127

          Character对应的是0~127

          Float和Double没有自动装箱池

3, Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率。通过上面的研究和测试,结论如下:

    (1)Integer和 int之间可以进行各种比较;Integer对象将自动拆箱后与int值比较

    (2)两个Integer对象之间也可以用>、<等符号比较大小;两个Integer对象都拆箱后,再比较大小

    (3) 两个Integer对象最好不要用==比较。因为:-128~127范围(一般是这个范围)内是取缓存内对象用,所以相等,该范围外是两个不同对象引用比较,所以不等。


http://blog.csdn.net/jairuschan/article/details/7513045


1,注意的问题

Integer integer100=null;  int int100=integer100; 这两行代码是完全合法的,完全能够通过编译的,但是在运行时,就会抛出空指针异常。其中,integer100为Integer类型的对象,它当然可以指向null。但在第二行时,就会对integer100进行拆箱,也就是对一个null对象执行intValue()方法,当然会抛出空指针异常。所以,有拆箱操作时一定要特别注意封装类对象是否为null。


























 

0 0
原创粉丝点击