java学习--基础知识进阶第六天--笔记

时间:2022-03-18 13:40:37

今日内容
Collection集合&迭代器
增强for&泛型
常见的数据结构
List子体系

集合的体系结构
集合不是指某一个类,它是一个体系,其中包含了很多的类和接口

单列集合(Collection)
Collection
|-List:有序(怎么存就怎么取)、可以存储重复元素、有整数索引
|-ArrayList:底层是数组结构
|-LinkedList:底层是链表结构
|-Vector:底层是数组结构
|-Set:无序(不能保证怎么存就怎么取),不能存储重复元素、没有整数索引
|-HashSet
双列集合(Map)

学习的时候,从上往下学,因为最顶的接口或者类有共性的内容,学会了共性,下面具体的类的使用也就学会了
使用的时候,从下往上使用,使用的时候需要使用具体的类

Collection
是单列集合的根接口
常用方法
boolean add(E e) : :添加元素
void clear() :清空集合
boolean contains(Object o) :判断是否包含
boolean isEmpty() :判断集合是否为空
boolean remove(Object o) :删除指定的元素
int size() :集合的长度
Object[] toArray() :将集合转为Object数组

Iterator<E> iterator() :用于获取迭代器


Iterator接口
方法:
boolean hasNext():判断集合中是否还有下一个元素
E next():一次取一个元素,并返回
void remove():删除元素

ListIterator接口
只针对于List子体系有效,不是所有的Collection集合都可用
它是Iterator的子接口,有比父接口更强大的功能
除了有父接口中的三个方法之外,还有其他的,比如:
void add(E e) :添加



并发修改异常:
类名:ConCurrentModificationException
发生的原因:
在使用迭代器(Iterator)对集合进行遍历的同时,使用集合的方法修改(添加或删除)了集合中的元素,而迭代器不知道,就发生了该异常

如何解决:
(1)不使用
(2)使用迭代器自身的方法,但是迭代器中的有删除的方法,没有添加的方法
如果一定要在迭代器迭代的过程中添加元素,只能借助ListIterator
遍历方式:
方式一:普通for循环,结合get(int index)和size()方法【只适用List子体系】(因为普通for循环有索引)
* 使用比较少
// 创建集合
ArrayList list = new ArrayList();
// 添加元素
list.add("a");
list.add("b");
list.add("c");

// 遍历
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
System.out.println(o);
}

方式二:普通for,结合toArray(),先将集合转为Object类型的数组,然后遍历数组就相当于遍历出了集合中的元素
* 使用比较少
// 创建集合
Collection c = new ArrayList();
// 添加元素
c.add("a");
c.add("b");
c.add("c");

// 遍历
Object[] objs = c.toArray();
for(int i=0; i<objs.length; i++){
System.out.println(objs[i]);
}

方法三:迭代器遍历(Iterator)(可以删除元素,不能增加元素)
* 重点,使用比较多
// 创建集合
Collection c = new ArrayList();
// 添加元素
c.add("a");
c.add("b");
c.add("c");

// 获取迭代器
Iterator it = c.iterator();

// 循环遍历获取每一个元素, 每一次获取之前都需要进行判断集合中是否还有元素
while(it.hasNext()){
// 获取元素
Object o = it.next();
System.out.println(o);
}

方式四:列表迭代器遍历(ListIterator)【只适用List子体系】(ListIterator接口继承了List接口)
// 创建集合
ArrayList list = new ArrayList();
// 添加元素
list.add("a");
list.add("b");
list.add("c");

// 获取列表迭代器
ListIterator lit = list.listIterator();

// 循环遍历
while(lit.hasNext()){
Object o = lit.next();
System.out.println(o);
}

方式五:增强for
* 重点,使用比较多
// 创建集合
Collection<String> c = new ArrayList<>();
// 添加元素
c.add("a");
c.add("b");
c.add("c");

for(String s : c){
System.out.println(s);
}

增强for&泛型
都是JDK1.5的新特性,目前为止咱们总共学了3个JDK1.5的新特性:
泛型
自动拆装箱
增强for

泛型
可以理解为规定了集合中所存储的数据的类型

好处:
(1)是一种安全机制,将运行时可能出现的错误提前到了编译时期解决
(2)较少了强转的麻烦,简化了代码

注意:
(1)泛型<>中填写的内容是数据的类型,这个只能是引用数据类型,不能填写基本数据类型
(2)泛型前后类型要一致,但是从JDK1.7之后,后面的泛型也可以不写,这是菱形泛型

增强for(foreach)
一般用于遍历集合或者数组

格式:
for(数据类型 元素名:集合或者数组){
}

快捷键:
fore 然后按alt+/

注意:增强for遍历的时候不能对集合进行删除或者添加元素的操作

常见的数据结构
数组
查找快、增删慢
链表
查找慢、增删快

先进后出
队列
先进先出

List的子体系
List接口的特有方法
void add(int index,E element):在指定索引处添加元素
E remove(int index):删除指定索引处的元素,并将被删除的元素返回
E set(int index,E element):将指定索引处的元素修改为新的值,返回被修改的值
E get(int index):根据指定索引处的元素

LinkedList的特有功能:
void addFirst(E e)
void addLast(E e)
E getFirst()
E getLast()
E removeFirst()
E removeLast()