声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.
保存的单个相同类型的元素,一旦声明一个原始数组,无论采用哪种实例化方式,最终数组一旦定义,长度固定;
将原始的数组封装到类中,对用户(使用者)淡化数组长度的概念; 当数组长度不够时,类的内部自己进行扩容操作,用户无需关心数组的越界问题;
动态数组 = 基本数组封装到类中 + 对外提供一系列的方便进行增删改查的方法
定义阶段不明确具体类型,产生对象时明确具体类型;
泛型和Object最大的区别:
class Point<T>{
T t;
}
产生泛型类Point的对象
Point<String> p1 = new Point<>(); //p1就是String类型的Point对象
Point<Integer> p2 = new Point<>(); //p2就是Integer类型的Point对象
泛型方法
权限修饰符 <类型参数> 方法返回值 方法名称(参数列表)
//这里的表示fun是一个泛型方法,T表示返回值为泛型,这里的形参也是泛型
public <T> T fun(T t){
return t;
}
当泛型类和泛型方法共存时,泛型方法始终以自己的类型参数为准;
泛型信息只存在于编译阶段,在进入JVM之前,与泛型有关的所有信息会被编译器擦除掉,专业术语称为"类型擦除";
要使用泛型数组,统一定义为Object数组,然后再CURD(增删改查数组时,使用泛型);
private Object[] values = new Object[10];
int size = 0;
//添加元素时保证类型是正确的,后面的查询、修改、删除、强转一定都是正确的
public void add(T t){
values[size] = t;
size ++;
}
public T get(int index){
//此时强转不会报错,add方法时使用泛型来做编译期的类型校验!
return (T) valus[index];
}
保存元素的集合是一个具有相同数据类型的集合,元素之间的排列呈直线,因此将这种数据结构称为线性表;
常见的线性表:
数组、链表、栈、队列、字符串(String);
满足以下两个要求的数据结构统称为线性表
在接口中定义的这些方法,无论哪个具体子类都需要实现; 更换具体子类,使用的方法完全不变;
方法 | 解释 |
---|---|
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection extends E> c) | 尾插 c 中的元素 |
E remove(int index) | 删除 index 位置元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List< E > subList(int fromIndex, int toIndex) | 截取部分list |