Collection集合 【重点】
List集合 【重点】
集合的概述
什么是集合
集合是一种用于存储多个数据的容器
集合不是一两个,而是有很多,基础班学习的ArrayList只是其中的一个
集合和数组的区别
1、集合的长度可变
数组的长度可不变
2、集合只能存储引用类型的数据,不能直接存储基本类型的数据
数组既可以存储基本类型的数据,也可以存储引用类型的数据
集合的体系结构
Java是面向对象的语言,在Java中要研究任何的东西都必须封装成对象,对象肯定会有对应的类
集合根据特点不同有很多,对应的集合类也就有很多,这些集合类的共性不断向上抽取,就形成了集合的
体系结构。
单列集合
Collection接口
|-List接口
|-ArrayList类
|-LinkedList类
|-Vector类
|-Set接口
|-HashSet类
|-TreeSet类
双列集合
Map接口
|-HashMap类
|-TreeMap类
学习体系结构,一般从上往下学,先学顶层的接口或者父类,再依次往下学习底层的实现类或者子类
因为最顶层都是共性的抽取,它是体系结构的共性的内容,学完之后,下面的实现类或者子类只要学习特有的内容即可
Collection接口
常用方法
添加
boolean add(E e):往后添加
删除
boolean remove(Object o)
void clear()
default boolean removeIf(Predicate<? super E> filter)
判断
boolean contains(Object o)
boolean isEmpty()
获取
int size()
Iterator<E> iterator()
面试题:数组、字符串和集合分别如何获取长度?
数组:数组名.length属性
字符串:字符串.length()方法
集合:集合.size()方法
面试题:以下方法属于Collection接口中方法的是( C )
A、E get(int index)
B、E remove(int index)
C、boolean add(E e)
D、E set(int index,E e)
注:Collection接口中没有任何一个和索引相关的方法
迭代器(Iterator)
用于集合迭代(遍历)的工具
常用方法
boolean hasNext() :判断是否还有下一个元素
E next() :获取下一个元素
* 获取下一个
* 将光标往下移动一位
void remove() :删除光标指向的元素
迭代器遍历的步骤
1、获取到迭代器
2、循环判断是否有下一个元素
3、如果有则进入循环内部获取下一个元素
4、使用获取到的元素
演示:迭代器遍历的同时进行删除操作
如果直接使用集合的删除方法进行删除会出现ConcurrentModificationException异常
并发修改异常,如果选择迭代器的方法进行删除则可以避免这个异常
增强for循环(foreach)
JDK1.5的新特性(自动拆装箱、泛型和增强for等...)
格式:
for(数据类型 变量名:容器){
}
容器:只能是数组和单列集合
数据类型:容器中每一个元素的数据类型,其实和容器的数据类型和泛型一致
变量名:依次记录的就是容器中的每一个元素
快捷键:iter
增强for在遍历集合的时候,底层使用的是迭代器,也可以将增强for称为迭代器的语法糖
增强for在遍历数组的时候,底层使用的是普通for
作用:用于方便地遍历数组和集合
List集合 【重点】
List接口
特点
1、存取有序,能够保证按照什么顺序存储的,就按照什么顺序取出
2、有索引的,可以通过索引来操作其中的元素
3、可以存储重复元素
常用方法
List接口是Collection接口的子接口,所以Collection接口中的所有方法,
在List中都被继承下来了,都拥有。
特有方法
void add(int index, E element)
E get(int index)
E remove(int index)
E set(int index, E element)
这些特有方法都是和索引有关的
集合的遍历方式
方式一:迭代器 【所有单列集合的通用遍历方式】
方式二:增强for 【所有单列集合的通用遍历方式】
方式三:普通for 【只适用于List集合的遍历方式】
数据结构
栈:先进后出(FILO),后进先出(LIFO)
队列:先进先出(FIFO),后进后出(LILO)
数组:查询修改快,增删慢
链表:查询修改慢,增删快
ArrayList类
ArrayList中实现List和Collection接口中的所有抽象方法
底层原理:
1、ArrayList底层初始创建一个长度为多少的对象数组? 10
2、什么时候创建的这个长度为10的数组? 第一次调用add方法的
3、扩容时机? 数组装满了
4、如何扩容? 原数组的1.5倍
LinkedList
LinkedList中实现List和Collection接口中的所有抽象方法
特有方法
public void addFirst(E e) 在该列表开头插入指定的元素
public void addLast(E e) 将指定的元素追加到此列表的末尾
public E getFirst() 返回此列表中的第一个元素
public E getLast() 返回此列表中的最后一个元素
public E removeFirst() 从此列表中删除并返回第一个元素
public E removeLast() 从此列表中删除并返回最后一个元素
Vector