Java 八大包装类(超详细!)

时间:2024-10-09 18:51:23

一、8种基本数据类型对应的包装类型名

基本数据类型 包装类型
byte .Byte(父类Number)
short .Short(父类Number)
int .Integer(父类Number)
long .Long(父类Number)
float .Float(父类Number)
double .Double(父类Number)
boolean .Boolean(父类Object)
char .Character(父类Object)

注意: 8种包装类属于 引用数据类型

二、父类Number方法

方法名 作用
byte byteValue() byte 形式返回指定的数值
abstract double doubleValue() double 形式返回指定的数值
abstract float floatValue() float 形式返回指定的数值
abstract int intValue() int形式返回指定的数值
abstract long longValue() long形式返回指定的数值
short shortValue() short形式返回指定的数值

注意: 这些方法所有的数字包装类的子类都有,这些方法是负责 拆箱 的。

三、手动装箱/手动拆箱

public class IntegerTest02 {
    public static void main(String[] args) {

        // 123这个基本数据类型,进行构造方法的包装达到了:基本数据类型向引用数据类型的转换。
        // 基本数据类型 -(转换为)->引用数据类型(装箱)
        Integer i = new Integer(123);

        // 将引用数据类型--(转换为)-> 基本数据类型
        float f = i.floatValue();
        System.out.println(f); //123.0

        // 将引用数据类型--(转换为)-> 基本数据类型(拆箱)
        int retValue = i.intValue();
        System.out.println(retValue); //123
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

四、构造方法(Java9后过时)

Integer构造方法名
Integer(int value)
Integer(String s)

注意:

  • Byte、Short、Long、Float、Double、Boolean的构造方法和Integer的构造方法一样。
  • Character只有一个构造方法
Character构造方法名
Character(char value)

注意: Float比Integer多一个

Float构造方法名
Float(double value)

eg.

public class IntegerTest03 {
    public static void main(String[] args) {

        // Java9之后不建议使用这个构造方法了。出现横线表示已过时。
        // 将数字100转换成Integer包装类型(int --> Integer)
        Integer x = new Integer(100);
        System.out.println(x);

        // 将String类型的数字,转换成Integer包装类型。(String --> Integer)
        Integer y = new Integer("123");
        System.out.println(y);

        // double -->Double
        Double d = new Double(1.23);
        System.out.println(d);

        // String --> Double
        Double e = new Double("3.14");
        System.out.println(e);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

五、包装类常量

常量属性
MAX_VALUE
MIN_VALUE

注意: Byte、Short、Integer、Long、Float、Double都有。

eg.

public class IntegerTest04 {
    public static void main(String[] args) {
        // 通过访问包装类的常量,来获取最大值和最小值
        System.out.println("int的最大值:" + Integer.MAX_VALUE);
        System.out.println("int的最小值:" + Integer.MIN_VALUE);
        System.out.println("byte的最大值:" + Byte.MAX_VALUE);
        System.out.println("byte的最小值:" + Byte.MIN_VALUE);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

六、自动装箱/自动拆箱(java5新特性)

1.什么是自动装箱和自动拆箱?

  • 自动装箱:基本数据类型自动转换成包装类
  • 自动拆箱:包装类自动转换成基本数据类型

2.自动装箱和自动拆箱的好处?

  • 方便编程
  • 有了自动拆箱之后,Number类中的方法就用不着了

eg.

public class IntegerTest05 {
    public static void main(String[] args) {
        // 900是基本数据类型
        // x是包装类型
        // 基本数据类型 --(自动转换)--> 包装类型:自动装箱
        Integer x = 900; // 等同于:Integer z = new Integer(900);
        System.out.println(x);

        // x是包装类型
        // y是基本数据类型
        // 包装类型 --(自动转换)--> 基本数据类型:自动拆箱
        int y = x;
        System.out.println(y);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注意:自动装箱底层实际上还是new对象了。

public class IntegerTest05 {
    public static void main(String[] args) {
        // z是一个引用,z是一个变量,z还是保存了一个对象的内存地址。
        Integer z = 1000; // 等同于:Integer z = new Integer(1000);
        
        // 分析为什么这个没有报错呢?
        // +两边要求是基本数据类型的数字,z是包装类,不属于基本数据类型,这里会进行自动拆箱。将z转换成基本数据类型
        // 在java5之前你这样写肯定编译器报错。
        System.out.println(z + 1);//1001

        Integer a = 1000; // Integer a = new Integer(1000); a是个引用,保存内存地址指向对象。
        Integer b = 1000; // Integer b = new Integer(1000); b是个引用,保存内存地址指向对象。
        System.out.println(a == b); //false
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注意:

  • == 这个运算符不会触发自动拆箱机制
  • == 永远判断的都是两个对象的内存地址是否相同。
  • 只有 + - * / 等运算的时候才会触发自动拆箱机制

七、(方法区)整数型常量池

public class IntegerTest06 {
    public static void main(String[] args) {
        Integer a = 128;
        Integer b = 128;
        System.out.println(a == b); //false

        //原理:x变量中保存的对象的内存地址和y变量中保存的对象的内存地址是一样的。
        Integer x = 127;
        Integer y = 127;
        // == 永远判断的都是两个对象的内存地址是否相同。
        System.out.println(x == y); //true
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

java中为了提高程序的执行效率,将 [-128 ~ 127] 之间所有的包装对象提前创建好, 放到了一个方法区的“整数型常量池”当中了。

目的是:只要用这个区间的数据不需要再new了,直接从整数型常量池当中取出来。

在这里插入图片描述

八、Integer方法

方法名 作用
static Integer decode(String nm) 将String转成Integer
static int compare(int x, int y) 比较两个数是否相等;相等返回0;前大后小返回1;后大前小返回-1
static int signum(int i) 符号函数;负数返回-1;正数返回1;0返回0
static String toBinaryString(int i) 将i转成二进制
static String toHexString(int i) 将i转成十六进制
static String toOctalString(int i ) 将i转成八进制
常用方法
static int parseInt(String s) 字符串转int
static Integer valueOf(String s) 字符串转Integer
String toString() Integer转String
boolean equals(Object obj) 判断两个Integer是否相等

注意: Byte、Short、Long、Float、Double、Boolean照葫芦画瓢,方法差不多相同。

eg.

class IntegerTest{
    public static void main(String[] args) {
        Integer d = Integer.decode("123");
        System.out.println(d);//自动拆箱 123

        Integer a = 100;
        Integer b = 100;

        int res1 = Integer.compare(a, b);
        System.out.println(res1);//0
        res1 = Integer.compare(-a, b);
        System.out.println(res1);//-1
        res1 = Integer.compare(a, -b);
        System.out.println(res1);//1

        System.out.println(a.equals(b));//true

        int i = Integer.parseInt("123");
        System.out.println(i);//123

        System.out.println(Integer.signum(-123));//-1
        System.out.println(Integer.signum(123));//1
        System.out.println(Integer.signum(0));//0

        System.out.println(Integer.toBinaryString(10));//1010
        System.out.println(Integer.toOctalString(10));//12
        System.out.println(Integer.toHexString(10));//a

        String s = Integer.toString(123);
        System.out.println(s);//123

        Integer int1 = Integer.valueOf("123");
        System.out.println(int1);//123
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

九、Character方法

方法名 作用
char charValue() 将Character转成char
int compareTo(Character anotherCharacter) 判断两个Character是否相等;相等返回0;前大后小返回1;后大前小返回-1
常用方法
boolean equals(Object obj) 判断两个Character是否相等
String toString() 将Character转成String
static boolean isDigit(char ch) 判断ch是不是数字
static boolean isLetter(char ch) 判断ch是不是字母
static boolean isLetterOrDigit(char ch) 判断ch是不是字母或数字
static boolean isLowerCase(char ch) 判断ch是不是小写字母
static boolean isUpperCase(char ch) 判断ch是不是大写字母
static boolean isSpaceChar(char ch) 判断ch是不是空格
static Character valueOf(char c) 将char转成Character

eg.

class CharacterTest{
    public static void main(String[] args) {
        Character c = 'a';

        char res1 = c.charValue();
        System.out.println(res1);//a

        Character a = 'a';
        Character b = 'b';
        System.out.println(a.compareTo(b));//-1

        System.out.println(a.equals(b));//false

        System.out.println(Character.isDigit('1'));//true

        System.out.println(Character.isLetter('a'));//true

        System.out.println(Character.isLetterOrDigit('1'));//true
        System.out.println(Character.isLetterOrDigit('a'));//true

        System.out.println(Character.isLowerCase('a'));//true

        System.out.println(Character.isUpperCase('A'));//true

        System.out.println(Character.isSpaceChar(' '));//true

        System.out.println(c.toString());//"a"

        System.out.println(Character.valueOf('c'));//c

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32