Integer 是基本数据类型int的封装类,java中的八种数据类型都有一一对应的封装类型。
使用int时 我们直接定义一个变量名并赋值,而使用Integer类型时我们需要new
int a = 1;
Integer b = new Integer(1);
可以看出 封装类型其实是对象,那为什么我们需要封装类型呢?
Java本身是一门面向对象语言,ArrayList,HashMap这些集合只能存储对象类型,因此封装类型存在的意义就很大。此外,封装类型还有很多好处,比如安全性较好,可以避免外部操作随意修改成员变量的值;隐藏了实现细节,对使用者更加友好,只需要调用对象提供的方法就可以完成对应的操作。
那为什么ArrayList,HashMap这些集合只能存储对象类型
当我们创建一个集合类时,例如ArrayList或HashMap,我们通常需要指定集合中元素的类型。泛型类是一种在定义类、接口或方法时使用类型参数的特性。通过使用泛型类,我们可以在使用这些类、接口或方法时指定具体的类型。
泛型类的语法形式是在类名后面使用尖括号(<>)来声明一个或多个类型参数。这些类型参数可以在类的字段、方法的参数列表、方法的返回值类型以及局部变量中使用。
下面是一个使用泛型类的示例:
Copypublic class ArrayList<E> {
private E[] elements;
private int size;
// 构造方法
public ArrayList() {
elements = (E[]) new Object[10];
size = 0;
}
// 添加元素
public void add(E element) {
if (size >= elements.length) {
resize();
}
elements[size++] = element;
}
// 获取元素
public E get(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
return elements[index];
}
// 调整数组大小
private void resize() {
E[] newElements = (E[]) new Object[elements.length * 2];
System.arraycopy(elements, 0, newElements, 0, size);
elements = newElements;
}
}
在上面的示例中,我们定义了一个泛型类ArrayList,其中表示类型参数。在类的字段和方法中,我们可以使用类型参数E来代表集合中的元素类型。在构造方法中,我们使用类型参数E来创建一个数组,并进行类型转换。在add方法中,我们使用类型参数E来接受传入的元素,并将其添加到数组中。在get方法中,我们使用类型参数E来指定返回值类型。在resize方法中,我们同样使用类型参数E来创建新的数组并进行类型转换。
使用泛型类的好处是可以提高代码的类型安全性和可读性。通过指定具体的类型参数,我们可以在编译时检查类型的正确性,并避免了在运行时进行类型转换的麻烦。此外,泛型类还可以减少代码的重复,使代码更加通用和灵活。
需要注意的是,虽然泛型类允许使用任意的引用类型作为类型参数,但不允许使用基本类型(如int、char等)。如果需要存储基本类型,可以使用它们的包装类(如Integer、Character等)作为类型参数。