Java包装类

    xiaoxiao2021-03-25  15

    基本数据类型和其包装类

    Java共八种基本数据类型,六种数值类型:int,long,float,double,short,byte, 以及真假boolean和字符型char。

    每一个基本数据类型都对应着一个包装类,之所以需要包装类,是因为满足将基本数据类型当作一个对象来处理的需求。

    对应的包装类名是它们的大写全称字母:Integer,Long,Float,Double,Short,Byte,Boolean,Char。

    包装类对象的三种初始化方法:

    每一个包装类的对象都包含一个对应的基本数据类型的属性value,所有初始化方法都通过设置这个值完成初始化。

    1,valueOf()方法 Integer i=Integer.valueOf(1); 2,new方法 Integer i=new Integer(1); 3,“=”赋值方法 Integer i=1; “=”赋值实际上是虚拟机自动帮我们转化成了valueOf()实现,这种机制称为自动装箱

    包装类自动拆/装箱:

    如上所述的自动调用valueOf()是自动装箱,而同样有自动拆箱

    Integer i=3; int ii=i;

    在第二句代码运行时,虚拟机自动解析成了int ii=i.intValue();这就是自动拆箱。

    六种数值类包装类都继承Number抽象类,如下图。因此都具有XXXvalue()的方法,返回value的不同类型转换输出。

    而Character类和Boolean类不继承Number抽象类,但有charValue()方法和booleanValue()方法实现拆箱。

    包装类是不可变类

    包装类对象一经初始化,数值不可再变,即

    类声明为final; value属性声明为私有; 没有公共的setter方法。

    hashCode

    包装类都重写了hashCode()方法:

    对于Byte, Short, Integer, Character,hashCode就是其内部值,代码为:

    public int hashCode() { return (int)value; }

    对于Boolean,hashCode代码为:

    public int hashCode() { return value ? 1231 : 1237; }

    对于Long,是高32位与低32位进行位异或操作:

    public int hashCode() { return (int)(value ^ (value >>> 32)); }

    对于Float,hashCode代码为:

    public int hashCode() { return floatToIntBits(value); }

    floatToIntBits()方法是将浮点数转换成整形表示的方法。

    对于Double,hashCode代码为:

    public int hashCode() { long bits = doubleToLongBits(value); return (int)(bits ^ (bits >>> 32)); }

    方法和Float,Long类似。

    hashCode返回一个对象的哈希值,哈希值是一个int类型的数,由对象中一般不变的属性映射得来,用于快速对对象进行区分、分组等。一个对象的哈希值不能变,相同对象的哈希值必须一样。不同对象的哈希值一般应不同,但这不是必须的,可以有不同对象但哈希值相同的情况。

    equals

    equals也被重写,返回两个对象value值是否相等。

    compareTo

    所有的包装类都实现了Comparable接口,继承compareTo()方法

    toString

    转字符串,显而易见。

    包装类中的享元模式

    以Integer类为例,Integer类中有一个内部类IntegerCache,但被声明为static。这意味着它也会被放置于常量池管理。因为包装类都是不可变类,因此可以令value相同的实例共用相同的value常量,IntegerCache就是用于管理相应常量的类。Boolean/Byte/Short/Long/Character都有类似的实现。这种共享常用对象的思路,是一种常见的设计思路,在<设计模式>这本著作中,它被赋予了一个名字,叫享元模式,英文叫Flyweight,即共享的轻量级元素。

    转载请注明原文地址: https://ju.6miu.com/read-113481.html

    最新回复(0)