• 包装类(Integer)


    一、概述:

    (1)Java中为8中基本数据类型又准备了8种包种类,8种包装类型属于引用数据类型,父类是Object

    (2)为什么要提供8个包装类:

         当我们调用一个对象,要往一个方法里面传递参数时候,参数可能只限定传入一个Object对象,则无法直接传入基本数据类型,那就需要变成引用数据类型

                      ,即传入基本数据类型的包装类


    二、各基本数据类型所属的包装类

    基本数据类型   包装类 包装类所属父类
    byte java.lang.Byte java.lang.Number
    short java.lang.Short java.lang.Number
    int java.lang.Integer java.lang.Number
    long java.lang.Long java.lang.Number
    double java.lang.Double java.lang.Number
    float java.lang.Float java.lang.Number
    char java.lang.Char java.lang.Object
    boolean java.lang.Boolean java.lang.Object

     

    2.1 八种包装类中,其中六种包装类都是数字对应的包装类,他们的父类都是Number,Number是一个抽象类,无法实例化对象,这些包装类方法它的子类都有,都可以调用,

          这些方法是负责拆箱的。

     Number中的方法:

    byte byteValue()  以byte形式返回指定的数组
    abstract double doubleValue()  以double的形式返回指定的数组
    abstract float floatValue() 以folat的形式返回指定的数组
    abstract int intValue() 以int的形式返回指定的数组
    abstract long longValue() 以long的形式返回指定的数组
    short shortValue() 以short的形式返回指定的数组

    三、八种包装类,我们讲解Integer包装类,其它的使用方式差不多:

    3.1构造方法:

    Integer包装类,有两个构造方法

    Integer(int value) 创建一个构造对象,将int数字类型转换成Integer包装类
    Integer(String s) 创建一个构造对象,它表示 String 参数所指示的 int 值,字符串内容只能是数字。
    package daily;
    
    public class date5_8 {
        public static void main(String[] args) {
            Integer i = new Integer(65);//jdk9开始已经不建议使用
            Integer s = new Integer("97");//只能传入数字型的字符串,其它文字字符串会报错
            System.out.println(i);
            System.out.println(s);
        }
    }
    输出结果:65
         97

    3.2 Integer包装类的静态关键字:

    static int MAX_VALUE
    值为 231-1 的常量,它表示 int 类型能够表示的最大值。
    static int  MIN_VALUE
    值为 -231 的常量,它表示 int 类型能够表示的最小值。
    static int SIZE 用来以二进制补码形式表示 int 值的比特位数。
    static Class<Integer> TYPE   表示基本类型 intClass 实例。
    package daily;
    
    public class date5_8 {
        public static void main(String[] args) {
            System.out.println(Integer.MAX_VALUE);
            System.out.println(Integer.MIN_VALUE);
        }
    }
    
    运行结果:
    2147483647
    -2147483648

    3.3Integer常用的方法:

    static int parseInt(String s) 将数字型的字符串,转换成整型
    static int parseInt(String s,int radix) 将数字型的字符串,转换成指定基数参数(10/2/8/16进制)的整型, (基数可以是 10, 2, 8, 或 16 等进制数)
    static String toBinaryString(int i) 将十进制转换成二进制
    static String toHexString(int i) 将十进制转换成十六进制
    static String toOctalString(int i) 将十进制转换成八进制
    static Integer ValueOf(int i) 将一个int 包装成Integer
    static Integer ValueOf(String s) 将一个String包装成Integer
    static String toString(int i) 将一个整型i转换成字符串,并返回String类型
    static String toString(int i,int radix) 将一个整型i按基数参数进行进制转换,并转换成字符串,并返回String类型

    四、自动拆箱/自动装箱

    4.1在JDK1.5之后,支持自动拆箱/自动装箱的机制,不用再通过new关键字实现包装,无需再调用Number父类的抽象方法进行转换成基本数据类型

    装箱:基本数据类型转换成引用数据类型

    拆箱:引用数据类型转换成基本数据类型,有了自动拆箱后,Number类中的方法就用不到了

    package daily;
    
    public class date5_8 {
        public static void main(String[] args) {
            //装箱:基本数据类型转换成引用数字类型,需要new关键字
            Integer i = new Integer(500);
            Double j = new Double(250.0);
            //自动装箱:无需new关键字
            Integer k = 510;
            //拆箱:引用数据类型调用number包装类的抽象方法进行拆箱
            int i1 = i.intValue();
            double j1 = j.doubleValue();
            //自动拆箱:将引用数据类型自动转换成基本数据类型,不需要再调用Number的抽象方法进行拆箱
            int k1 = k;
            System.out.println(i1);
            System.out.println(j1);
            //双等号==运算符不会自动触发自动拆箱机制,只有+ - * /,和其它关系运算符会触发
            System.out.println(k1+1);
            System.out.println(i>j);
        }
    }
    
    运行结果:
    500
    250.0
    511
    true

    4.2 通过==来比较Integer对象:integer类加载的时候,会自动往方法区的整数型常量池,加载-128到127的数据

    a.当Integer创建的不同对象数据范围不在[-128,+127]时,会在栈内存创建新的对象

    package daily;
    
    public class date5_8 {
        public static void main(String[] args) {
            Integer a = 1000; //a是个引用保存内存地址指向对象,等价于 Integer a = new Integer(1000)
            Integer b = 1000; //b是个引用保存内存地址指向对象,等价于 Integer a = new Integer(1000)
            System.out.println(a==b);//==比较的是两个对象的内存地址,==运算符不会触发自动拆箱机制
        }
    }
    
    运行结果:
    false

    内存分析:

    b.当Integer创建的不同对象数据范围在[-128,+127]时,不会创建新的对象,而是共同的去引用去字符串常量池里面该数据的内存地址

    package daily;
    
    public class date5_8 {
        public static void main(String[] args) {
            Integer a = 127; //数据127没有超过范围,则取引用方法区的整数型常量池该数据的内存地址
            Integer b = 127; //
            System.out.println(a==b);//==比较的是两个对象的内存地址,==运算符不会触发自动拆箱机制
        }
    }
    运行结果:
    true

    内存分析:


    面试题:

    (1)String为什么是不可变的?

    不可变是指双引号里的内容不可变,即放到方法区的字符串常量池字符串对象不可变,但引用是可以变得,

    String类中有一个byte[]数组,这个byte数组采用了final修饰,因为数组一旦创建长度不可变,

    并且被final关键字修饰的引用一旦指向某个对象之后,不能再指向其它对象,所以String是不可变的!

    (2)StringBuffer/StringBuilder 为什么是可变的?

    StringBuffer/StringBuilder 内部实际上是一个byte[]数组,这个byte数组没有被final关键字修饰,StringBuffer/StringBuilder的初始化容量是16,

    当存满后会自动扩容,底层调用了数组拷贝的方法System.Arraycopy()...是这样扩容的,所以StringBuffer/StringBuilder 适用于字符串的拼接。

  • 相关阅读:
    [Linux系统] (3)应用安装方式详解(编译安装、rpm包安装、yum安装)
    [Linux系统] (2)用户权限管理
    jQuery.Validate验证库详解
    jQuery Ajax 实例 ($.ajax、$.post、$.get)
    原生js记住密码
    静态网站公用的部分模块的引用(设置)方法
    针对特定浏览器起作用的CSS: IE Chrome Firefox CSS Hack
    HTML5 video 视频标签全属性详解
    js for循环,为什么一定要加var定义i变量
    用谷歌浏览器来当手机模拟器
  • 原文地址:https://www.cnblogs.com/ibear/p/12851310.html
Copyright © 2020-2023  润新知