包装类

什么是包装类?

Java中的数据类型分为基本数据类型和引用数据类型,其中基本数据类型是不具有对象特征的,也就是说它们不能像对象一样拥有属性和方法,以及对象化交互。
包装类的产生就是为了解决基本数据类型存在的这样一些问题,通过包装类可以让基本数据类型获取对象一样的特征,行使对象相关的权力。

包装类与基本数据类型
特点

所有包装类都是使用final修饰的,不能被继承,其中数值型对应的包装类都是继承自Number
包装类是不可变类,包装类的对象被创建后,它所包含的基本类型数据就不能改变

作用

作为和基本数据类型对应的类类型存在,方便涉及到对象的操作
提供每种基本数据类型的相关属性如最大值、最小值等以及相关的操作方法

包装类的使用

1.与基本数据类型的转换

装箱:把基本数据类型转换成包装类,分为自动装箱和手动装箱
拆箱:把包装类转换成基本数据类型,分为自动拆箱和手动拆箱

装箱与拆箱示例:

    //装箱:把基本数据类型转换成包装类
    //1、自动装箱
    int t1=2;
    Integer t2=t1;
    //2、手动装箱:使用构造方法
    Integer t3=new Integer(t1);
    //拆箱:把包装类转换成基本数据类型
    //1、自动拆箱
    int t4=t2;
    //2、手动拆箱:使用intValue方法
    int t5=t2.intValue();
    //拆箱为其他基本数据类型,使用对应的xxxValue方法
    double t6 = t2.doubleValue(); //2.0
2.与字符串的转换

基本数据类型转换为字符串
— 使用包装类的toString()方法
字符串转换为基本数据类型
— 自动拆箱调用包装类的parseXxx()静态方法
— 调用包装类的valueOf()方法转换为基本类型的包装类,然后自动拆箱

示例:

    //基本数据类型转换为字符串
    int t1=2;
    String t2=Integer.toString(t1);
    //字符串转换为基本数据类型
    //1、包装类的parseXXX()
    int t3=Integer.parseInt(t2);
    //2、包装类的valueOf() 先将字符串转换为包装类,再通过自动拆箱完成基本类型转换
    int t4=Integer.valueOf(t2);
3.包装类对象间的比较
    Integer one=new Integer(100);
    Integer two=new Integer(100);
    //false: 通过new关键字创建对象会开辟两块不同的内存空间
    System.out.println(one == two);
    
    Integer three = 100;
    //true: 与数值比较时会自动拆箱
    System.out.println(three == 100);
    
    Integer four = 100;
    //实际java执行的代码是:Integer four = Integer.valueOf(100);
    //为了提高运行效率,在Integer内部提供了一个缓冲区(对象池),是一个静态内部类IntegerCache
    //当参数值在[-128,127]之间时,会从缓冲区去获取对应的Integer对象
    System.out.println(three == four); //true
    
    Integer five=200;
    System.out.println(five == 200); //true
    
    Integer six=200;
    System.out.println(five==six);//false,都是new出来的,而不是从缓冲区取

总结:通过new关键字创建对象其引用必然不相同,而如果使用valueOf方法则需要考虑是否会从对象常量池中取对象。
除了FloatDoubleBoolean外其他包装类都可以应用对象常量池概念。

包装类API

包装类的API很多都大同小异,尤其是对于IntegerLongShort类来说API基本一致,并且包装类的大多数成员都是静态成员,这里以Integer为例进行说明

1. 构造方法

除了Character类以外,一般均有两个构造方法

//a.以int型变量作为参数创建Integer对象
Integer num = new Integer(5);
//b.以String型变量作为参数创建Integer对象
Integer num = new Integer("5");

注意:boolean在使用String型参数构造对象时,仅当String值忽略大小写为true其值才为true,其他值均为false

2. 常用常量

MAX_VALUE:表示int型可取的最大值
MIN_VALUE:表示int型可取的最小值
SIZE:表示以二进制补码形式表示int值的位数
TYPE:所表示的基本类型

    //int类型可取的最大值:2147483647
    System.out.println(Integer.MAX_VALUE);
    //int类型可取的最小值:-2147483648
    System.out.println(Integer.MIN_VALUE);
    //char类型可取的最大值:65535
    System.out.println(Character.MAX_VALUE + 0); //加0转为int显示
    //char类型可取的最小值:0
    System.out.println(Character.MIN_VALUE + 0);
    //int类型的二进制位数:32
    System.out.println(Integer.SIZE);
    //所表示的基本类型:int
    System.out.println(Integer.TYPE); 
3. 常用方法

intValue():包装类转为int类型
valueOf():int类型转包装类
parseInt():字符串转int类型
toString():包装类转为字符串
与其他进制的转换:toHexString()十六进制、toOctalString()八进制、toBinaryString()二进制

4. Number类

抽象类Number是数值型(byte/short/int/long/float/double)包装类的父类。
Number类定义了一些数值型转换的方法并被Number的各子类所实现。

扩展

java的包装类除了基本类型对应的8个,还包括BigIntegerBigDecimal,它们没有对应的基本类型,主要用于高精度的运算。BigInteger支持任意精度的整数,BigDecimal支持任意精度带小数点的运算。

浮点数保留小数
    DecimalFormat formater = new DecimalFormat("#0.##"); //保留两位小数
    formater.setRoundingMode(RoundingMode.FLOOR); //地板,向下取整
    System.out.println(formater.format(123456.7897456)); //123456.78
BigInteger

不可变的任意精度的整数(而Integer有精度限制)
对象创建:BigInteger bi = new BigInteger("9999999999");

常用方法:(没有说明返回类型都是BigInteger)

add(BigInteger val) 加法运算
subtract(BigInteger val) 减法运算
multiply(BigInteger val) 乘法运算
divide(BigInteger val) 除法运算
remainder(BigInteger val) 取余数
divideAndRemainder(BigInteger val) 返回类型 BigInteger[]

BigDecimal

不可变的、任意精度的有符号十进制数,适用于对小数进行精确的计算
对象创建:BigDecimal bd = new BigDecimal("4099.99");
常用方法:同上,注意除法除不尽会报错

示例
    BigInteger bi = new BigInteger("9999999999");
    //Integer i = new Integer(9999999999); //超过int表示的范围
    BigInteger bi2 = new BigInteger("2");
    //计算
    //System.out.println(bi+bi2); //错误,引用类型不可以直接运算
    System.out.println(bi.add(bi2)); //10000000001
    System.out.println(bi.subtract(bi2)); //9999999997
    System.out.println(bi.multiply(bi2)); //19999999998
    System.out.println(bi.divide(bi2)); //4999999999
    System.out.println(bi.remainder(bi2)); //1
    BigInteger[] dar = bi.divideAndRemainder(bi2);
    System.out.println(Arrays.toString(dar)); //[4999999999, 1]
    double b = 4099.99;  //浮点数本身就是不精确的数据
    double b2 = 969.01;
    System.out.println(b-b2); //输出结果为:3130.9799999999996
    System.out.println();;    
    //使用BigDecimal解决double计算会丢失精度的问题,必须使用 String参数的构造器
    BigDecimal bd = new BigDecimal("4099.99");
    BigDecimal bd2 = new BigDecimal("969.01");
    System.out.println(bd.subtract(bd2)); //输出3130.98
    System.out.println(bd.add(bd2)); //5069.00
    System.out.println(bd.multiply(bd2)); //3972931.3099
    System.out.println(bd.divide(bd2)); //报错,除不尽(ArithmeticExceptions)
BigDecimal保留指定位数小数

方法:setScale(int newScale, RoundingMode roundingMode)
参数一表示保留几位小数,参数二表示四舍五入模式,主要有以下几种
BigDecimal.ROUND_DOWN:直接刪除多余的小数位,比如2.35会变成2.3
BigDecimal.ROUND_CEILING:向下取整,比如2.35会变成2.4
BigDecimal.ROUND_FLOOR:向上取整,比如2.35会变成2.3
BigDecimal.ROUND_HALF_EVEN:四舍五入,比如2.35会变成2.4
BigDecimal.ROUND_HALF_DOWN:四舍五入,但是2.35会变成2.3,其他同上

    BigDecimal ss = new BigDecimal("2.35");
    BigDecimal setScale = ss.setScale(1, BigDecimal.ROUND_HALF_EVEN);
    System.out.println(setScale); //2.4
    
    BigDecimal bd = new BigDecimal("20");
    //divide除不尽会报错,需要增加参数
    BigDecimal divide = bd.divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP); //6.67
浮点数保留小数
    DecimalFormat formater = new DecimalFormat("#0.##"); //保留两位小数
    formater.setRoundingMode(RoundingMode.FLOOR); //地板,向下取整
    System.out.println(formater.format(123456.7897456)); //123456.78

基本类型与包装类型的异同

  1. 在Java中,一切皆对象,但八大基本类型却不是对象
  2. 声明方式的不同,基本类型无需通过new关键字来创建,而包装类型需new关键字
  3. 存储方式及位置的不同,基本类型是直接存储变量的值保存在栈中能高效的存取,包装类型需要通过引用指向实例,具体的实例保存在堆中
  4. 初始值的不同,包装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0
  5. 使用方式的不同,比如与集合类合作使用时只能使用包装类型
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354