一、List接口
(一)概述
1.是Collection的子接口
2.特点
(1)有序:元素的存储顺序和获取顺序保持一致
(2)可重复:允许存储重复的元素
(3)可重复的原因:有索引
3.特有方法
(1)add(int index, E element):将指定元素插入到集合的指定位置
(2)remove(int index):删除指定索引上的元素
(3)set(int index, E element):用指定元素替换指定索引上的原有元素
(4)get(int index):返回指定索引上的元素
(二)第三种遍历
1.针对List集合特有的遍历方式,Collection中不一定能使用,Set中肯定不能用
2.可以通过size方法获取集合的长度,进而就能得到集合的索引范围,再配合get方法获取每一个元
素
(三)并发修改异常
1.ConcurrentModificationException
2.原因:再使用迭代器对象遍历集合的时候,通过集合对象操作集合
3.避免方式:
(1)集合遍历集合修改
(2)迭代器遍历迭代器操作
4.List特有的迭代器:listIterator()
(1)List特有迭代器中新增许多便于操作的方法
(2)ListIterator是Iterator的子接口
(3)再List集合中要调用方法获取这个迭代器,方法为:listIterator()
二、基本数据类型包装类
(一)概述
1.基本数据类型有八种,都是简单的数据
2.再这些基本数据类型中,只能表示简单的数据,不能包含一些操作数据的方法,并且也不是对
象,所有的逻辑都需要自己去定义,比较麻烦,将基本数据类型封装为一个Java类,类中还提供了
操作基本数据类型的方法,以及将基本数据类型和其他数据类型进行转换的一些方法
(二)自动拆装箱(JDK5)
1.装箱和拆箱
(1)装箱:将基本数据类型,封装为包装类的对象,这个过程就是装箱
(2)拆箱:将包装类中的基本数据类型解析出来
2.自动拆装箱
(1)自动装箱:可以直接使用基本数据类型的数据,给引用数据类型赋值
(2)自动拆箱:可以直接使用基本数据类型包装类的对象,给基本数据类型赋值,或者直接参与
运算
三、List的实现类
(一)概述
1.List是一个接口,无法直接创建一个对象,所以根据底层实现类的不同,具有不同的实现
2.Vector:数组实现,顺序存储
3.ArrayList:数组实现,顺序存储
4.LinkedList:链表实现,节点存储
(二)Vector
1.再JDK1.0版本出现,这个类已经过时,再1.2时期被ArrayList替代
2.特点
(1)线程安全,效率低
(2)顺序存储,增删较慢
(三)ArrayList
1.是List的子实现类
2.存储方式
(1)数组实现,顺序存储
(2)增删较慢,查询快(增删之后,索引打乱,需要进行索引重排;查询依靠索引直接找到)
(3)通过物理内存结构实现位置关系,来表示逻辑顺序的相邻
(四)LinkedList
1.LIst接口的子实现类
2.存储方式
(1)节点实现,链式存储
(2)不是通过物理结构实现相邻关系,是通过逻辑顺序实现的相邻关系
(3)每一个节点中,既存储了元素,又存储了相邻节点的地址,通过地址实现前后的逻辑关系
3.特点
(1)查询慢:需要根据前面的节点来获取后一个节点的地址,前面所有的节点都要访问一遍,节
点数量越多,查询的速度越慢
(2)增删快:增加或删除一个元素,只需要修改相邻的节点中的地址即可
4.LinkedList特有方法:由于底层的特性,专门针对性的提供了再头部尾部增删的操作
(1)addFirst(E e):将指定元素插入到列表头部
(2)addLast(E e):将指定元素插入到列表尾部
(3)getFirst():返回头部元素
(4)getLast():返回尾部元素
(5)removeFirst():删除头部元素并返回
(6)removeLast():删除尾部元素并返回
四、泛型
(一)泛型的概述和使用
1.泛型:广泛的类型,再定义类的时候,某些方法的参数列表或者返回值类型不确定,就是用一个
符号,来表示那些尚未确定的类型,这个符号就是泛型
2.格式
ArrayList<Integer> list = new ArrayList<>();
3.泛型的好处
(1)提高了数据的安全性,将运行期的问题提前暴露再编译期
(2)避免了强转的麻烦
4.注意事项
(1)泛型必须书写为引用数据类型,不能写为基本数据类型
(2)泛型书写的时候,必须保证前后一致
(3)泛型的推断:如果等号左侧的泛型已经写好,右侧可以不用写,会自动根据前面的泛型确定
为一样的类型,右侧直接写一个菱形,所以也叫做菱形泛型,这是JDK7的新特性
(二)泛型类的定义
1.泛型类:带泛型的类
2.格式
class 类名<泛型1, 泛型2...> { 类的内容; }
3.说明
(1)类后面跟着的泛型类型是泛型的声明,一旦泛型声明出来,就相当于这个类未来会有一个已
知类型,这个类型就可以再类中使用
(2)泛型类型的声明:只要是一个合法标识符即可,一般使用单个字母的大写:T(Type)、E(Element)、K(Key)、V(Value)
(四)泛型方法
1.在方法的声明上,带上泛型就是泛型方法
2.格式
权限修饰符 <泛型1, 泛型2, 泛型3...> 返回值类型 方法名称(参数列表) { 方法体; }
3.说明
(1)在方法上声明泛型,可以在整个方法中作为已知参数进行使用
(2)非静态方法,没有声明任意泛型,可以直接使用类的泛型,如果自己定义了泛型,既可以只
使用自己的泛型,也可以方法泛型类的泛型一起使用
(3)静态方法不能使用类的泛型