集合:
1)可以动态保存任意多个对象。
2)提供了一系列方便的操作对象的方法:add、remove、set、get等
1)add:添加单个元素
2)remove:删除指定元素
3)contains:查找元素是否存在
4)size:获取元素个数
5)isEmpty:判断是否为空
6)clear:清空
7)addAll:添加多个元素
8)containsAIl:查找多个元素是否都存在
9)removeAll:删除多个元素
1)Iterator 对象称为迭代器,主要用于遍历 Collection集合 中的元素
2)所有实现了 Collection接口 的集合类都有一个 iterator() 方法,用以返口一个实现了Iterator接口 的对象,即可以返回一个迭代器。
3)Iterator 仅用于遍历集合,lterator 本身并不存放对象
ArrayListlist = new ArrayList<>(); list.add(1); list.add(2); list.add(3); // list.iterator() 重置迭代器,可重复 Iteratoriterator = list.iterator(); while (iterator.hasNext()){ Integer next = iterator.next(); System.out.println(next); }
增强for循环,可以代替 iterator迭代器,特点:增强for 本质就是迭代器。只能用于遍历集合或数组。
1)List 接口是 Collection 接口的子接口
2)List 集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
3)List集合中的每个元素都有其对应的顺序索引,即支持索引。
4)List 容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
1)void add (int index, Object ele):在 index 位置插入 ele 元素
2)boolean addAll (int index, Collection eles):从 index 位置开始将 eles 中的所有元素添加进来
3)Object get (int index):获取指定 index 位置的元素
4)int indexOf (Object obj):返回 obj 在集合中首次出现的位置
5)int lastlndexOf (Object obj):返回 obj 在当前集合中末次出现的位置
6)Object remove (int index):移除指定 index 位置的元素,并返回此元素
7)Object set (int index, Object ele):设置指定 index 位置的元素为 ele,相当于是替换
8)List subList (int fromlndex,int tolndex):返回从 fromlndex 到(tolndex -1)位置的子集合
Listlist = new ArrayList<>(); list.add("乔峰"); list.add("段誉"); list.add(1, "虚竹"); list.add("Tom"); System.out.println(list); // [乔峰, 虚竹, 段誉, Tom] Listlist2 = new ArrayList<>(); list2.add("Jack"); list2.add("Tom"); list.addAll(1, list2); System.out.println(list); // [乔峰, Jack, Tom, 虚竹, 段誉, Tom] System.out.println(list.get(1)); // Jack System.out.println(list.indexOf("Tom")); // 2 System.out.println(list.lastIndexOf("Tom")); // 5 list.remove(5); System.out.println(list); // [乔峰, Jack, Tom, 虚竹, 段誉] list.set(2, "Mike"); System.out.println(list); // [乔峰, Jack, Mike, 虚竹, 段誉] System.out.println(list.subList(0, 2)); // [乔峰, Jack]
1)ArrayList 可以加入null,并且多个
2)ArrayList 是由数组来实现数据存储的
3)ArrayList 基本等同于Vector。ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrayList。
(1)ArrayList 中维护了一个 Object 类型的数组 elementData
transient Objectt[] elementData;【transient 表示该属性不会被序列化】
(2)当创建 ArrayList 对象时,如果使用的是无参构造器,则初始 elementData 容量为0。
第一次添加,则扩容 elementData 为10。如果需要再次扩容的话,则扩容 elementData 为1.5倍。
(3)如果使用的是指定大小的构造器,则初始 elementData 容量为指定大小,如果需要扩容,则直接扩容 elementData 为1.5倍。
1)Vector 类的定义说明
public class Vector extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable 2)Vector 底层也是一个对象数组 protected Object[] elementData;
3)Vector 是线程同步的,即线程安全,Vector 类的操作方法带有 synchronized
4)在开发中,需要线程同步安全时,考虑使用 Vector

1)LinkedList 底层实现了双向链表和双端队列特点
2)可以添加任意元素(元素可以重复),包括 null
3)线程不安全,没有实现同步
1)LinkedList 底层维护了一个双向链表
2)LinkedList 中维护了两个属性 first 和 last 分别指向 首节点和 尾节点
3)每个节点(Node对象),里面又维护了 prev 、next 、item 三个属性,其中通过 prev 指向前一个,通过 next 指向后一个节点。最终实现双向链表
4)所以 LinkedList 的元素的添加和删除,不是通过数组完成的,相对来说效率较高
1)如果我们改查的操作多,选择 ArrayList
2)如果我们增删的操作多,选择 LinkedList
3)一般来说,在程序中,80%-90%都是查询,因此大部分情况下会选择 ArrayList
4)在一个项目中,根据业务灵活选择,也可能这样,一个模块使用的是ArrayList,另
外一个模块是LinkedList。