集合之Collection接口和List接口
写在最前:由于集合的篇幅和难度略大
(数据结构学的太烂了,甚至想先补一下数据结构再来听…但那就更要鸽好久了)
最终决定分三部分来写了,后两个可能要鸽一段时间了
五月事情似乎有点多…要准备期中考试还要备考六级还有个旅行计划,故而后两篇还有欠着的包装类得蛮久了可能…
集合篇·上:Collection接口和List接口
集合篇·中:Set接口
集合篇·下:Map接口
集合
- 难度说明:单纯使用不难,难在1. 理解底层机制 2. 看源代码 3. 分析每种集合在不同场景下的应用情况
- 集合对比数组的优势在于:
- 集合可以动态保存任意多个对象,甚至数据类型也可以不同,使用方便
- 提供了一系列方便的操作对象的方法:
add,remove,set,get等
- 使用集合添加删除新元素使得代码变得简洁
集合框架体系
- 集合主要分两组:单列集合(单个对象/单个元素),双列集合(往往是键值对)
- Collection接口的两个重要的子接口:List,Set,它们的实现子类都是单列集合
- Map接口的实现子类都是双列集合,存放的K-V
Collection接口
Collection接口实现类的特点
public interface Collection <E> extends Iterable<E>
- collection实现子类可以存放多个元素,每个元素可以是Object
- 有些collection的实现类可以存放重复的元素,有些不可以
- 有些collection的实现类,有的是有序(存放的顺序和取出来的是一致的)的(List),有些不是有序(Set)
- collection接口没有直接的实现子类,而是通过它的子接口List和Set实现的
Collection接口实现类的常用方法
- add:添加单个元素
list.add(10); //其本质相当于: //Integer(10);
- remove:删除指定元素
list.remove(int index)//删除第index个元素 list.remove("jack")//指定删除某个元素
- contains:查找元素是否存在//返回一个布尔值
- size:获取元素个数
- isEmpty:判断是否为空
- clear:清空
- addAll:添加多个元素//甚至可以传入一个集合,只要是实现了Collection接口的类的对象都可以传进去
- containsAll:查找多个元素是否都存在
Collection接口遍历元素方式 1 -迭代器Iterator
- 基本介绍:
- Iterator对象成为迭代器,主要用于遍历Collection集合中的元素
- 所有实现了Collection接口的集合类都有一个iterator()方法,用来返回一个实现了Iterator接口的对象,即可返回一个迭代器
- Iterator仅用于集合遍历,本身并不存放对象
- 迭代器的实现原理:
-
-
提示:在调用iterator.next()之前必须要调用iterator.hasNext()方法检测以下,若不调用,且下一条记录无效,直接调用iterator.next()会报NoSuchElementException异常
- 迭代器的使用方法详解:
1.先得到col(col是一个集合)对应的迭代器
所有实现了Collection接口的子类都必须去实现iteratpr()方法:
Iterator iterator = col.iterator();
2. 使用while循环遍历
快捷键生成while:itit + 回车while(iterator.hasNext()) //判断集合中是否还有数据【见上面的迭代器的实现原理】 Object obj = iterator.next(); //有这个数据,就用Object类型返回下一个元素 //注意此时的obj虽然编译类型是Object,但是运行类型还是它的类(Book)【运行类型取决于你真正存放的是什么类型】 //本质上还是动态绑定机制
- 当退出while循环后,iterator此时指向了最后一个元素,此时继续取下一个
iterator.next()
,那么就会报错NoSuchElementException异常 - 如果希望再次遍历,需要重置迭代器
iterator = col.iterator();
//重置迭代器,然后下面继续while循环
- 当退出while循环后,iterator此时指向了最后一个元素,此时继续取下一个
Collection接口遍历元素方式 2 -for循环增强
- 基本介绍:
- 增强for循环,可以代替iterator迭代器,特点:增强for循环就是简化版的iterator,两者本质一样,只能用于遍历集合或者数组
- 基本语法:
for(元素类型 元素名:集合名或数组名){ 访问元素 }
- 增强for循环也可以在数组使用
- 快捷键:I + 回车,或者遍历的对象 + .for,或者iter
List接口方法
注意:Collection中的方法List也能用,但是List中的方法Collection不一定能够用
-
基本介绍:
- List集合类中红元素有序(即添加顺序和取出顺序一致),****且可重复 ****
- List集合中的每个元素都有其对应的顺序索引,即支持索引,且索引从0开始
- List容器中的每个元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
- JDK API中List接口的实现类常用的有
ArrayList,LinkedList, Vector
-
List接口中常用的根据索引来操作集合元素的方法
-
-
List的三种遍历方式:
迭代器,增强for,普通for
ArrayList
- 注意事项:
- 可以存放空值,且多个
- ArrayList是由数组来实现数据存储的
- ArrayList基本等同于Vector,除了ArrayList是线程不安全的(但执行效率高),在多线程的情况西啊,不建议使用ArrayList
ArrayList的底层操作机制源码分析【重难点】
- 结论:
- ArrayList中维护了一个Object类型的数组elementData,
transient Object[] elementData;
//transiemt:表示瞬间,短暂,表示该属性不会被序列化(串行化)也就是不能在网络上传输 - 当创建ArrayList对象是,如果使用的是无参构造器
ArrayList()
,测初始elementData容量为0,第一次添加,则扩容elementData为10,如需再次扩容,则扩大elementData为1.5倍(15 -> 22 -> 33 …) - 如果使用的是指定大小的构造器
ArrayList(int)
,则初始elementData容量为指定大小,如需扩容,则直接扩容elementData为1.5倍( 1.5 * int -> 1.5 * 1.5 * int …)
- ArrayList中维护了一个Object类型的数组elementData,
LinkedList
-
基本介绍:
- LinkedList实现了双向链表和双端队列的特点
- 可以添加任意元素(元素可重复,包括null
- 线程不安全,没有实现同步
-
LinkedList的底层操作机制
-
ArrayList和LinkedList的比较
相当于一个是顺序表,一个是链表
Vector
- 基本介绍:
- Vector底层是一个对象数组,
protected Object[] elementData;
- Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized
- 在开发过程中,需要线程同步安全时,考虑使用Vector
- Vector底层是一个对象数组,
- Vector和ArrayList的比较