夯实Java基础(六)——包装类
1、包装类简介
我们都知道Java是面向对象编程语言,包含了8种基本数据类型,但是这8种基本数据类型并不支持面向对象的特征,它们既不是类,也不能调用方法。这在实际使用时存在很多的不便,比如int类型需要转换成字符串,为了解决这个不足。然后就出现了包装类,顾名思义,就是将这些基本数据类型封装在类中,并且提供丰富的方法来对数据进行操作。这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
Java中的包装类提供了将基本数据类型转换为对象,以及将对象转换为基本数据类型的机制。
其中Byte,Short,Integer,Float,Double,Long都属于Number子类。Character ,Boolean属于Object子类。它们的默认值都是NULL。
2、基本数据类型、包装类、字符串之间的转换
①、基本数据类型转换为包装类(装箱):调用包装类的构造器
- //基本数据类型——>包装类:调用包装类的构造器
- @Test
- public void test1(){
- int num=10;
- Integer i1=new Integer(num);
- System.out.println("i1结果:"+i1);
- Integer i2=new Integer("10");
- System.out.println("i2结果:"+i2);
- //报错,必须是纯数字,java.lang.NumberFormatException: For input string: "10abc"
- //Integer i3=new Integer("10abc");
- //System.out.println(i3);
- Double d1=new Double(12.3);
- Double d2=new Double("12.3");
- System.out.println("d1结果:"+d1);
- System.out.println("d1结果:"+d2);
- Boolean b1=new Boolean(true);
- Boolean b2=new Boolean("TrUe");
- Boolean b3=new Boolean("TrUe123");
- System.out.println("b1结果:"+b1);
- System.out.println("b2结果:"+b2);
- System.out.println("b3结果:"+b3);
- }
运行结果:
从运行的结果来看,通过调用包装类构造器可以将基本数据类型转为包装类,但是传入的参数必须合法,否则就像Integer那样会报错。可以看见Boolean包装类传入的字符串是忽略大写的,这是因为构造器中调用了parseBoolean(String s)方法,然后这个方法内部又调用了String方法的equalsIgnoreCase(String anotherString)方法,所以传入字符串会忽略大小写。而且你传入的是非法字符串它并不会报错,只是返回了false,这里需要注意一下。
②、包装类转换为基本数据类型(拆箱):调用包装类的Xxx的xxxValue()方法
- //包装类——>基本数据类型:调用包装类的Xxx的xxxValue()方法
- @Test
- public void test2(){
- Integer integer = new Integer(10);
- int i=integer.intValue();
- System.out.println(i+1);
- Double aDouble = new Double(10.11);
- double d=aDouble.doubleValue();
- System.out.println(d+1);
- Boolean aBoolean = new Boolean(false);
- boolean b=aBoolean.booleanValue();
- System.out.println(b);
- }
运行结果:
包装类转换为基本数据类型是非常简单的,只需要调用正确的方法即可,其他的包装类也是同样的道理。
你会发现前面两个点这样换来换去会非常的麻烦,其实从JDK5之后就变得非常简单了,这就要到后面介绍自动拆箱和自动装箱。
③、由于出现了自动拆箱和自动装箱,基本数据类型和包装类就可以看成一个整体。
基本数据类型、包装类转换为字符串:调用String重载的valueOf(Xxx xxx)
- //基本数据类型、包装类->字符串:调用String重载的valueOf(Xxx xxx)
- @Test
- public void test3(){
- int num=10;
- //方式1:连接运算
- String str1=num+"";
- System.out.println("str1结果"+str1);
- //方式2:调用String的valueOf(Xxx xx)方法
- int num1=15;
- String str2=String.valueOf(num1);
- System.out.println("str2结果"+str2);
- Integer integer=new Integer(21);
- String str3=String.valueOf(integer);
- System.out.println("str3结果"+str3);
- }
运行结果:
④、字符串转换为基本数据类型、包装类:调用包装类中的parseXxx()方法
- //字符串——>基本数据类型、包装类:调用包装类中的parseXxx()方法;
- @Test
- public void test5(){
- String str1="211";
- int num=Integer.parseInt(str1);
- System.out.println(num);
- //运行报错,ava.lang.NumberFormatException: For input string: "211abc"
- //String str2="211abc";
- //int num1=Integer.parseInt(str2);
- String str3="truetrue";
- boolean b=Boolean.parseBoolean(str3);
- System.out.println(b);
- }
运行结果:211、false。
无论怎样转换,数据的格式必须是正确的,否则就会报错,boolean特殊点,返回的是false。
最后它们三者的转换可以详细归结为:
1、基本数据类型与包装类之间转换:直接使用自动装箱和自动拆箱(后面会讲到,非常简单)。
2、基本数据类型、包装类转换为字符串:调用String的valueOf(Xxx xxx)方法。
3、字符串转换为基本数据类型、包装类:调用包装类的parseXxx()方法。
另外包装类中还有丰富的方法可供大家调用,如需学习可以自行查看包装类的API。
3、自动拆箱和自动装箱
将基本数据类型变成包装类称为装箱,将包装类的类型变为基本数据类型称为拆箱。
在JDK1.5之后,Java提供了自动装箱和自动拆箱功能。
下面来看一下案例:
- @Test
- public void test6(){
- int i=21;
- Integer integer=i;//自动装箱
- int j=integer;//自动拆箱
- double d=21.11;
- Double aDouble=d;
- double e=aDouble;
- }
由于出现了自动装箱和自动拆箱功能,所以基本数据类型和包装类之间的相互转换变得非常简单,再也不用去调用繁琐的方法了。
但是也会出现一些特殊的情况,案例如下:
- @Test
- public void test7(){
- Integer a=127;
- Integer b=127;
- System.out.println(a == b);
- Integer c=128;
- Integer d=128;
- System.out.println(c == d);
- }
运行结果:
运行的结果肯定会有很大的疑问?同样是两个int型自动装箱为包装类进行比较,为什么127比较返回是true,而128比较则返回了false。这是为什么呢?这与Java的Integer类的设计有关,查看Integer类的源代码,如下所示。
- private static class IntegerCache {
- static final int low = -128;
- static final int high;
- static final Integer cache[];
- static {
- // high value may be configured by property
- int h = 127;
- String integerCacheHighPropValue =
- sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
- if (integerCacheHighPropValue != null) {
- try {
- int i = parseInt(integerCacheHighPropValue);
- i = Math.max(i, 127);
- // Maximum array size is Integer.MAX_VALUE
- h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
- } catch( NumberFormatException nfe) {
- // If the property cannot be parsed into an int, ignore it.
- }
- }
- //将127赋给high变量
- high = h;
- //定义长度为256的Integer数组
- cache = new Integer[(high - low) + 1];
- int j = low;
- //执行初始化,创建-128~127的Integer实例,并放入cache[]数组中
- for(int k = 0; k < cache.length; k++)
- cache[k] = new Integer(j++);
- // range [-128, 127] must be interned (JLS7 5.1.7)
- assert IntegerCache.high >= 127;
- }
- private IntegerCache() {}
- }
从上面代码可以看出,Integer类中定义了一个IntegerCache内部类,内部类中定义了一个静态常量的Integer cache [ ]数组,而这个数组存储了从-128~127之间的整数自动装箱成Integer实例,如果我们使用自动装箱的方式,给Integer包装类赋值时,范围在-128~127之间,就可以直接使用数组中的元素,因为-128~127之间的同一个整数自动装箱成Integer实例时,永远是引用cache数组的同一个数组元素。如果超出了这个范围,自动装箱需要再重新new对象,所以就出现了程序中的运行结果。
4、小结
1、包装类的默认值都是NULL。
2、基本数据类型、包装类、字符串之间的转换可以归结为:
- 基本数据类型与包装类之间转换:直接使用自动装箱和自动拆箱。
- 基本数据类型、包装类转换为字符串:调用String的valueOf(Xxx xxx)方法。
- 字符串转换为基本数据类型、包装类:调用包装类的parseXxx()方法。
3、Integer类中默认存放值的范围是-128~127之间。
夯实Java基础(六)——包装类的更多相关文章
- 夯实Java基础系列目录
自进入大学以来,学习的编程语言从最初的C语言.C++,到后来的Java,. NET.而在学习编程语言的同时也逐渐决定了以后自己要学习的是哪一门语言(Java).到现在为止,学习Java语言也有很长一段 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...
- 夯实Java基础(十一)——内部类
1.内部类的概念 内部类顾名思义:将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.对于很多Java初学者来说,内部类学起来真的是一头雾水,根本理解不清楚是个什么东西,包括我自己(我太菜 ...
- 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!
目录 目录 string基础 Java String 类 创建字符串 StringDemo.java 文件代码: String基本用法 创建String对象的常用方法 String中常用的方法,用法如 ...
- 夯实Java基础系列4:一文了解final关键字的特性、使用方法,以及实现原理
目录 final使用 final变量 final修饰基本数据类型变量和引用 final类 final关键字的知识点 final关键字的最佳实践 final的用法 关于空白final final内存分配 ...
- 夯实Java基础系列5:Java文件和Java包结构
目录 Java中的包概念 包的作用 package 的目录结构 设置 CLASSPATH 系统变量 常用jar包 java软件包的类型 dt.jar rt.jar *.java文件的奥秘 *.Java ...
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...
- 夯实Java基础系列9:深入理解Class类和Object类
目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...
- 夯实Java基础系列10:深入理解Java中的异常体系
目录 为什么要使用异常 异常基本定义 异常体系 初识异常 异常和错误 异常的处理方式 "不负责任"的throws 纠结的finally throw : JRE也使用的关键字 异常调 ...
随机推荐
- 详解Linux运维工程师必备技能
张戈大神是腾讯的一名运维,张戈博客也是我接触到第一个 Linux 运维师的博客,最近也在接触 Linux,说到工具,在行外可以说是技能,在行内一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几 ...
- 高性能微服务网关.NETCore客户端Kong.Net开源发布
前言 项目地址:https://github.com/lianggx/Kong.Net 你的支持使我们更加强大,请单击 star 让更多的 .NETCore 认识它. 拥抱开源的脚步,我们从来都是一直 ...
- Ceph原理动画演示
动图生动刻画Ceph的基本原理之集群搭建及数据写入流程:)
- python的基本语法
编码 python3.0以上的版本,默认的源文件都是以UTF-8编码,所有的字符串都是unicode字符串,当然也可以为源文件指定不同的编码方式; 编码实例: #随机取一个变量 str = " ...
- HDU 4812:D Tree(树上点分治+逆元)
题目链接 题意 给一棵树,每个点上有一个权值,问是否存在一条路径(不能是单个点)上的所有点相乘并对1e6+3取模等于k,输出路径的两个端点.如果存在多组答案,输出字典序小的点对. 思路 首先,(a * ...
- C++一些知识的整理
1. C 和 C++ 区别 C++支持多种编程范式:面向对象编程.泛型编程.过程化编程.支持类.封装.重载等特性. c和c++的头文件不同. 输入输出不同. 变量的声明定义不同:c语言:变量要放在语句 ...
- 绝对是全网最好的Splay 入门详解——洛谷P3369&BZOJ3224: Tyvj 1728 普通平衡树 包教包会
平衡树是什么东西想必我就不用说太多了吧. 百度百科: 一个月之前的某天晚上,yuli巨佬为我们初步讲解了Splay,当时接触到了平衡树里的旋转等各种骚操作,感觉非常厉害.而第二天我调Splay的模板竟 ...
- 项目心得——mybatisplus注解
最近在做的项目中使用了mybatisplus,遇到了一些小问题,特此记录. 1.在sql查询后返回的数据中,会存在一些实体类中本没有的字段: 遇到这个问题时,我理所当然的就去实体类中添加了这个字段,但 ...
- Spring Boot 邮件发送的 5 种姿势!
邮件发送其实是一个非常常见的需求,用户注册,找回密码等地方,都会用到,使用 JavaSE 代码发送邮件,步骤还是挺繁琐的,Spring Boot 中对于邮件发送,提供了相关的自动化配置类,使得邮件发送 ...
- MyBatis 接口多参数的处理方法
From<MyBatis从入门到精通> 1.接口类中增加的方法: /* 2.7 多个接口参数的用法 多个参数时,可以选取的方案有:使用Map类型或者使用@Param注解 使用Map类型作为 ...