zoukankan      html  css  js  c++  java
  • 自动装箱和自动拆箱

    1.什么是自动装箱和自动拆箱

    java中为没一种基本类型都提供相应的包装类型。

    byte,short,char,int,long,float,double和boolean

    Byte,Short,Character,Integer,Long,Float,Double,Boolean。

    自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。

    2.原理

    例如:Integer i = 100;

    Java虚拟机会自动调用Integer的valueOf方法,编译为:Integer i = Integer.valueOf(100);

    拆箱:

    Integer i = 10; //装箱 
    int t = i; 

    Java虚拟机会自动调用Integer的intValue方法, 编译为:int t=i.Integer.intValue();

    3.注意的问题:

    1.自动装箱和拆箱,要注意空指针的问题。 拆箱的如果为Null,则会报空指针异常。

    2.缓存问题。

    第一段代码:

    public class TestMain
    {
        public static void main(String[] args)
        {
            Integer i1 = 100;
            Integer i2 = 100;
            Integer i3 = 200;
            Integer i4 = 200;
            
            System.out.println(i1 == i2);
            System.out.println(i3 == i4);
        }
    }
    

      运行结果为:

    true
    false
    

      第二段代码:

    public class TestMain
    {
        public static void main(String[] args)
        {
            Double d1 = 100.0;
            Double d2 = 100.0;
            Double d3 = 200.0;
            Double d4 = 200.0;
            
            System.out.println(d1 == d2);
            System.out.println(d3 == d4);
        }
    }
    

     运行结果:

    false
    false
    

      

     说明:

    equals() 比较的是两个对象的值(内容)是否相同。

    "==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。

    产生上面的结果的原因是:Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法是以128位分界线做了缓存的,假如是128以下且-128以上的值是会取缓存里面的引用的,以Integer为例,其valueOf(int i)的源代码为:

    public static Integer valueOf(int i) {
        final int offset = 128;
        if (i >= -128 && i <= 127) { // must cache 
            return IntegerCache.cache[i + offset];
        }
            return new Integer(i);
        }
    

      

    而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。关于这个小知识点,个人提出两点意见:

    1、不重要,除了面试考察求职者对于知识的掌握程度,没多大用

    2、要有缓存这个概念,缓存对于提高程序运行效率、节省内存空间是有很大帮助的

    转载地址:http://www.cnblogs.com/xrq730/p/4869065.html

  • 相关阅读:
    Android 单元测试
    Android 读取和保存文件(手机内置存储器)
    Android 检查是否安装SD卡
    Android 检测网络是否可用
    Android 获取网络链接类型
    Android 中如何使用动画
    Ubuntu 下对ADT 添加别名(alias)
    Docker 配置固定IP及桥接的实现方法(转载)
    macOS下通过docker在局域网成功访问mysql5.6数据库
    MySQL 8.0 Docker使用注解
  • 原文地址:https://www.cnblogs.com/haitaofeiyang/p/7711558.html
Copyright © 2011-2022 走看看