• 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进制
        }
    }
  • 相关阅读:
    nyoj 游戏高手的烦恼 (二分图最小点覆盖)
    nyoj 三国志 (Dijkstra + 01背包)
    《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅱ
    《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ
    Java学习作业(14.4.21)
    2014上年度学习计划
    快速求幂(Quick Exponentiation)
    B. Inna and Nine
    B. Valera and Contest
    Problem 2128 最长子串
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/12501378.html
Copyright © 2020-2023  润新知