一、集合框架概述
Java 集合框架中的类可以用于存储多个对象
,还可用于保存具有映射关系
的关联数组。
集合框架全图:
Collection接口继承树 :
Map接口继承树 :
二、Iterator(迭代器)接口
1、Iterator接口
- Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
public Iterator iterator()
: 获取集合对应的迭代器,用来遍历集合中的元素的。- 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
-
Iterator接口的常用方法如下:
-
public E next()
:返回迭代的下一个元素。 -
public boolean hasNext()
:如果仍有元素可以迭代,则返回 true。
-
-
注意:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出
NoSuchElementException异常
。
2、迭代器执行原理
3、foreach循环
-
foreach循环(也称增强for循环)是 JDK5.0 中定义的一个高级for循环,专门用来
遍历数组和集合
的。
foreach循环的语法格式:
for(元素的数据类型 局部变量 : Collection集合或数组){
//操作局部变量的输出操作
}
//这里局部变量就是一个临时变量,自己命名就可以
三、Collection子接口1:List
List集合类中元素有序
、且可重复
,集合中的每个元素都有其对应的顺序索引。
List接口的实现类常用的有:ArrayList
、LinkedList
和Vector
1、List接口方法
-
插入元素
-
void add(int index, Object ele)
:在index位置插入ele元素 -
boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
-
-
获取元素
-
Object get(int index)
:获取指定index位置的元素 -
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合
-
-
获取元素索引
-
int indexOf(Object obj):返回obj在集合中首次出现的位置
-
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
-
-
删除和替换元素
-
Object remove(int index)
:移除指定index位置的元素,并返回此元素 -
Object set(int index, Object ele)
:设置指定index位置的元素为ele
-
2、List接口主要实现类:ArrayList
-
ArrayList 是 List 接口的
主要实现类
-
本质上,ArrayList是对象引用的一个”变长”数组
3、List的实现类之二:LinkedList
对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。这是由底层采用链表(双向链表)结构存储数据决定的。
特有方法:
-
void addFirst(Object obj)
-
void addLast(Object obj)
-
Object getFirst()
-
Object getLast()
-
Object removeFirst()
-
Object removeLast()
4、List的实现类之三:Vector
Vector 是一个古老
的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全
的。但是效率慢。
特有方法:
-
void addElement(Object obj)
-
void insertElementAt(Object obj,int index)
-
void setElementAt(Object obj,int index)
-
void removeElement(Object obj)
-
void removeAllElements()
四、Collection子接口2:Set
Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。Set的常用实现类有:HashSet、TreeSet、LinkedHashSet。
1、核心方法
boolean add(E e); // 添加元素,如果元素已存在则返回false boolean remove(Object o); // 移除指定元素 boolean contains(Object o); // 判断是否包含指定元素 int size(); // 返回集合大小 boolean isEmpty(); // 判断集合是否为空 void clear(); // 清空集合 Iterator<E> iterator(); // 返回迭代器
2、Set主要实现类:HashSet
底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储。
特点:
-
基于哈希表实现
-
不保证元素的顺序
-
允许 null 元素
-
添加、删除、查找操作的时间复杂度为 O(1)
注意:
HashSet 集合判断两个元素相等的标准
:两个对象通过 hashCode()
方法得到的哈希值相等,并且两个对象的 equals()
方法返回值为true。
存储在 HashSet 中的类必须同时重写 hashCode() 和 equals() 方法
3、Set实现类之二:LinkedHashSet
是HashSet的子类,在现有的数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录元素的添加先后顺序。
特点:
-
HashSet 的子类
-
维护了一个双向链表,保持了元素的插入顺序
-
性能略低于 HashSet
-
迭代访问时比 HashSet 快
4、Set实现类之三:TreeSet
底层使用红黑树,可以按照添加元素的指定属性进行遍历。
它判断两个对象是否相等的唯一标准
是:两个对象通过 compareTo(Object obj) 或compare(Object o1,Object o2)
方法比较返回值。返回值为0,则认为两个对象相等。
特点:
-
基于红黑树实现
-
元素按照自然顺序或 Comparator 排序
-
添加、删除、查找操作的时间复杂度为 O(log n)
-
不允许 null 元素(取决于 Comparator 实现)
五、Map接口
Map 中的 key 和 value 都可以是任何引用类型的数据。但常用String类作为Map的“键”。
Map接口的常用实现类:HashMap
、LinkedHashMap
、TreeMap
和`Properties
。其中,HashMap是 Map 接口使用频率最高
的实现类。
1、Map中key-value特点
- Map 中的
key用Set来存放
,不允许重复
,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法 - key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value,不同key对应的
value可以重复
。value所在的类要重写equals()方法。 - key和value构成一个entry。所有的entry彼此之间是
无序的
、不可重复的
。
2、Map接口的常用方法
-
添加、修改操作:
-
Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
-
void putAll(Map m):将m中的所有key-value对存放到当前map中
-
-
删除操作:
-
Object remove(Object key):移除指定key的key-value对,并返回value
-
void clear():清空当前map中的所有数据
-
-
元素查询的操作:
-
Object get(Object key):获取指定key对应的value
-
boolean containsKey(Object key):是否包含指定的key
-
boolean containsValue(Object value):是否包含指定的value
-
int size():返回map中key-value对的个数
-
boolean isEmpty():判断当前map是否为空
-
boolean equals(Object obj):判断当前map和参数对象obj是否相等
-
-
元视图操作的方法:
-
Set keySet():返回所有key构成的Set集合
-
Collection values():返回所有value构成的Collection集合
-
Set entrySet():返回所有key-value对构成的Set集合
-
3、Map的主要实现类:HashMap
特点:
-
HashMap是 Map 接口
使用频率最高
的实现类。 -
HashMap是线程不安全的。允许添加 null 键和 null 值。
-
存储数据采用的哈希表结构,底层使用
一维数组
+单向链表
+红黑树
进行key-value数据的存储。与HashSet一样,元素的存取顺序不能保证一致。 -
HashMap
判断两个key相等的标准
是:两个 key 的hashCode值相等,通过 equals() 方法返回 true。 -
HashMap
判断两个value相等的标准
是:两个 value 通过 equals() 方法返回 true。
4、Map实现类之二:LinkedHashMap
-
LinkedHashMap 是 HashMap 的子类
-
存储数据采用的哈希表结构+链表结构,在HashMap存储结构的基础上,使用了一对
双向链表
来记录添加元素的先后顺序
,可以保证遍历元素时,与添加的顺序一致。 -
通过哈希表结构可以保证键的唯一、不重复,需要键所在类重写hashCode()方法、equals()方法。
5、Map实现类之三:TreeMap
-
TreeMap存储 key-value 对时,需要根据 key-value 对进行排序。TreeMap 可以保证所有的 key-value 对处于
有序状态
。 -
TreeSet底层使用
红黑树
结构存储数据 -
TreeMap 的 Key 的排序:
-
自然排序
:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException -
定制排序
:创建 TreeMap 时,构造器传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口
-
-
TreeMap判断
两个key相等的标准
:两个key通过compareTo()方法或者compare()方法返回0。
6、Map实现类之四:Hashtable
-
Hashtable是Map接口的
古老实现类
,JDK1.0就提供了。不同于HashMap,Hashtable是线程安全的。 -
Hashtable实现原理和HashMap相同,功能相同。底层都使用哈希表结构(数组+单向链表),查询速度快。
-
与HashMap一样,Hashtable 也不能保证其中 Key-Value 对的顺序
-
Hashtable判断两个key相等、两个value相等的标准,与HashMap一致。
-
与HashMap不同,Hashtable 不允许使用 null 作为 key 或 value。
7、Map实现类之五:Properties
-
Properties 类是 Hashtable 的子类,该对象用于处理属性文件
-
由于属性文件里的 key、value 都是字符串类型,所以 Properties 中要求 key 和 value 都是字符串类型
-
存取数据时,建议使用setProperty(String key,String value)方法和getProperty(String key)方法
六、Collections工具类
常用方法
排序操作:
-
reverse(List):反转 List 中元素的顺序
-
shuffle(List):对 List 集合元素进行随机排序
-
sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
-
sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
-
swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
查找
-
Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
-
Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
-
Object min(Collection):根据元素的自然顺序,返回给定集合中的最小元素
-
Object min(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最小元素
-
int binarySearch(List list,T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且必须是可比较大小的,即支持自然排序的。而且集合也事先必须是有序的,否则结果不确定。
-
int binarySearch(List list,T key,Comparator c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象,而且集合也事先必须是按照c比较器规则进行排序过的,否则结果不确定。
-
int frequency(Collection c,Object o):返回指定集合中指定元素的出现次数
复制、替换
-
void copy(List dest,List src):将src中的内容复制到dest中
-
boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
-
提供了多个unmodifiableXxx()方法,该方法返回指定 Xxx的不可修改的视图。
添加
-
boolean addAll(Collection c,T... elements)将所有指定元素添加到指定 collection 中。
同步
-
Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题: