Java课程复习之集合框架
一、集合框架的概念
1.Java集合框架
- 集合框架由一系列的集合类和接口所组成,主要存放在
java.util
包中 - 集合类接口提供对集合元素的共性操作,如增删改查集合元素。
- 集合类封装了底层常用的数据结构
- Java集合框架类图
二、集合类接口
1.Collection接口类型
Collection
是集合类的基本接口- 子接口主要包含
List,Set,Queue
- List规定实现该接口的集合类元素具有可以控制的顺序,但并没有定义或限制排序
Set
不能包含重复的元素Queue
支持队列的插入、取出等操作,其子接口Deque支持两端的插入、取出操作。
三、常用集合类
1.常用集合类- ArrayList类(内部实现基于数组)
- ArrayList < E > – 使用泛型
Java泛型属于擦除型编译之后E类型被擦除,变为Object类型 - 如果数组大小超过容量,则容量增加原容量的50%;
2.常用集合类- LinkedList类(内部实现基于链表)
- 内部实现基于双向链表
3.常用集合类-ArrayDeque(提供栈结构实现)
- 实现了
Deque
接口
4.常用集合类-HashSet(无重复元素的集合)
- HashSet实现基于
HashMap
(哈希表) - 通过
hashCode
和equals
方法确保集合元素的唯一性- 如果两个对象的equals的结果是相等的,则两个对象的hashCode的返回结果也是相同的
- 任何适合覆写equals,都必须同时覆写hashCode
5.ArrayList和LinkedList比较
- 共同点:
都是List接口的实现类,用来存储一组可变的对象集合 - 不同点:
ArrayList
:
内部实现基于内部数组Object[ ];
随机访问元素是,可以通过索引直接定位,效率较高
插入、删除等操作需移动数组元素,效率较低
元素大于数组容量,需要扩容LinkedList
:
内部实现基于一组链接的Node结点。
随机访问元素时,必须从表头开始,效率较低
插入、删除操作不需要移动Node结点,比ArrayList效率高
按需为元素分配内存空间
6.Vector和ArrayList比较
-
共同点:
都是用来存储一组数量可变的对象集合,并可通过get方法随机地访问其中的元素
-
不同点:
Vector
:
方法是同步的(Synchronized),是线程安全的
当Vector的元素超过初始大小时,Vector的容量会翻倍ArrayList
:
ArrayList 的方法不是同步的,但性能很好(线程的同步会影响性能)
当ArrayList 中的元素超过它的初始大小时,ArrayList只增加50%的大小
7.对集合遍历的接口
lterator
接口-
lterator操作 描述 hasNext() 检索到有下一个对象返回ture,否则返回false。 next() 在hasNext方法为true时调用,返回一个Object类型的对象引用。若这个方法没有对象返回,则抛出一个 NoSuchElementException
异常。remove() 在提供迭代器的集合对象中删除由next()方法指向的一个对象元素。若没有调用next(),或调用next()后连续两次调用remove(),则会抛出 IllegaStateException
异常。不是所有提供此迭代器的集合对象都支持这个方法,如果不支持情况下调用了该方法,则会抛出UnsupportedOperation
异常。 - ListIterator接口—不仅可以实现向后遍历,还可以实现向前遍历
8.集合对象排序接口Comparable(自身比较器)
- Integer、String等类已经实现了Comparable接口
- 抽象方法:compareTo(T o)
- 用Collections类的静态方法排序
Collections.sort(al);
9.集合对象排序接口Comparator(自定义比较器)
- 自定义集合元素比较器
public interface Comparator{int compare(Object o1,Object o2);}
- 使用自定义比较器 :
Collections.sort(al, new Compa());
10.Map接口类型
- Map接口用于将一个键(Key)映射到一个值(Value),且不允许有重复的键,每个键最多映射到一个值
- Map操作:
Map操作 描述 Map改变 允许用户改变当前Map的内容,包括关键字/值对的==插入/更新 V put(K key, V value);==删除 remove() Map查询 允许用户从Map中获取关键字对应的值。V get(Object key) 三种不同Map视图 Set< K > keySet();
//返回Map类对象中的Key的Set视图Collection< V > values();
//返回Map类对象中的所有value集合的 Collection视图Set<Map.Entry<K,V>> entrySet()
//返回Map类对象中的Key-Value 对的Set视图
11.HashMap原理
HashMap
内部实现基于哈希表,采用链表法解决哈希冲突- HashMap初始化和动态扩容(减少哈希冲突)
默认容量为16,默认装载因子为0.75
如果扩容,则扩容至原来哈希表大小的2倍 - 当哈希表中链表过长时(大于等于8),链表会转换为红黑树,提高性能
- HashMap是非线程安全的
- 当使用自定义对象作为Key时,需同时覆写hashCode和equals方法,确保Key的唯一性
12.TreeMap原理
- TreeMap内部实现基于红黑树(属于二叉查找树)。
- TreeMap按照Key的排序结果来组织内部结构。
- TreeMap依靠
Comparable
和Comparator
实现Key的去重。
13.HashMap和TreeMap比较
- 共同点:
- 都可以实现多组key和value之间的映射
- 不同点:
HashMap
:
如果没有按照关键字顺序提取Map元素的需求,那么HashMap是更实用的结构。TreeMap
:
TreeMap在操作上需要比HashMap更多一些的开销,这是由于树的结构造成的,它返回排序的关键字。
四、集合类
1.Collections类
- 该类通过一些静态方法,完成集合类的一些操作功能,例如
Collections.sort(List l);
- Collections和Collection是两个不同的概念,前者是类,后者是集合接口
2.集合类StringTokenizer
token
为单元的字符串集合,它实现了Enumeration
接口,对其集合进行遍历采用Enumeration
提供的方法,也可采用它自己的方法。