Java常用类01 包装类

Java常用类

一. 基本类型的包装类

  • Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本数据转化成对象,以便于操作。比如∶将基本数据类型存储到Object[]数组或集合中的操作等等。

  • 为了解决这个不足,Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。

  • 他们都位于java.lang包下,对应关系如下表:

基本数据类型 包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
  • 上面8个类,除了BooleanCharacter以外都是数字类型,他们都是抽象类java.lang.Number的子类。而Number类提供了intValue(), longValue等一系列抽象方法,所以几个数字类饿包装类都可以相互想转型。

  • 以下是几个使用包装类的实例,其他包装类类似,大家可以自行学习。

    package konoha.commonClass.packageClass;
    //整型的包装类
    public class ClassInt {
        public static void main(String[] args) {
            Integer i = 1;  ////自动装箱,JDK1.5之后的特性,使用了valueOf()方法
            System.out.println("i: " + i.toString());
            Integer a = new Integer(3); //通过new方法新建一个Integer对象
            Integer b = Integer.valueOf(3);  //通过valueof方法新建一个Integer对象
                                             //推荐的构造方式
            System.out.println("A: " + a + " B: " + b);
            System.out.println("=============================");
    
            int c = a;  //从包装类到基本类型会自动解包
            System.out.println("C: " + c );
            System.out.println("=============================");
    
            Integer d = Integer.valueOf("898");  //从字符串转换数字
            //Integer e = Integer.valueOf("898", 8); radix参数表示什么?
            //还可以使用Integer.parseInt()方法
            System.out.println("10进制:" + d );
            System.out.println("=============== ==============");
    
            //把包装类转化成字符创,使用toString()方法
            System.out.println("toString()方法转换为字符串: " + d.toString());
            System.out.println("=============================");
    
            //包装类定义了一些常用的常量
            System.out.println("Int Max value: " + Integer.MAX_VALUE);
            System.out.println("Int Min value: " + Integer.MIN_VALUE);
            System.out.println("Integer Value Type: " + Integer.TYPE);
            System.out.println("=============================");
    
            //相同值的包装类
            Integer m = 500;
            Integer n = Integer.valueOf(500);
            System.out.println(m.equals(n));
    
    
        }
    }
    
    
    package konoha.commonClass.packageClass;
    //布尔型的包装类
    public class ClassBoolean {
        public static void main(String[] args) {
            Boolean a = true;
            Boolean b = Boolean.valueOf("false");
            Boolean c = new Boolean(true);
            System.out.println(a+", " + b + ", " + c);
            System.out.println("=============================");
    
            System.out.println("a hashCode: " + a.hashCode());
            System.out.println("a toString: " + a.toString());
            System.out.println("a.equals(c): " + a.equals(c));
            System.out.println("=============================");
    
            /**
             * Boolean实例的compareTo()方法
             * 两个bool值相同返回 0
             * 值为true的对象调用compareTo()方法和false比较返回  1
             * 值为false的对象调用compareTo()方法和true比较返回 -1
             */
            System.out.println("compareTo method");
            System.out.println("a.compareTo(true): " + a.compareTo(true));
            System.out.println("a.compareTo(false): " + a.compareTo(false));
            System.out.println("b.compareTo(false): " + b.compareTo(false));
            System.out.println("b.compareTo(true): " + b.compareTo(true));
        }
    
    }
    
  • 包装类的基本作用:提供了基本数据类型,包装类,和字符串类型之间的数据转化。

  • 缓存问题:先看如下的代码,分析一下他的输出是什么。

    package konoha.commonClass.packageClass;
    
    public class TestCache {
        public static void main(String[] args) {
            Integer a = 24;
            Integer b = 24;
            Integer m = 354;
            Integer n = 354;
    
            System.out.println("m == n : " + (m == n));       //false
            System.out.println("m.equal(n) : " + (m.equals(n)));  //true
    
            System.out.println("a == b : " + (a == b));       //true
            System.out.println("a.equals(b) : " + (a.equals(b)));  //true
        }
    }
    

    前面两个输出很好理解,由于我们新建了两个对象,a,b是两个对象的引用,a==b比较是两个引用值,所以肯定是false。而equals()方法根据源码可以看出比较两个的值是否相等,所以是true。那第二个的输出是怎么回事呢?

    我们前面提到过自动装箱使用的是valueOf()方法创建的包装类。那么valueOf()是怎么实现新建类的呢?下面是valueOf()的源码:

        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
    

    发现里面有一个关于IntegerCache的判断条件满足条件的话他返回一个IntegerCache类中cache数组的一个元素。也就是说,在-128~127这个范围类的数使用自动装箱时都是返回了一个已经创建好的对象,所以其实a,b两个引用其实指向了一个对象,所以a==b返回了true。

    了解更多详细的信息,可以查看Integer类的源码。

posted @ 2021-02-28 21:19  心叶酱  阅读(38)  评论(1编辑  收藏  举报