精华内容
下载资源
问答
  • 面试官:兄弟,说说基本类型和包装类型的区别

    万次阅读 多人点赞 2019-09-29 08:36:07
    Java 的每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double。基本类型和包装类型的区别主要有以下 4 点。

    六年前,我从苏州回到洛阳,抱着一幅“海归”的心态,投了不少简历,也“约谈”了不少面试官,但仅有两三个令我感到满意。其中有一位叫老马,至今还活在我的手机通讯录里。他当时扔了一个面试题把我砸懵了:说说基本类型和包装类型的区别吧。

    我当时二十三岁,正值青春年华,从事 Java 编程已有 N 年经验(N < 4),自认为所有的面试题都能对答如流,结果没想到啊,被“刁难”了——原来洛阳这块互联网的荒漠也有技术专家啊。现在回想起来,脸上不自觉地泛起了羞愧的红晕:主要是自己当时太菜了。不管怎么说,是时候写篇文章剖析一下基本类型和包装类型的区别了。

    Java 的每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double。基本类型和包装类型的区别主要有以下 4 点。

    01、包装类型可以为 null,而基本类型不可以

    别小看这一点区别,它使得包装类型可以应用于 POJO 中,而基本类型则不行。

    POJO 是什么呢?这里稍微说明一下。

    POJO 的英文全称是 Plain Ordinary Java Object,翻译一下就是,简单无规则的 Java 对象,只有属性字段以及 setter 和 getter 方法,示例如下。

    class Writer {
    	private Integer age;
    	private String name;
    
    	public Integer getAge() {
    		return age;
    	}
    
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    

    和 POJO 类似的,还有数据传输对象 DTO(Data Transfer Object,泛指用于展示层与服务层之间的数据传输对象)、视图对象 VO(View Object,把某个页面的数据封装起来)、持久化对象 PO(Persistant Object,可以看成是与数据库中的表映射的 Java 对象)。

    那为什么 POJO 的属性必须要用包装类型呢?

    《阿里巴巴 Java 开发手册》上有详细的说明,我们来大声朗读一下(预备,起)。

    数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException 的异常。

    02、包装类型可用于泛型,而基本类型不可以

    泛型不能使用基本类型,因为使用基本类型时会编译出错。

    List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "Dimensions" to complete ReferenceType
    List<Integer> list = new ArrayList<>();
    

    为什么呢?因为泛型在编译时会进行类型擦除,最后只保留原始类型,而原始类型只能是 Object 类及其子类——基本类型是个特例。

    03、基本类型比包装类型更高效

    基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。

    很显然,相比较于基本类型而言,包装类型需要占用更多的内存空间。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过 new 一个包装类型就显得非常笨重。

    03、两个包装类型的值可以相同,但却不相等

    两个包装类型的值可以相同,但却不相等——这句话怎么理解呢?来看一段代码就明明白白了。

    Integer chenmo = new Integer(10);
    Integer wanger = new Integer(10);
    
    System.out.println(chenmo == wanger); // false
    System.out.println(chenmo.equals(wanger )); // true
    

    两个包装类型在使用“”进行判断的时候,判断的是其指向的地址是否相等。chenmo 和 wanger 两个变量使用了 new 关键字,导致它们在“”的时候输出了 false。

    chenmo.equals(wanger) 的输出结果为 true,是因为 equals 方法内部比较的是两个 int 值是否相等。源码如下。

    private final int value;
    
    public int intValue() {
        return value;
    }
    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    

    瞧,虽然 chenmo 和 wanger 的值都是 10,但他们并不相等。换句话说就是:将“==”操作符应用于包装类型比较的时候,其结果很可能会和预期的不符

    04、自动装箱和自动拆箱

    既然有了基本类型和包装类型,肯定有些时候要在它们之间进行转换。把基本类型转换成包装类型的过程叫做装箱(boxing)。反之,把包装类型转换成基本类型的过程叫做拆箱(unboxing)。

    在 Java SE5 之前,开发人员要手动进行装拆箱,比如说:

    Integer chenmo = new Integer(10);  // 手动装箱
    int wanger = chenmo.intValue();  // 手动拆箱
    

    Java SE5 为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能。

    Integer chenmo  = 10;  // 自动装箱
    int wanger = chenmo;     // 自动拆箱
    

    上面这段代码使用 JAD 反编译后的结果如下所示:

    Integer chenmo = Integer.valueOf(10);
    int wanger = chenmo.intValue();
    

    也就是说,自动装箱是通过 Integer.valueOf() 完成的;自动拆箱是通过 Integer.intValue() 完成的。理解了原理之后,我们再来看一道老马当年给我出的面试题。

    // 1)基本类型和包装类型
    int a = 100;
    Integer b = 100;
    System.out.println(a == b);
    
    // 2)两个包装类型
    Integer c = 100;
    Integer d = 100;
    System.out.println(c == d);
    
    // 3)
    c = 200;
    d = 200;
    System.out.println(c == d);
    

    答案是什么呢?有举手要回答的吗?答对的奖励一朵小红花哦。

    第一段代码,基本类型和包装类型进行 == 比较,这时候 b 会自动拆箱,直接和 a 比较值,所以结果为 true。

    第二段代码,两个包装类型都被赋值为了 100,这时候会进行自动装箱,那 == 的结果会是什么呢?

    我们之前的结论是:将“==”操作符应用于包装类型比较的时候,其结果很可能会和预期的不符。那结果是 false?但这次的结果却是 true,是不是感觉很意外?

    第三段代码,两个包装类型重新被赋值为了 200,这时候仍然会进行自动装箱,那 == 的结果会是什么呢?

    吃了第二段代码的亏后,是不是有点怀疑人生了,这次结果是 true 还是 false 呢?扔个硬币吧,哈哈。我先告诉你结果吧,false。

    为什么?为什么?为什么呢?

    事情到了这一步,必须使出杀手锏了——分析源码吧。

    之前我们已经知道了,自动装箱是通过 Integer.valueOf() 完成的,那我们就来看看这个方法的源码吧。

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    

    难不成是 IntegerCache 在作怪?你猜对了!

    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
    
        static {
            // high value may be configured by property
            int h = 127;
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i, 127);
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            high = h;
    
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
    
            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }
    }
    

    大致瞟一下这段代码你就全明白了。-128 到 127 之间的数会从 IntegerCache 中取,然后比较,所以第二段代码(100 在这个范围之内)的结果是 true,而第三段代码(200 不在这个范围之内,所以 new 出来了两个 Integer 对象)的结果是 false。

    看完上面的分析之后,我希望大家记住一点:当需要进行自动装箱时,如果数字在 -128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象

    自动装拆箱是一个很好的功能,大大节省了我们开发人员的精力,但也会引发一些麻烦,比如下面这段代码,性能就很差。

    long t1 = System.currentTimeMillis();
    Long sum = 0L;
    for (int i = 0; i < Integer.MAX_VALUE;i++) {
        sum += i;
    }
    long t2 = System.currentTimeMillis();        
    System.out.println(t2-t1);
    

    sum 由于被声明成了包装类型 Long 而不是基本类型 long,所以 sum += i 进行了大量的拆装箱操作(sum 先拆箱和 i 相加,然后再装箱赋值给 sum),导致这段代码运行完花费的时间足足有 2986 毫秒;如果把 sum 换成基本类型 long,时间就仅有 554 毫秒,完全不一个等量级啊。

    05、最后

    谢谢大家的阅读,原创不易,喜欢就点个赞,这将是我最强的写作动力。如果你觉得文章对你有所帮助,也蛮有趣的,就关注一下我的公众号,谢谢。

    展开全文
  • 基本类型和包装类区别

    万次阅读 2018-03-24 16:02:52
    区别: 1.基本类型存储在栈里,包装类型存储在堆里。因为栈的效率更高,所以保留了基本类型。 2.包装类是对象,拥有方法字段,对象的调用是引用对象的地址。... 基本类型包装类 以及其默认值,包装...

        区别:

        1.基本类型存储在栈里,包装类型存储在堆里。因为栈的效率更高,所以保留了基本类型。

        2.包装类是对象,拥有方法和字段,对象的调用是引用对象的地址。

        3.基本类型是值传递,包装类是引用传递。

        4.向ArrayList,LinkedList中放数据的时候,只能放Object类型的,基本类型放不进去。

        基本类型,包装类 以及其默认值,包装类的默认值为Null。

        byte         0            Byte            

        short        0            Short

        int            0            Integer         

        long        0             Long

        float        0.0          Float

        double    0.0          Double

        char        空格        Character

        boolean    false       Boolean

    展开全文
  • 在Java初学阶段,想必很多人都会先学Java中的一些基本类型以及他们的包装类,如下 int --> Integer long --> Long double --> Double ...等等 很多人在学的时候感觉这用处不大啊,也不知道什么时候用,该...

    在Java初学阶段,想必很多人都会先学Java中的一些基本类型以及他们的包装类,如下

    int --> Integer
    long --> Long
    double --> Double
    ...等等
    

    很多人在学的时候感觉这用处不大啊,也不知道什么时候用,该怎么用。接下来是楼主的一些见解,也是工作中算最常用到的,如果有大神看到文章觉得我说的不对,请指出我的问题。

    我们这拿int基本类型来举例。

    1.基本类型的包装类是复杂类型

    Integer为复杂类型,具有一些与其他类型转换的方法。而基本类型做不到。

    String str="1";
    Integer.parseInt(str)
    2.基本类型默认为0,包装类型为NULL

    楼主这就不讲什么底层原理七七八八,直接就是讲最直接的比较,我们这用一个Student类来解释。

    public class Student{
        private String name;//学生名称
        private int score;//学生成绩
    }
    

    这里如果是一场考试的话,那么这场考试中 int 类型只能表示一种情况,学生来考试了,只不过有成绩和0分。

    但是真正的情况下,还有一种情况,那就是这学生没来考试。 我们要知道,0分跟没来严格来说是由区别的,那么这时候包装类默认类型为NULL就派上用场了。这也是楼主当初理解包装类和基本类型最直接的一种理解方式了。

    3.如何使用基本类型和包装类型

    大部分情况下,使用这两种类型不会有太大区别。但是楼主在开发过程中,最常用的还是在定义属性的时候,会根据这个对象的要求来去定义是包装类型还是基本类型。

    举例1:对象中有返回的统计属性 还拿学生成绩来说,返回三科总成绩,楼主就习惯会用int,因为已经说到统计,你肯定得让这个字段存在,如果真的没有,那就默认统计为0。

    举例2:张三去没去考试,结果只会出现去 或者没去 ,boolean基本类型 默认值是false,设置了true才会是true。

    总结

    用基本类型还是包装类型 只要你在开发中经常写,遇到情况的时候你就深有体会,渐渐的你也懂我上面说的意思,总的来说就是结果或者你希望的结果只有2种情况的时候 你就用基本类型,想让他存在NULL的情况就用包装类型。

    展开全文
  • Java中基本数据类型和包装类型区别

    万次阅读 多人点赞 2019-02-26 16:48:05
    1、包装类是对象,拥有方法字段,对象的调用都是通过引用对象的地址;基本类型不是 2、包装类型是引用的传递;基本类型是值的传递 3、声明方式不同: 基本数据类型不需要new关键字; 包装类型需要new在堆内存中...

    1、包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址;基本类型不是 
    2、包装类型是引用的传递;基本类型是值的传递 
    3、声明方式不同:
                    基本数据类型不需要new关键字;
                    包装类型需要new在堆内存中进行new来分配内存空间 
    4、存储位置不同:
                    基本数据类型直接将值保存在值栈中;
                    包装类型是把对象放在堆中,然后通过对象的引用来调用他们 
    5、初始值不同:
                    int的初始值为 0 、 boolean的初始值为false 
                    包装类型的初始值为null 
    6、使用方式不同:
                    基本数据类型直接赋值使用就好;
                    包装类型是在集合如 coolectionMap时使用
     

    展开全文
  • 基本类型和包装类型的区别详解

    千次阅读 多人点赞 2019-11-30 22:20:01
    他当时扔了一个面试题把我砸懵了:说说基本类型和包装类型的区别吧。 我当时二十三岁,正值青春年华,从事 Java 编程已有 N 年经验(N < 4),自认为所有的面试题都能对答如流,结果没想到啊,被“刁难”了——...
  • 包装类和基本数据类型区别

    千次阅读 2018-01-25 14:18:18
    基本数据类型的 优点: 1.计算的效率高 2.不会由于常量池引起比较大小错误(比较数据更准确) 缺点 1.当数据库查询出结果封装到结果集时,如何返回的值为null时,会将结果赋值给字段,运行时会报错,不能将null值赋值...
  • 包装类和基本类型

    万次阅读 多人点赞 2019-03-06 09:18:53
    什么是包装类 所谓包装类,就是能够直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类包装类 ...基本类型与包装类型的区别1、在Java中,一切皆对象,...
  • 基本类型包装类对象使用 == equals进行比较的结果 1、值不同,使用==equals比较都返回false 2、值相同 使用==比较: 基本类型基本类型基本类型-包装对象返回true 包装对象-包装对象返回...
  • 基本数据类型和包装类进行比较

    千次阅读 2018-08-16 09:46:46
    1、基本和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;  int a = 220;  Integer b = 220;  System...
  • Java基本类型和包装类型总结

    万次阅读 多人点赞 2017-07-19 12:36:40
    1.Java的基本类型及其对应的包装Java有8种基本类型:大致分为3:字符,布尔,数值类型(在java中数值是不存在无符号的,这一点不像C/C++,他们的取值范围是固定的,不会随着机器硬件的环境或者操作系统的改变...
  • java基本类型和包装类型的区别

    千次阅读 2019-02-24 14:01:29
    1、为什么存在基本类型: 在Java中正常应该设置对象,然后通过new一... 包装类型相当于将基本类型包装起来,使其具有对象的性质,并且可以添加属性方法,丰富了基本类型的操作。 (2)包装类型具有哪些好处:  ...
  • 基本类型和包装类之间的转换基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦):在 JDK1.5 引入自动装箱拆箱的机制后,包装类和基本类型之间的转换就更加轻松便利了。...
  • 基本数据类型与其包装类的比较

    千次阅读 2018-02-08 20:15:28
    在java中不能定义基本数据类型对象,为了能将基本数据类型视为对象处理,并且能够调用方法简化其使用过程,java为每个基本类型都提供了包装类。 下面是8种基本数据类型图解 下面是基本数据类型及其包装类对照表...
  • JVM - 基本类型包装类和对象池

    千次阅读 2020-07-11 23:07:17
    接下来我们也顺便看下基本类型包装类和起对应的对象池 JDK1.8 八大基本类型 Java基本类型共有八种,基本类型可以分为三类, 字符类型char 布尔类型boolean 数值类型byte、short、int、long、float、double ...
  • java包装类型作用,和基本类型区别

    千次阅读 2018-09-18 14:27:00
    Java中的8种基本数据类型都有对应的对象类型,但是既然有了基本数据类型,包装类型有什么作用呢?它们有什么区别呢? 答案是包装类型的出现是为了方便对基本类型进行操作。包装类型可以解决一些基本...2.基本类型和...
  • Java 中基本类型和包装类之间的转换

    千次阅读 2016-09-26 08:56:50
    Java 中基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱拆箱的机制后,包装类和基本类型之间的转换...
  • java八种基本数据类型包装类详解

    万次阅读 多人点赞 2018-12-20 10:14:40
    详解一、八种基本数据类型常识 1.1、基本常识表 对于上图有以下几点需要注意: java八种基本数据类型分为四类八种,四类分别为整型、浮点型、布尔型、字符型;八种分别为byte、short、int、long、float、double...
  • 如图所见,我们在定义(八种基本数据类型)Int a 时,引用(地址)在栈空间,内容在常量池。a通过地址找到其内容。而Integer(引用类型)定义的东西也在栈空间,但是其内容在堆空间。 先看看下面的几道题目 do....
  • 本人最近找工作,在面试javase基础这里,有很多公司还是喜欢考察基本数据类型和包装类型的使用情况,重点就是考察日常生活中对数据类型的选定还有使用场景做考察,比如问基本数据类型的占几个字节,取值范围多少、...
  • 变量尽量不要定义为包装类,尽量使用基本类型。intInteger的区别1.存储原理不一样: int:属于简单类型,不存在“引用”这个概念;其数据是存储在栈空间中; Integer:属于继承自Object的类,是按照java存储对象的...
  • 基本数据类型和封装类型区别

    千次阅读 多人点赞 2019-09-23 13:27:34
    基本数据类型和封装类型区别基本数据类型基本数据类型介绍封装数据类型基本数据类型对应的封装介绍基本数据类型与封装对应关系对照表String他们的区别总结合理的创建标题,有助于目录的生成如何改变文本的...
  • 什么是包装类? java中的基本数据类型如int,double等不是对象,无法通过向上转型获取到Object提供的方法. 而String却可以,因为String是一个对象而不是一个...包装类顾名思义就是将基本的数据类型以及一些辅助方法...
  • eg 基本类型默认为有值的 用包装类不传值得是否默认为空 mybatisplus进行操作时更容易进行是否非空的判断
  • Java包装类基本类型进行比较的坑

    千次阅读 2017-08-09 18:58:19
    Java包装类基本类型进行比较的坑
  • 问题:两者都为引用类型,为什么第一种情况能得到修改过后的值,而第二种不能? // 案例1 Customer customer = new Customer(); customer.setCust_name("aaa"); List&lt;Customer&gt; ...
  • 基本类型和字符串的相互转换 基本类型转字符串: 最常用: 直接把这个数字加上空字符串 1. 12 + "" 其他方法:不常用 2. 使用String的静态方法valueOf进行转换 3. 调用其包装类的toString方法。 ...
  • JAVA八大基本类型包装类

    千次阅读 2019-05-15 19:45:53
    Java有八大基本类型包装类,分别是: byte 包装类是 Byte short包装类是 Short int 包装类是 Integer long 包装类是 Long float 包装类是 Float double 包装类是 Double char 包装类是 Character boolean...
  • 1、包装类是对象,拥有方法字段,对象的调用都是通过引用对象的地址,基本类型不是 2、包装类型是引用的传递,基本类型是值的传递 3、声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 226,536
精华内容 90,614
关键字:

包装类和基本类型区别