• Java包装类


    一、什么是包装类

    java.lang包中的Integer类、Long类和Short类,分别将基本类型int、long和short封装成一个类。由于这些类都是Number的子类,区别就是封装不同的数据类型,其包含的方法基本相同

    Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。

    就是能够直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。

    二、包装类用途

    1.集合不允许存放基本数据类型,故常用包装类
    2.包含了每种基本类型的相关属性,如最大值,最小值,所占位数等
    3.作为基本数据类型对应的类类型,提供了一系列实用的对象操作,如类型转换,进制转换等

    三、基本类型与包装类型的区别1、在Java中,一切皆对象,但八大基本类型却不是对象。

    2、声明方式的不同,基本类型无需通过new关键字来创建,而封装类型需new关键字。
    3、存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,封装类型需要通过引用指向实例,具体的实例保存在堆中。
    4、初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false;
    5、使用方式的不同,比如与集合类合作使用时只能使用包装类型。
    6、什么时候该用包装类,什么时候用基本类型,看基本的业务来定:这个字段允允许null值,就需要使用包装类型,如果不允许null值,,使用基本类型就可以了,用到比如泛型和反射调用函数,就需要用包装类!

    所以最基本的一点区别是:Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。除此之外还有区别,请看代码:

     1 ublic class TestInteger {
     2     public static void main(String[] args) {
     3         int i = 128;
     4         Integer i2 = 128;
     5         Integer i3 = new Integer(128);
     6         System.out.println(i == i2); //Integer会自动拆箱为int,所以为true
     7         System.out.println(i == i3); //true,理由同上
     8         Integer i4 = 127;//编译时被翻译成:Integer i4 = Integer.valueOf(127);
     9         Integer i5 = 127;
    10         System.out.println(i4 == i5);//true
    11         Integer i6 = 128;
    12         Integer i7 = 128;
    13         System.out.println(i6 == i7);//false
    14         Integer i8 = new Integer(127);
    15         System.out.println(i5 == i8); //false
    16         Integer i9 = new Integer(128);
    17         Integer i10 = new Integer(123);
    18         System.out.println(i9 == i10);  //false
    19     }
    20 }

    为什么i4和i5比是true,而i6和i7比是false呢?关键就是看valueOf()函数了,这个函数对于-128到127之间的数,会进行缓存, Integer i4 = 127时,会将127进行缓存,下次再写Integer i5 = 127时,就会直接从缓存中取,就不会new了。所以i4和i5比是true,而i6和i7比是false。

    而对于后边的i5和i8,以及i9和i10,因为对象不一样,所以为false。

    以上的情况总结如下:

    1,无论如何,Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。

    2,两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。

    3,两个都是new出来的,都为false。还是内存地址不一样。

    4,int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。

    参考:https://blog.csdn.net/weixin_38361153/article/details/88218744

    四、基本数据类型和包装类的转换

      通过包装类Integer.toString()将整型转换为字符串;

      通过Integer.parseInt()将字符串转换为int类型;

      通过valueOf()方法把字符串转换为包装类然后通过自动拆箱。

     1 package com.swpu;
     2 
     3 public class WrapperTestTwo {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         //基本数据类型转换为字符串
     8         int t1=12;
     9         String t2=Integer.toString(t1);
    10         System.out.println("int转换为String:"+t2);
    11         //字符串转换为基本数据类型
    12         //通过paerInt方法
    13         int t3=Integer.parseInt(t2);
    14         //通过valeOf,先把字符串转换为包装类然后通过自动拆箱
    15         int t4=Integer.valueOf(t2);
    16         System.out.println("t3:"+t3);
    17         System.out.println("t4:"+t4);
    18 
    19     }
    20 
    21 }

    五、包装类常用方法

    https://jingyan.baidu.com/article/ab69b270a3fe222ca7189f90.html

    六、深入剖析Java中的装箱和拆箱

    http://www.cnblogs.com/dolphin0520/p/3780005.html

  • 相关阅读:
    C语言 · 字符串输入输出函数
    C语言 · 判定字符位置
    剑指offer二之替换空格
    剑指offer一之二维数组中的查找
    算法复杂度:时间复杂度与空间复杂度
    二分查找法
    信息熵
    K-means算法的原理、优缺点及改进(转)
    office2013安装与卸载
    Deep Learning (中文版&英文版)
  • 原文地址:https://www.cnblogs.com/qiaoxin11/p/12534557.html
Copyright © 2020-2023  润新知