集合体系结构
-
List系列集合:添加的元素有序,可重复,有索引
-
Collection:是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的
-
set系列集合:添加的元素无序,不重复,无索引
方法名 | 说明 |
---|---|
public boolean add(E e) | 把给定的对象添加到当前集合中 |
public void clear() | 清空集合中所有的元素 |
public boolean remove(E e) | 把给定对象在当前集合中删除 |
public contains(Object obj) | 判断当前集合中是否包含给定对象 |
public boolean isEmpty() | 判断当前集合是否为空 |
public int size() | 返回集合中元素的个数/集合长度 |
Collection遍历
迭代器遍历
迭代器在java中的类是iterator,迭代器是集合专用的遍历方式
Collection集合获取迭代器
Iterator< E > iterator() 返回迭代器对象,默认指向当前集合的0索引
Iterator中的常用方法
方法 | 说明 |
---|---|
boolean hasNest() | 判断当前位置是否有元素,有元素返回true,没有返回false |
E next() | 获取当前位置的元素,并将迭代器对象移向下一个位置 |
-
迭代器遍历完毕,指针不会复位
-
循环中只能用一次next方法
-
迭代器遍历时,不能用集合的方法,进行增加或删除
-
如果当前位置没有元素,还要强行获取,会报NosuchElementException
增强for遍历
-
增强for的底层就是迭代器,为了简化迭代器的代码书写的
-
它是JDK5之后出现的,其内部原理是一个lterator迭代器
-
所有的单列集合和数组才能用增强for遍历
格式:
for(元素的数据类型 变量名: 数组或集合 ){
}
for(String s : list){
}
s就是一个第三方变量,在循环过程中 以此表示集合中的每一个数据
Lambda表达式遍历
default void forEach(consumer<? super T > action):
List集合
List集合的特有方法
Collection的方法List都继承了
List集合因为有索引,所以多了很多索引的操作方法
方法 | 说明 |
---|---|
viod add(int index,E element) | 在指定位置插入指定元素 |
E remove(int index) | 删除指定索引的元素,返回被删除的元素 |
E set(int index,E element) | 修改指定索引的元素,返回被修改的元素 |
E get(int index) | 返回指定元素 |
List集合的遍历方式
-
迭代器:遍历过程中需要删除元素
-
列表迭代器:遍历过程中需要添加元素
-
增强for(仅仅想遍历)
-
Lambda(仅仅想遍历)
-
普通for:遍历时想操作索引
数据结构
计算机底部储存,组织数据方式
栈:后进后出,先进先出
数据进入栈模型的过程称为:压/进栈
数据离开栈模型的过程称为:弹/出栈
队列:先进先出,后进后出
数组:
-
查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同(元素在内存中是连续储存的)
-
删除效率低:要将原始数据删除,同时后面每个数据前移
-
添加效率低:添加位置后的每个数据后移,再添加元素
链表
链表中的节点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址
链表查询数据慢,无论查询哪个数据都要从头开始找
链表增删相对快
LinkedList集合:双链表,查询慢,首尾操作极快。
泛型深入
泛型是JDK5引入的特性,可以在编译阶段约束操作的数据类型并进行检查
泛型的格式:<数据类型>
注意:反省只能支持引用数据类型
好处:
-
统一数据类型
-
把运行时期的问题提前到了编译时期,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来
细节:
-
泛型中不能写基本数据类型
-
指定泛型的具体类型后,传递数据时,可以传入该类型或子类类型
-
如果不写泛型,类型默认是Object
方法中形参类型不确定时
-
可以使用类名后面定义的泛型< E > 所有方法可用
-
可以在方法中申明上定义自己的泛型< E >只有本方法可用
泛型接口的使用方式:
-
实现类给出具体的类型
-
实现类延续泛型,创建实现类对象时再确定类型
泛型的通配符
反省不具备继承性,但数据具备继承性
?表示不确定类型
? extends E:表示可以传递E或者E的所有子类类型
? super E :可以传递E或E所有父类类型
应有场景
-
如果我们在定义类,方法,接口的时候,如果类型无法确定,就可以定义泛型类,泛型方法,泛型接口
-
如果类型不确定,但是能知道以后只能传递某个继承体系中的,就可以用泛型的通配符