集合是存储任意数量的具有共同属性的对象的容器,集合存储的是 Java 对象的内存地址 / 引用,不能直接存储 Java 对象或基本数据类型,集合类与集合接口都在 java.util 包下。
方法
boolean hasNext():如果下一个元素可以迭代,则返回 true
Object next():返回迭代中的下一个元素
void remove():删除迭代器指向的当前对象
迭代器和 ConcurrentModificationException 并发修改异常
该异常的触发条件是当前集合状态和迭代器快照(原集合状态)不同
解决方案:
在遍历集合的过程中使用迭代器的 remove() 方法,不是集合对象的 remove() 方法删除元素
获取迭代器后禁止改变集合结构(禁止对集合进行增删改操作)
集合结构发生改变就必须重新获取迭代器
remove()
删除的是迭代器指向的当前元素,同时删除迭代器快照和集合中的元素,删除元素时会自动更新迭代器与集合
boolean add(Object obj):向集合中添加元素 obj
boolean remove(Object obj):删除集合中的某个元素 obj,底层调用 equals() 方法进行比对
boolean contain(Object obj):判断集合中是否存在元素 obj,底层调用 equals() 方法进行比对
boolean isEmpty():判空
int size():获取集合中元素个数
void clear():清空
Object[] toArray():把集合转换成数组
Iterator
List 集合存储元素的特点:有序(存储和读取顺序一致)、可重复、有下标
void add(int index,Object element):指定位置添加元素
Object get(int index):获取指定位置元素
Object remove(int index):删除指定位置元素并返回该元素
Object set(int index,Object element):设置指定位置为某元素,并将原元素返回
int indexOf(Object obj):获取指定对象在集合中第一次出现的索引
int lastIndextOf(Object obj):获取指定对象在集合中最后一次出现的索引
Vector 集合:数组,查询效率高,增删效率低,线程安全(方法都带synchronized)
创建方法:
ArrayList 集合:数组,查询效率高,增删效率低,非线程安全
创建方法:
注意:数组扩容涉及到数组拷贝,应该尽可能减少扩容操作,要预估进行合适的初始化容量设置。
LinkedList 集合:双向链表,查询效率低,增删效率高,非线程安全
创建方法:
**注意:**LinkedList 增删效率未必高于 ArrayList (头部、中间、尾部)
迭代器遍历
Iterator<String> iterator=list.iterator();
while(iterator.hasNext()) System.out.println(iterator.next());
for 循环下标遍历
for(int i=0;i<list.length;i++) System.out.println(list[i]);
for-each 循环遍历
for(String str:list) System.out.println(str);
Set 集合存储元素的特点:无序(存储和读取顺序不一定相同)、不可重复(元素唯一性)、无下标
HashSet 集合:哈希表,非线程安全、效率高
创建方法:
补充:哈希表
哈希表是一维数组和单链表 / 红黑树的结合体(拉链式)
TreeSet 集合:二叉树(中序遍历读取数据),非线程安全、效率高,存储元素自动排序(可排序集合)
创建方法:
迭代器遍历
Iterator<String> iterator=set.iterator();
while(iterator.hasNext()) System.out.println(iterator.next());
for-each 遍历
for(String str:set) System.out.println(str);
Map 集合以键值对(key-value)的形式存储数据。key 和 value 都是引用数据类型、都是存储对象的内存地址 / 引用,key 起主导作用。
Map 集合存储元素的特点:无序(存储和读取顺序不一定相同)、不可重复(数据元素唯一性)
V put(K key,V value):添加键值对
V get(Object key):通过 key 获取 value
V remove(Object key):通过 key 删除键值对
int size():获取键值对数量
void clear():清空
boolean isEmpty():判空
boolean containsKey(Object key):判断是否包含某个 key
boolean containsValue(Object value):判断是否包含某个 value
Set
Collection
Set
HashMap 集合:哈希表,非线程安全,效率高
创建方法:
注意:允许 key 为 null,但是只能存在一个。
HashTable 集合:哈希表,线程安全(所有方法带 synchronized),效率低
创建方法:
**注意:**不允许 key、value 为 null,否则报空指针异常。
TreeMap 集合:红黑树
创建方法:
注意:TreeMap 集合的 key 部分按大小自动排序(可排序集合)。
实现类 | 底层数据结构 | 特点 |
---|---|---|
Vector | 数组 | 有序,可重复,线程安全 |
ArrayList | 数组 | 有序,可重复,非线程安全 |
LinkedList | 双链表 | 有序,可重复,非线程安全 |
HashSet | 哈希表 | 无序,不可重复,非线程安全 |
TreeSet | 二叉树 | 无序,不可重复,非线程安全,自动排序 |
HashMap | 哈希表 | 无序,不可重复,非线程安全 |
HashTable | 哈希表 | 无序,不可重复,线程安全 |
TreeMap | 红黑树 | 无序,不可重复,非线程安全,自动排序 |
JDK 1.5 中,有了 concurrent 包,ConcurrentHashMap 是线程安全的,但是跟 HashTable 不同,HashTable 是在所有方法上加了 synchronized 实现线程安全,而 ConcurrentHashMap 则是将整个 Map 分为 N 个 Segment (类似 HashTable),因此可以提供相同的线程安全。
本质是参数化类型,即在类、接口、方法的定义上指定元素的数据类型(只能是引用数据类型),作用是在编译阶段(泛型机制只在程序编译阶段起作用)检查元素类型是否匹配,避免程序在运行阶段出现过多错误。
优缺点:
自定义泛型:
List
List
仅供参考,如有错误,感谢指正!