lang包常用类

1.包装类(值不可变 被final修饰)

包装类是对数据基本类型进行包装丰富了基本数据类型的操作。
 | 基本类型 | 包装类型                        | 默认值 |
 | -------- | ------------------------------- | ------ |
 | byte     | Byte(ByteCache)               | null   |
 | short    | Short                           |        |
 | int      | Integer                         |        |
 | long     | Long                            |        |
 | char     | Character(CharacterCache 0-127) |        |
 | float    | Float                           |        |
 | double   | Double                          |        |
 | boolean  | Boolean                         |        |


 

1.1 自动拆箱,自动装箱

自动装箱:基本类型的数据类型 自动转换成 包装类对象,包装类.valueOf(基本类型 变量)

Integer integer = 100;或  int a = 10;Integer.valueOf(int a);

自动拆箱:包装类对象自动转化成基本数据类型  包装类对象.***Value。

1.2 Integer

构造函数:
Integer(int a);
Integer(String s);//这个也是字符串转整型的方法
创建Integer对象可以通过自动装箱和构造函数。
比较大小:
Integer integer1 = 10;
Integer integer2 = 10;
Integer integer3 = new Integer(10);
Integer integer4 = 200;
Integer integer5 = 200;
integer1 == integer2 是true;
integer1 == integer3 是false; 
integer4==integer5是false;
原因:自动装箱实际是调用了valueOf()方法
@HotSpotIntrinsicCandidate
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
这个方法底层代码逻辑就是,当给的整数i在-128—127范围内时,返回整数缓存池里的一个个对象,当不在这个范围内时,会新new一个对象,也就是说新开辟一块内存
所以包装类比较值的时候要调用equals()方法
public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
由这段代码可知,当Integer对象调用equals();方法时,形参时object类型,比较前会事先判断形参是否是Integer类型,当是的时候才会去比较数值,不是时直接返回false。
Integer类实现了Comparable接口,是一个函数是接口,里面的一个方法compareTo(Integer i)可以用于比较两个Integer类对象的大小,如果相等返回值是0,如果integer小于i返回-1,integer大于i返回1;
public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }
public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }



2.Object类  

2.1方法

String toString();//将对象转换成字符串。//用注解重写toString()方法
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
继承object的toString方法并不是我们想要的将对象的属性值一一输出,可以直接用lombok添加@toString;注解直接解决。

Boolean equals(object obj);比较两个对象是否相等。
int hashcode()获得对象的哈希码值
protected Object clone()  克隆类对象
 protected void finalize() 禁止手动调用 GC自动调用方法  回收对象



2.2比较两个对象为什么要重写equals()和hashcode(); 

对象都继承了object的equals()方法和hashcode()方法,我们平时的逻辑是,两个对象相等是他们的哈希码和属性值相等。

public boolean equals(Object obj) { return (this == obj); }

由代码可知,继承过来的equals()方法比较的是两个对象的地址值,所以我们再重写该方法。