数据结构 | (一)包装类和初始泛型

包装类
Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型。
基本数据类型 包装类
byte

Byte

short Short
int Integer
long

Long

float Float
double Double
char Character
boolean Boolean
除了 Integer Character , 其余基本类型的包装类都是首字母大写。
装箱和拆箱

装箱(Boxing)和拆箱(Unboxing)是Java中用于基本数据类型和对应包装类之间转换的过程。

装箱是将基本数据类型转换为对应的包装类对象。例如,将int类型的值转换为Integer对象。装箱可以通过自动装箱(Autoboxing)或手动装箱(Manual Boxing)来完成。

自动装箱是指在需要使用包装类对象的地方,直接使用基本数据类型,编译器会自动将其转换为对应的包装类对象。例如:

int num = 10;
Integer obj = num; // 自动装箱


手动装箱是通过调用包装类的构造方法,将基本数据类型转换为对应的包装类对象。例如:

int num = 10;
Integer obj = new Integer(num); // 手动装箱


拆箱是将包装类对象转换为对应的基本数据类型。例如,将Integer对象转换为int类型的值。拆箱可以通过自动拆箱(Autounboxing)或手动拆箱(Manual Unboxing)来完成。

自动拆箱是指在需要使用基本数据类型的地方,直接使用包装类对象,编译器会自动将其转换为对应的基本数据类型的值。例如:

Integer obj = 10;
int num = obj; // 自动拆箱


手动拆箱是通过调用包装类的方法,将包装类对象转换为对应的基本数据类型的值。例如:

Integer obj = new Integer(10);
int num = obj.intValue(); // 手动拆箱


装箱和拆箱提供了基本数据类型和包装类之间的相互转换,使得在需要使用对象的场景中也可以使用基本数据类型,并且可以方便地进行类型转换。

public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);  //true
System.out.println(c == d);  //false
}

在Java中,对于Integer类型的对象,当其值在-128到127之间时,会使用对象池(Integer Cache)来缓存这些值,以提高性能和节省内存。这意味着当我们创建一个值在-128到127之间的Integer对象时,如果对象池中已经存在相同值的对象,那么将直接返回这个对象的引用,而不是创建一个新的对象。

所以,在你的代码中,a和b的值都是127,它们在对象池中已经存在了一个相同值的对象,所以a和b实际上指向的是同一个对象,因此a == b返回true。

而对于c和d的值,它们都是128,超过了对象池的范围,所以每次创建一个新的对象来存储这个值。因此,c和d实际上是两个不同的对象,即使它们的值相同,所以c == d返回false。

泛型
class 泛型类名称<类型形参列表> {
// 这里可以使用类型参数
}
class ClassName {
}
class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
// 这里可以使用类型参数
}
class ClassName extends ParentClass {
// 可以只使用部分类型参数
}
泛型类<类型实参> 变量名; // 定义一个泛型类引用
new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
注意:泛型只能接受类,所有的基本数据类型必须使用包装类!
泛型如何编译的
擦除机制 : 在编译的过程当中,将所有的 T 替换为 Object 这种机制,我们称为: 擦除机制
T[] ts = new T[5] //错误写法
//在Java中,泛型类型参数在编译期间会被擦除为它们的上界(或者Object类型,如果没有指定上界)。
//因此,T[] ts = new T[5]是不合法的,因为编译器无法确定T的具体类型。

//正确写法
Object[] ts = new Object[5];
T[] result = (T[]) ts;
在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
class 泛型类名称<类型形参 extends 类型边界> {
...
}
public class MyArray {
...
}
只接受 Number 的子类型作为 E 的类型实参

MyArray l1; // 正常,因为 Integer 是 Number 的子类型
MyArray l2; // 编译错误,因为 String 不是 Number 的子类型
泛型方法
定义语法
方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
示例
public class Util {
    //静态的泛型方法 需要在static后用<>声明泛型类型参数
    public static  void swap(E[] array, int i, int j) {
    E t = array[i];
    array[i] = array[j];
    array[j] = t;
    }
}

你可能感兴趣的:(Java数据结构,数据结构,java)