• Java核心类——包装类型


    Java的数据类型分两种:
      基本类型:byte,short,int,long,boolean,float,double,char
      引用类型:class,interface

    引用类型可以赋值为null,表示空,但基本类型不能赋值为null:

    String s = null;
    int n = null;  //comile error!

    那么,如何把一个基本类型视为对象(引用类型)?
    比如,想要把int基本类型变成一个引用类型,我们可以定义一个integer类,
    它只包含一个实例字段int,这样,Integer类就可以视为int的包装类(Wrapper class):

    public class Integer {
        private int value;
        
        public Integer(int value) {
            this.value = value;    
        }
        
        public int intValue() {
            return this.value;    
        }
    }

    定义好Integer类,我们就可以把int和Integer互相转换:

    Integer n = null;
    Integer n2 = new Integer(99)  //将int转换为Integer
    int n3 = n2.inValue();  //将integer转换为int

    实际上,因为包装类非常有用,Java核心库为每种基本类型都提供了对应的包装类型:

    我们可以直接使用,并不需要自己去定义:

    public class catchExample2 {
        public static void main(String[] args) {
            int i = 100;
            // 通过new操作符创建Integer实例,这种方式,会有编译警告;
            Integer n1 = new Integer(i);
            //  可以通过静态方法valueOf创建Integer实例;
            Integer n2 = Integer.valueOf(i);
            //  通过静态方法valueOf(String)创建Integer也是可以的;
            Integer n3 = Integer.valueOf("100");
            System.out.println(n3.intValue());
        }
    }

    因为int和Integer可以互相转换:

    int i = 100;
    Integer n = Integer.valueOf(i);
    int x = n.inValue();  //
    所以,Java编译器可以帮助我们自动在int和Integer之间转型:
    Integer n = 100;  //编译器自动使用Integer.valueOf(int)
    int x = n;  //编译器自动使用Integer.inValue()

    这种直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),
    反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)。
    注意,自动装箱和自动拆箱只发生在编译阶段,目的是为了减少代码。

    装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。
    并且自动拆箱执行时可能会报NullPointerExecption。

    所有的包装类型都是不变类。

    public final class Integer {
        private final int value;
    }

    因此,一旦创建了Integer对象,该对象就是不变的。

    我们在创建integer的时候,有两种方法:

    Integer n = new Integer(100);
    Integer n = Integer.valueOf(100);

    前者总是创建新的对象,后者方法更优。

    我们将能创建新对象的静态方法称为静态工厂方法,
    Integer.valueOf()就是静态工厂方法,它尽可能地返回缓存地实例以节省内存。

    Integer类本身还提供了大量方法,例如,最常用地静态方法parseInt()可以把字符串解析成一个整数:

    int x1 = Integer.parseInt("100"); // 100
    int x2 = Integer.parseInt("100", 16); // 256,因为按16进制解析

    Integer还可以把整数格式化为指定进制地字符串:

    public class Main {
        public static void main(String[] args) {
            System.out.println(Integer.toString(100)); // "100",表示为10进制
            System.out.println(Integer.toString(100, 36)); // "2s",表示为36进制
            System.out.println(Integer.toHexString(100)); // "64",表示为16进制
            System.out.println(Integer.toOctalString(100)); // "144",表示为8进制
            System.out.println(Integer.toBinaryString(100)); // "1100100",表示为2进制
        }
    }
  • 相关阅读:
    Spring 详解第三天
    Spring 详解第二天
    springmvc的运行流程分析
    Spring 详解第一天
    【Java面试题】40 你所知道的集合类都有哪些?主要方法?
    【Java面试题】39 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
    【Java面试题】38 Collection 和 Collections的区别
    【Java面试题】37 说出ArrayList,Vector, LinkedList的存储性能和特性
    【Java面试题】36 List、Map、Set三个接口,存取元素时,各有什么特点?
    【Java面试题】35 List, Set, Map是否继承自Collection接口?
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/12501378.html
Copyright © 2020-2023  润新知