11 集合
1 Collection接口
常用的方法:
add(Object e) 确保此 collection 包含指定的元素(可选操作)。
size(): 获取集合中元素的个数
remove(Object e): 移除元素
clear(): 清空集合中元素
contains(Object e): 判断集合中是否包含指定的元素
isEmpty(): 判断集合是否为空
iterator(): 获取集合对应的迭代器。
元素数组和集合的区别:
数组:一旦声明了数组长度无法改变,只能保持指定的数据类型,元素的数据类型必须相同,不能混排。
集合:长度和动态扩容类型可以是任何类型,可以混合使用。
2 List接口(Collection接口)
LIst接口存储一组不唯一,有序(插入顺序)的对象。
----ArrayList类:在内存中存储位置是连续的,线性结构(可变长度的数组),随机访问或遍历效率较高,但插入和删除元素效率较低.
----LinkedList类:在内存中存储位置是不连续的,链表结构,插入和删除元素时效率较高,但随机访问或遍历效率较低。
2.1 ArrayList
ArrayList可以看作可变长度的数组,本质上就是通过数组实现的,在内存中存储空间是连续的。
优点:随机访问或遍历时效率较高。
缺点:添加和删除元素时效率较低。
常用的构造方法
ArrayList() 构造一个初始容量为 10 的空列表。
ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。
eg:Collection list = new ArrayList();
常用的方法:
add(Object e):将元素添加到集合中。
--Object get(int index):获取指定下标位置的元素.
*在调用add方法添加元素时,该元素会向上转型为Object类型,所有使用get方法获取是返回值为Object
add(int index, E element) 将指定的元素插入此列表中的指定位置。
get(int index) 返回此列表中指定位置上的元素。下标从0开始
addAll(Collection<? extends E> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
set(int index, E element)用指定的元素替代此列表中指定位置上的元素。
remove(int index)移除此列表中指定位置上的元素。
remove(Object o) 移除此列表中首次出现的指定元素(如果存在)。
泛型:限定集合中元素的类型。一旦对集合使用泛型,该集合中能容纳的元素类型就固定了。
语法:List<E> list = new ArrayList<E>(); E为数据类型
优点:1)可以避免强制转换
2)可以消除黄色的警告。
2.2 LinkedList
LinkedList类: 采用的链表结构进行存储,在内存中存储位置是不连续的,插入和删除元素时效率较高,但随机访问或遍历效率较低。
优点:添加和删除元素是效率较高
缺点:随机访问或遍历时效率较低。
常用方法:
add(Object o):将指定元素添加到此列表的结尾。
add(int index, E element)在此列表中指定的位置插入指定的元素。
addFirst(E e) 将指定元素插入此列表的开头。(LinkedList特有的)
addLast(E e)将指定元素添加到此列表的结尾。(LinkedList特有的)
getFirst() 返回此列表的第一个元素。
getLast() 返回此列表的最后一个元素。
removeFirst() 移除并返回此列表的第一个元素。
removeLast() 移除并返回此列表的最后一个元素。
2.3 Vector
Vector类似与ArrayList的线性结构,Vector是基于线程安全的,在多线程中使用;ArrayList是非线程安全的,效率较高。
2.4 Stack/Quence
Stack栈LIFO/FILO:后进先出(Last In First Out),先进后出(First In Last Out)
---类似于玩具枪的弹夹,第一个压进去的子弹最后一个弹出
---入栈(压栈):将元素添加到栈中。
---出栈(弹栈):将元素从栈的顶部移除。
Quence队列FIFO:先进先出(First In First Out)
2.5 Iterator接口
java.util.Iterator接口:对 collection 进行迭代的迭代器。
boolean hasNext() 如果仍有元素可以迭代,则返回 true。
next() 返回迭代的下一个元素。
使用迭代器进行遍历:
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String str = iter.next();
System.out.println(str);
}
3 Set接口(Collection接口)
Set接口: 无序,唯一(不重复)
3.1HashSet
HashSet:采用哈希表(散列表)的方式存储。
优点:查询,添加,删除效率较高
缺点:无序(添加顺序)
常用的构造方法:
HashSet() 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
HashSet(int initialCapacity) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和默认的加载因子(0.75)。
常用的方法:
add(E e)如果此 set 中尚未包含指定元素,则添加指定元素。
clear() 从此 set 中移除所有元素。
contains(Object o) 如果此 set 包含指定元素,则返回 true。
iterator() 返回对此 set 中元素进行迭代的迭代器。
size()返回此 set 中的元素的数量(set 的容量)。
remove(Object o)如果指定元素存在于此 set 中,则将其移除。
HashSet如何保证其元素的唯一性?
在添加元素时调用hashCode()获取元素的哈希码,判断要添加元素的哈希码是否相同,如果相同调用equals方法比较内容是否相同;如果哈希码不相同,equals方法将不再调用。
如果equals相同,hash码肯定相同;hash码相同,equals结果不一定相同。
3.2 LinkedHashSet
LinkedHashSet继承了HashSet,采用的是哈希码+链表的结构进行存储,其中的元素有序(添加顺序)。
常用的构造方法
LinkedHashSet() 构造一个带默认初始容量 (16) 和加载因子 (0.75) 的新空链接哈希 set
LinkedHashSet(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的新空链接哈希 set。
常用的方法:
add(Object a):添加元素
remove(Object a):移除指定的元素
contains(Object a):是否包含指定的元素
size():获取元素的个数。
iterator():返回一个迭代器
3.3 TreeSet
TreeSet:采用二叉树的方式进行存储,其中元素有序(大小顺序)。要添加元素是必须实现Comparable接口或传入一个比较器(需要实现Comparator接口)。
原理:当向TreeSet容器添加元素时,会将当前元素的值与根节点/父节点的值进行比较,
如果比根节点/父节点的值大,保存在右子节点上;
如果比根节点/父节点的值小,保存在左子节点上。
优点:有序,查询速度比List要快(折半查找)。
常用的构造方法:
TreeSet() 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。插入该 set 的所有元素都必须实现 Comparable接口
TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
常用的方法:
add(Object o): 添加元素
remove(Object o): 移除元素
contains(Object o): 如果此 set 包含指定的元素,则返回 true。
size(): 返回 set 中的元素数(set 的容量)。
iterator():返 回在此 set 中的元素上按升序进行迭代的迭代器
示例:在实现 Comparable接口时重写compareTo方法
public class Student implements Comparable<Student>
* 定义比较规则:
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数
@Override
public int compareTo(Student o) {
// if(age>o.age){
// return 1;
// }else if(age==o.age){
// return 0;
// }else{
// return -1;
// }
return age-o.age;
}
4 Map接口
Map接口并不是Collection接口的子接口,Map接口采用的键值对方式进行存储数据,提供key到value的映射。无序
4.1 HashMap
HashMap:基于哈希表的 Map 接口的实现。
常用的构造方法:
HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子(0.75) 的空HashMap。
HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
常用方法:
put(K key, V value) 在此映射中关联指定值与指定键。
get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
size() 返回此映射中的键-值映射关系数。
remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。
clear() 从此映射中移除所有映射关系。
containsKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true。
containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
4.2 Hashtable
Hashtable与HashMap类似,不同之处主要是以下两点:
1)HashMap是非线程安全的,而Hashtable是线程安全的
2)HashMap中的键和值都运行为null,而Hashtable不允许。
4.3 LinkedHashMap
java.util.LinkedHashMap:哈希表+链表结构,有序(添加顺序),继承了HashMap类。
常用的构造方法:
LinkedHashMap() 构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例
LinkedHashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。
常用的方法:
put(K key, V value) 在此映射中关联指定值与指定键。
get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
size() 返回此映射中的键-值映射关系数。
remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。
clear() 从此映射中移除所有映射关系。
containsKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true。
containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
* Set<K> keySet() 返回此映射中所包含的键的 Set 视图。
* Set<Map.Entry<K,V>> entrySet() 返回此映射所包含的映射关系的 Set 视图。
4.4 TreeMap
TreeMap采用二叉树的方式存储,与TreeSet类似。其中的元素有序(大小顺序)。
要求添加的元素必须是可比较大小
1)实现Comparable接口
2)创建一个比较器(实现Comparator接口)
在添加元素时根据键的自然顺序进行存储数据。
常用的构造函数:
TreeMap() 使用键的自然顺序构造一个新的、空的树映射。 插入该映射的所有键都必须实现 Comparable 接口.
TreeMap(Comparator<? super K> comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。
5 Collections类
Collections类是一个对Collection集合进行操作的工具类型,其中提供一些静态的工具方法方便操作。
Collection和Collections的区别:
1) Collection是List和Set的父接口,而Collections是操作Collection集合的工具类。
2)Collections(对Collection集合进行操作的工具类),类似Arrays类(对数组进行操作的工具类),提供了若干个静态的方法以方便操作集合。
常用的方法:
addAll(Collection<? super T> c, T... elements) 将所有指定元素添加到指定 collection 中。
sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。
reverse(List<?> list)反转指定列表中元素的顺序。
max(Collection<? extends T> coll) 根据元素的自然顺序,返回给定 collection 的最大元素。
min(Collection<? extends T> coll) 根据元素的自然顺序 返回给定 collection 的最小元素。
binarySearch(List<? extends Comparable<? super T>> list, T key) 使用二分搜索法搜索指定列表,以获得指定对象,必须根据列表元素的自然顺序对列表进行升序排序
eg:Collections.sort(list); //排序,默认按照升序进行排列
Collections.reverse(list); //反转:倒序输出
int index = Collections.binarySearch(list, 9); //二分查找:待查找的集合中元素必须有大小顺序