有了基本数据类型,为什么还需要包装类型(代码片段)

lbky lbky     2023-05-01     478

关键词:

一:java数据类型

  在java中有八种基本数据类型对应每种基本类型又有八种包装类型:

  基本类型:boolean, char, int, byte,short,long, float,double

  包装器类型:Boolean,Character,Integer,Byte,Short,Long,Float,Double

  从上面我们可以看到除了 char和int其它的包装类型名称和对应的基本类型一样只是首字母大写了。

二:为什么会有包装类

  既然有了基本类型为什么还要有包装类呢?我们在使用的过程中究竟用基本类型还是包装类呢?在某些场合不能使用基本类型必须使用包装类,比如集合能接收的类型为Object,基本类型是无法添加进去的,还有范型也必须使用包装类。另外假设我们要定义一个变量表示分数 如果用基本类型表示的话:int score;默认值为零,如果我想表示分数为空也就是没有参加考试就没法表现了因为值类型是无法赋空值的,如果使用包装类型Integer score,就可以表示这种情况,因为Integer的默认值为空。包装类型是引用类型,说白了就是一个类,既然是类,里面可以有属性和方法,它里面有哪些属性和方法呢?每个包装类型和基本数据类型都是大同小异的,我们拿Integer 和 int来举例说明,假设有这样一个场景,我接收到一个String型的数据想把它转换为整型,如果没有包装类这个操作是无法完成的,有了包装类我们可以这样做:

String num1 = "123";
int num2 = Integer.parseInt(num1);

  parseInt就是Integer包装类提供的一个将字符串转成int型的方法。包装类还有一个很重要的特新就是数据缓存:还是拿Integer来举例,在-128~127区间的数会被缓存,当类加载的时候就创建这256个数对应的对象,并放到名为cache的数组中,调用valueOf()方法时会先判断该数是否在-128~127的区间,如果在则直接获取数组中该对象的引用,如果不在则创建该对象。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.low为-128,IntegeCache.high为127,IntegerCache.cache为数组存储的就是-128到127的Integer对象。在自动装箱的时候调用的就是valueOf方法,我们来看下面这段代码:

public static void main(String[] args) 
        Integer num1 = 4;
        Integer num2 = 4;
        System.out.println(num1==num2);
        System.out.println(num1.equals(num2));
        Integer num3 = 145;
        Integer num4 = 145;
        System.out.println(num3==num4);
        System.out.println(num3.equals(num4));

  运行结果是:

true
true
false
true

  为什么会是这个结果呢?

  Integer num1 = 4,这里发生了自动装箱,调用了ValueOf()方法,因为4在-128~127之间所以num1和num2都指向了缓存中的同一地址,所以用==比较和equls比较返回的都是true.

  Integer num3 = 145,因为145不在这个范围区间,所以会在堆中生成对象num3和num4分别指向两个不同地址的对象,所以===返回false。从这个例子我们可以看出,如果要进行比较最好使用equals,如果使用==在数值范围不同的情况下得到的结果也是不同的。

  各包装类缓存的取值范围:

  Boolean:使用静态 final 定义;

  Byte:缓存区 -128~127

  Short:缓存区 -128~127;

  Character:缓存区 0~127;

  Long:缓存区 -128~127;

  Integer:缓存区 -128~127。

  Float 和 Double 不会有缓存。

  那么具体什么时候使用基本数据类型什么时候使用包装类呢?有一个典型的场景,比如在控制器中接收一个参数该参数定义成了基本数据类型int那么传过来的参数如果为空则会报空指针错误,如果定义为其包装类型Integer则不会报错,而是得到一个null值。所以在RPC方法里面参数和返回值类型都需要用包装类。我们再来看一个情况:Pojo类中如果定义成基本类型,数据库中对应的字段为空的时候映射时会出问题。因为基本类型不能赋null。所以在Pojo类中数据类型都需要定义成包装类。如果是局部变量我们一般定义成基本类型,因为基本类型存储在栈上,方法执行完毕,栈上的内存空间也随之释放。

三:总结

(1)为什么会有包装类?

  1. 包装类里面有一些很有用的方法和属性,如HashCode,ParseInt;

  2. 基本类型不能赋null值,某些场合需要;

  3. 很多地方不能直接用基本类型,比如集合,范型;

  4. 包装类的缓存提高了存取效率。

(2)什么时候用包装类,什么时候用基本类型?

  1. 在pojo类中定义的属性用包装类;

  2. 在rpc方法中定义参数和返回值的类型用包装类;

  3. 定义局部变量用基本类型。

为什么hashmap中key是引用类型而不是基本数据类型?为什么有了基本数据类型还有包装类型?

 为什么HashMap中key是引用类型而不是基本数据类型?最主要的原因是,hashmap中不能存储重复值,因此在存入值的时候,需要用到存储对象的hashcode()和equals()方法进行判断,而基本数据类型是没有这两个方法的。因此HashMap中key... 查看详情

java中有了基本类型为什么还要有包装类型?

java中有了基本类型为什么还要有包装类型?1、Java中基本数据类型与包装类型有:基本类型包装器类型父类booleanBooleanjava.lang.BooleanintIntegerjava.lang.NumbercharCharacterjava.lang.CharacterbyteBytejava.lang.NumbershortShortjava.lang.NumberlongLong 查看详情

基本类型包装类(代码片段)

基本类型包装类需求问题:在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的。而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型,考试成绩需要... 查看详情

java包装器类型(代码片段)

一、为什么要使用包装器类型  java是面向对象的语言,但基本类型并不是面向对象的,从而出现了包装器类型,并且包装器添加了更多的属性和方法。如我们在使用集合类型Collection的时候就一定要使用包装类型而非基本类型... 查看详情

基本类型包装拆装箱(代码片段)

基本类型包装就是转换用8个类型就是8个方法 除了int(Integer)和char(Character)之外,其他6个都是字符串转成基本类型得出结论想转成什么类型就用parase转成什么类型基本数据类型转字符串3种publicstaticvoidmain(String[]args)//字符... 查看详情

java中的包装类(代码片段)

...单,为了让基本数据类型也具备对象的特征,就有了JAVA包装类,包装类就是:将基本数据类型包装成对象,使其具 查看详情

第3章包装类&正则表达式(代码片段)

...开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型,考试成绩需要转换成double类型等。那么,想实现字符串与基本数据之间转换怎么办呢?Java中提供了相应的对象来解决该问题,... 查看详情

包装类(代码片段)

...loatFloatdoubleDoublecharCharacterbooleanBoolean包装类在java.lang包中为什么提供包装类?为了编程方便包装类对象的创建(构造方法)1.Java会把这些基本类型数据自动转换为包装类对象publicstaticvoidm1(Objectobj)publicstaticvoidmain(String[]args)m1(true);m1(456... 查看详情

在java中为什么每一个基本类型都有一个包装类型,他们的区别又是什么

...言具有更为强大的功能。这些类就被称为包装类型。2、为什么需要包装类型    Java是一个面向对象的编程语言,一般是创建一个新的对象储存在堆里,然后我们通过栈中的引用来使用这些对象。所以Java中和C++一... 查看详情

基本类型包装类system类(代码片段)

一基本数据类型包装类8种基本数据类型对应的包装类:字节型byte:Byte短整型short:Short整型int:Integer长整型long:Long字符型char:Character布尔型boolean: Boolean浮点型float:Float浮点型double:Double其中需要注意int对应的是Integer,cha... 查看详情

integer(代码片段)

  为什么java要提供8中包装呢?packagecom.javaSe.Integer;/*1java中为8种基本数据类型有对应准备了8种包装类型。8种包装类属于引用数据类型。父类是Object2思考:为什么要再提供8种包装类呢?因为8种基本数据类型不够用。所以S... 查看详情

java小白训练营day03-数据结构:基本类型+包装类型+数组+对象(代码片段)

...章目录程序数据结构非常丰富java中把数据类型分类:为什么java中要有基本类型呢?基本类型需求:有两个整数100、200使用什么类型存储合适?需求:有10亿(9个0)和100亿(10个0)区别?类... 查看详情

java_包装类和缓冲区(代码片段)

...据类型定义相应的引用类型—包装类(封装类)有了类的特点,就可以调用类中的方法,Java才是真正的面向对象基本数据类型包装成包装类的实例—装箱装箱通过包装类的构造器实现:inti=500;Integert=newIn... 查看详情

装箱与拆箱(代码片段)

...与拆箱什么是装箱与拆箱描述语言描述,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。代码描述就是:Integerinteger=100;//自动装箱inti=integer;//自动拆箱基本技术类型对应的包装... 查看详情

java包装类(代码片段)

一.什么是包装类    Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。 数值型包装类都继承至Number,而字符型和布尔型继承至Object。二.基本数据和包装类之间的转换 ... 查看详情

你不知道的基本数据类型和包装类+面试题(代码片段)

你不知道的基本数据类型和包装类+面试题基本数据类型Java基本数据按类型可以分为四大类:布尔型、整数型、浮点型、字符型,这四大类包含8种基本数据类型。布尔型:boolean整数型:byte、short、int、long浮点型:float、double字... 查看详情

javascript之基本包装类型

...但这又不是一个真正的对象只是一个变量而已,那么这是为什么呢?1varstr=" 查看详情

java从小白开始的练习(包装类)(代码片段)

...源码分析)包装类什么是包装类?当我们需要对基本数据类型进行操作时,因为基本数据类型没有方法,不好操作,这就引用出来包装类,根据面向对象的思想“万物皆对象”,Java就对基本进行了封装... 查看详情