服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java基本类型和包装类型的区别

Java基本类型和包装类型的区别

2020-09-09 14:02崔笑颜 Java教程

这篇文章主要介绍了Java基本类型和包装类型的区别,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 的属性必须要用包装类型呢? 数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException 的异常。

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

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

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

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

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

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

Java基本类型和包装类型的区别

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

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

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

?
1
2
3
4
5
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 值是否相等。源码如下。

?
1
2
3
4
5
6
7
8
9
10
11
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,但他们并不相等。换句话说就是:将“==”操作符应用于包装类型比较的时候,其结果很可能会和预期的不符。

以上就是Java基本类型和包装类型的区别的详细内容,更多关于Java基本类型和包装类型的资料请关注服务器之家其它相关文章!

原文链接:https://cloud.tencent.com/developer/article/1639962

延伸 · 阅读

精彩推荐