(1)长度开始时必须指定,而且一旦指定,不能更改;
(2)保存的必须为同一类型的元素;
(3)使用数组进行增加/删除元素的代码比较麻烦。
(1)可以动态保存任意多个对象,使用比较方便;
(2)提供了一系列方便的操作对象的方法:add,remove,set,get等;
(3)使用集合添加,删除新元素的代码简洁。
Java的集合类很多,主要分为两大类:
(1)集合主要是两组(单列集合 , 双列集合)
(2)Collection 接口有两个重要的子接口 List Set , 他们的实现子类都是单列集合
(3)Map 接口的实现子类 是双列集合,存放的 K-V(key-value键值对);
(4)两张图,背!!!!!
(1)Collection实现子类可以存放多个元素,每个元素可以是Object;
(2)有些Collection的实现类,可以存放重复的元素,有些不可以;
(3)有些Collection的实现类,有些是有序的(List),有些不是有序(Set);
- 有序:存放顺序和add顺序一样
(4)Collection接口没有直接的实现子类,是通过它的子接口Set 和 List来实现的。
- //添加单个元素
- 删除指定元素
- 查找元素是否存在
- 获取元素个数
- 判断是否为空
- 清空
- 添加多个元素(添加一个集合类)
- 查找多个元素是否存在
- 删除多个元素
1)使用Iterator(迭代器)
① Iterator对象称为迭代器,主要用于遍历Collection集合中的元素;
② 所有实现了Collection接口的集合类都有一个iterator()方法,用于返回一个实现了Iterator接口的对象,即可以返回一个迭代器;
③ Iterator 的结构:
④ Iterator仅用于遍历集合, Iterator本身不存放对象。
2)使用增强for循环
增强for循环,可以代替iterator迭代器。
特点:增强for就是简化版的iterator,本质一样。只能用于遍历集合或数组。
① List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复;
② List集合中的每个元素都有其对应的顺序索引(即对于List容器中的每个元素,都有一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素)即支持索引;
③ List接口的实现类不止有ArrayList、linkedList、Vector,还有很多
- 插入元素
- 插入多个元素
- 获取指定index位置的元素
-
返回obj在集合中首次出现的位置
-
返回obj在集合中最后出现的位置
- 移除指定index位置的元素,并返回此元素
- 替换元素
- 取子集合
练习
(1),ArrayList可以加入null,并且可以有多个;
(2)ArrayList 是由数组来实现数据存储的;
(3)ArrayList 基本等同于Vector,除了ArrayList是线程不安全的(但执行效率高),在多线程情况下,不建议使用ArrayList。
① ArrayList中维护了一个object类型的数组elementData,用于存放对象;
② 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次田间,则扩容elementData为10,如果需要再次扩容,则扩容elementData为1.5倍;(0->10->15->22…)
③ 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
1)【无参构造器】源码分析
2)【有参构造器】流程图
后面的源码和无参的add()方法一样,只是因为第一次需要进行扩容时,就成功扩容(1.5倍扩容后就满足了需要的大小)
所以是直接在原来的基础上扩容1.5倍,而不是先初始化为10(初始化为10,是因为最开始0按照1.5倍扩容也还是0)
① 定义说明;
② Vector底层是一个对象数组,protected Object[] elementData;
③ Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized;
④ 开发中,需要线程同步安全时,考虑使用Vector。
(3)Vector的底层扩容结构
-
linkedList底层实现了双向链表和双端队列的特点;
-
可以添加任意元素(元素可以重复),包括null;
-
线程不安全,没有实现同步
-
linkedList底层维护了一个双向链表
-
linkedList中维护了两个属性 和 分别指向首节点和尾节点
-
每个节点(Node对象),里面又维护了、、三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表
-
所以linkedList的元素的添加和删除,不是通过数组完成的,相对来说效率比较高;
-
模拟一个简单的双向链表。
1)添加结点分析
2)删除结点分析
如何选择 ArrayList和ListedList:
① 如果我们改查的操作多,选择ArrayList;
② 如果我们增删的操作多,选择ListedList;
③ 一般来说,在程序中,80-90%都是查询,大部分情况下会选择ArrayList;