3.包装类

包装类的关系图

Boolean(boolean)
Character(char)
Byte/Short/Integer/Long/Float/Double

包装类的应用

包装类与基本数据类型的转换

1)jdk5 前的手动装箱和拆箱方式,装箱 :基本类型--->包装类型,反之,拆箱

2)jdk5 以后(含jdk5)的自动装箱和拆箱方式。自动装箱底层调用的是valueOf方法,比如Integer.valueOf()

java 复制代码
 public static void main(String[] args) {
     int n = 10;
     //jdk5以前手动装箱
     Integer integer = new Integer(n);
     Integer integer1 = integer.valueOf(n);
     //jdk5以前手动拆箱
     int i = integer.intValue();
     //jdk5以后可以自动装箱和拆箱
     Integer integer2 = n; //底层是使用Integer.valueOf(n)。可以通过debug查看
     int n1 = integer2; //底层是使用intValue(n)。可以通过debug查看	
 }

自动装箱的几点说明:

  1. 由于包装器类引用可以为null,所以自动装箱有可能会抛出一个NullPointerException异常:

    java 复制代码
    Integer n = null; 
    System.out.println(2 * n); // Throws Nul1PointerException
  2. 如果在一个条件表达式中混合使用Integer和Double类型,Integer值就会拆箱,提升为double,再装箱为Double:

    java 复制代码
    Integer n = 1;
    Double x= 2.0;
    System.out.println(true ? n :x); // Prints 1.0 多种类型的数据混合运算/表达式时,系统首先会自动将所有数据转换成容量最大的那种数据类型
  3. 装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。

包装类的方法
包装类与string互转
java 复制代码
public static void main(String[] args) {
    //包装类->string
    Integer i = 100; //自动装箱
    //方式1
    String str1 = i + ""; //i本身没有什么变化
    //方式2
    String s = i.toString();
    //方式3
    String s1 = String.valueOf(i);
    //string->包装类
    String str = "1236";
    //方式1
    int i1 = Integer.parseInt(str);
    //方式2
    Integer integer = new Integer(str); //底层还是调用parseInt方法
}
常用方法
JAVA 复制代码
System.out.println(Integer.MIN_VALUE); //返回最小值
System.out.println(Integer.MAX_VALUE);//返回最大值
System.out.println(Character.isDigit('a'));//判断是不是数字
System.out.println(Character.isLetter('a'));//判断是不是字母
System.out.println(Character.isUpperCase('a'));//判断是不是大写
System.out.println(Character.isLowerCase('a'));//判断是不是小写
System.out.println(Character.isWhitespace('a'));//判断是不是空格
System.out.println(Character.toUpperCase('a'));//转成大写
System.out.println(Character.toLowerCase('a'));//转成小写
Integer的创建机制
java 复制代码
public static void main(String[] args) {
    Integer integer = new Integer(1);
    Integer integer1 = new Integer(1);
    System.out.println(integer == integer1); //两个都是new出来的对象,肯定不是同一对象。
    /**
         * 首先Integer i1 = 6 的底层是装箱使用的是Integer.valueOf(),
         * 所以要想弄清i1和i2是否是同一对象,必须查看源码。从源码得知,i1和i2不是同一对象;
         * 不清楚请弄清楚valueOf()的源码。
         */
    Integer i1 = 6;
    Integer i2 = 6;
    System.out.println(i1 == i2); //true 是同一对象

    /**
         * 首先Integer i3 = 360 的底层是装箱使用的是Integer.valueOf(),
         * 所以要想弄清i3和i4是否是同一对象,必须查看源码。从源码得知,i3和i4不是同一对象;
         * 不清楚请弄清楚valueOf()的源码。
         */
    Integer i3 = 360;
    Integer i4 = 360;
    System.out.println(i3 == i4); //false 不是同一对象

    //只要有基本数据类型参与都是相等。
    Integer i5 = 360;
    int i6 = 360;
    System.out.println(i5 == i6); //true
}

上边的示例一直强调逼逼着要弄清valueOf源码,追踪valueOf源码如下:

java 复制代码
public static Integer valueOf(int i) {
    //如果在这个范围内,不需要创建对象。IntegerCache.low = -128,IntegerCache.high=127
    if (i >= IntegerCache.low && i <= IntegerCache.high) 
        //通过debug调试模式可以看出,IntegerCache.cache数组存储的是-128~127的值
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);//如果不再就得要创建对象了。
}

包装类常用方法:

compare

compareTo

equals

hashCode

相关推荐
BeiGuTing_code1 小时前
Java动态数组(一)
java·数据结构·windows
我命由我123451 小时前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法
木易 士心2 小时前
Java 后端驱动远程手机自动化:ADB + Python + 内网穿透实战全解
java·后端·智能手机·自动化
十年Java程序媛2 小时前
JVM 内存区域与对象内存布局|new 对象底层流程,对象头 MarkWord 详解
java·jvm·spring boot
FRing032 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
用户094248568032 小时前
第2章:Windows、WSL2 与 Docker 环境搭建Redis
java·jvm
西索斯coding2 小时前
Grok 4.7 调用一直 401 怎么办?不是 Key 过期,是 Authorization 头格式问题——排查全流程 + 修复示例
服务器·开发语言·ai·php
小物学长2 小时前
HJ212-2017 对接与环境在线监测平台设计:报文、CRC、应答、预警和传输有效率
java
171320330计算机毕设编程2 小时前
计算机毕业设计 基于springboot+vue的在线观鸟视频播放网站 LW PPT
java·大数据·vue.js·spring boot·算法·课程设计