java集合详解
Java集合详解
一、集合的基本框架
java中的集合结构可分为两大类:collction和Map两种体系
Collection接口 单列数据, 定义存取一组对象的方法集合
Map接口 双列数据,保存具有映射关系key-value对的集合
|----Collection接口:单列集合,用来存储一个一个的对象
|----List接口:一种包含有序元素的线性表,可存储有序的、可重复的数据。
可以存放多个null值。 -->“动态”数组
|----ArrayList:作为List接口的主要实现类,多用于频繁的改查操作,线程不安全的,效率高;
底层采用Object[] elementData数组存储。
|----LinkedList:对于频繁的插入删除操作,使用此类效率比ArrayList效率高,线程也不安全
底层采用双向链表存储
|----Vector:作为List的古老实现类,线程安全的,效率低;
底层采用Object[]数组存储
|----Set接口:存储无序的、不可重复的数据 -->数学概念上的“集合”
|----HashSet:作为Set接口主要实现类;线程不安全;可以存null值
底层采用数组+链表+红黑树
|----LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加顺序遍历;对于频繁的遍历操作, LinkedHashSet效率高于HashSet.
底层采用数组+双向链表+红黑树
|----TreeSet:可以按照添加对象的指定属性,进行排序。
底层采用红黑树
|----Map:双列数据,存储key-value对的数据
|----HashMap:作为Map的主要实现类;线程不安全的,效率高;可存储key和value可以为null,且值(value)可以存在多个null,键 (key)只能出现一个null,若key中出现多个null,其结果是对第一个null的值进行覆盖
|----LinkedHashMap:保证在遍历map元素时,可以照添加的顺序实现遍历。
原因:在原的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,此类执行效 率高于HashMap。
|----TreeMap:保证照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序,底层使用红黑树
|----Hashtable:作为古老的实现类;线程安全的,效率低;不能存储null的key和value
|----Properties:常用来处理配置文件。key和value都是String类型
二、collection接口
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。
- collection中的抽象方法
//添加
boolean add(object e)
//删除
boolean remove(Object o)
//清空集合
void claer()
//是否包含某个元素
boolean contains(Object o)
//集合是否为空
boolean isEmpty()
//集合中元素个数
int size()
// 将一个集合中的元素添加到另一个集合中
boolean addAll(Collection c)
//在c1中移除与c2相同部分的元素
boolean removeAll(Collection c)
//判断一个集合中是否包含另一个集合的所有元素
boolean containsAll(Collection c)
// c1与c2做交集 交集的结果存储在c1中,c2不变
boolean retainAll(Collection c)
//把集合转成数组,可以实现集合的遍历
Object[] toArray()
//迭代器,集合的专用遍历方式
Iterator iterator()
-
Iterator接口概述
-
对 collection 进行迭代的迭代器
-
接口成员方法
//判断迭代器下一对象是否存在 boolean hasNext() //获得迭代下一个对象 E next() //遍历集合c1 Iterator iterator = c1.iterator(); while (iterator.hasNext()) { String s = (String) iterator.next(); System.out.println(s + ", " + s.length()); }
-
2.1.List接口概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与 set 不同,列表通常允许重复的元素。
- List接口的成员方法
//添加
void add(int index,E element)
//删除
E remove(int index)
//获取
E get(int index)
//修改
E set(int index,E element)
//列表迭代器,List集合特有的迭代器
ListIterator listIterator()
- ListIterator接口的成员方法
boolean hasPrevious()
E previous()
1.ArrayList类概述
底层数据结构是数组,查询快,增删慢线程不安全,效率高
2.Vector类概述
底层数据结构是数组,查询快,增删慢线程安全,效率低
- Vector类特有功能
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
3.LinkedList类概述
底层数据结构是链表,查询慢,增删快线程不安全,效率高
- LinkedList类特有功能
//向集合头或尾添加元素
public void addFirst(E e) addLast(E e)
//获取集合头或尾的元素
public E getFirst() getLast()
//删除集合头和尾的元素
public E removeFirst()及public E removeLast()
2.2.HashSet类概述
不保证 set 的迭代顺序,特别是它不保证该顺序恒久不变。HashSet如何保证元素唯一性
底层数据结构是哈希表(元素是链表的数组)
哈希表依赖于哈希值存储
int hashCode()
boolean equals(Object obj)
- LinkedHashSet类概述
元素有序唯一
由链表保证元素有序
由哈希表保证元素唯一
2.3TreeSet类概述
使用元素的自然顺序对元素进行排序或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
底层数据结构是红黑树(红黑树是一种自平衡的二叉树)
自然排序:
class Student2 implements Comparable<Student2> {
String name;
int age;
//显式条件:按照年龄从小到大排序
//隐藏条件:当年龄一样的时候,比较姓名
//this -- 待插入的元素
//o -- 已经在树中的根
int i1 = this.age - s.age;
return (i1 == 0) ? this.name.compareTo(s.name) : i1;
}
}
比较器排序:
TreeSet<Student3> treeSet = new TreeSet<>(new Comparator<Student3>() {
@Override
public int compare(Student3 o1, Student3 o2) {
//o1 -- 待插入的元素
//o2 -- 已经存在树中的根
int i1 = o1.age - o2.age;
return (i1 == 0) ? o1.name.compareTo(o2.name) : i1;
}
});
小总结:
1、如果要使用自然排序,在创建TreeSet对象的时候,使用无参构造方法,
但是要保证元素的类实现Comparable接口,重写compareTo方法。
2、如果要使用比较器排序,在创建TreeSet对象的时候,使用有参构造方法,
传入一个实现了Comparator接口的子类对象,重写compare方法
三、Map接口概述
将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值
- Map集合的成员方法
//添加
V put(K key,V value)
//移除
V remove(Object key)
//清空集合
void clear()
//集合是否包含某个键
boolean containsKey(Object key)
//集合是否包含某个值
boolean containsValue(Object value)
//集合是否为空
boolean isEmpty()
//集合元素个数
int size()
//根据键获取值
V get(Object key)
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
//遍历集合的两种方式
Set<Integer> integers = map.keySet();
for (Integer integer : integers) {
String value = map.get(integer);
System.out.println(integer+"---"+value);
}
Set<Map.Entry<Integer, String>> entries = map.entrySet();
for (Map.Entry<Integer, String> entry : entries) {
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"----"+value);
}
1.HashMap类概述
键是哈希表结构,可以保证键的唯一性
2.TreeMap类概述
键是红黑树结构,可以保证键的排序和唯一性
四、Collections类概述
- 针对集合操作的工具类
- Collections成员方法
public static <T> void sort(List<T> list)
public static <T> int binarySearch(List<?> list,T key)
public static <T> T max(Collection<?> coll)
public static void reverse(List<?> list)
//将集合中元素随机打乱
public static void shuffle(List<?> list)