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

相关推荐
Wang's Blog2 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain3 小时前
C++转Java日记(03)
java·开发语言·c++
皮皮林5513 小时前
Java实现微信扫码登录
java
布莱克6053 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_6783 小时前
深挖C++:类和对象(中)
开发语言·c++
灿飞屋4 小时前
Rust 编程其实很简单
开发语言·rust
Yyyyyy~5 小时前
【Java】Day4Web基础知识
java·spring boot
MOONICK6 小时前
QT元数据
开发语言·qt
D e re k ZH6 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
灿飞屋7 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓