文章目录
前言
之前一直在用java的容器时总感觉不太流畅,然后昨天画了一天的时间将容器方面的知识重新复习了一遍,担心以后又忘掉,所以就再花一天时间来写下博客方便以后复习,容器比较多可能昨天看的不够全面,就先这么写先。
容器总体结构图
应该画成UML图的,结果画了一半才想起来,就这样这行,理解就行。
其中List与Set接口都继承Collection接口,而Map接口并没有实现Collection接口,前者是单例模式,后者是双例模式
Collection接口
由于 List、Set是 Collection 的子接口,意味着所有 List、Set 的实现类都有Collection中的方法
Collection接口中的抽象方法
方法 | 说明 |
---|---|
boolean add(Object element) | 增加元素到容器中 |
boolean remove(Object element) | 从容器中移除元素 |
boolean contains(Object element) | 容器中是否包含该元素 |
int size() | 容器中元素数量 |
boolean isEmpty() | 容器是否为空 |
void clear() | 清空容器中所以元素 |
Iterrator iterator() | 获取迭代器,用于遍历所有元素 |
boolean containsAll(Collection c) | 本容器是否包含c容器中的所有元素 |
boolean addAll(Collection c) | 将容器c中所以元素增加到本容器中 (并集) |
boolean removeAll(Collection c) | 移除本容器和容器c中都包含的元素(差集) |
boolean retainAll(Collection c) | 取本容器和容器c都包含的元素,移除非交集元素(交集) |
Object[] toArray() | 转化为Object数组 |
也就是说上面这些方法List、Set的接口实现类都可以使用,继承过来的。
泛型
泛型类与泛型接口跳转链接: 泛型类与泛型接口
List接口
List接口特点
- 有序
- 可重复
List的常用方法
除了Collection接口中的方法,List接口还增加了下面这些跟顺序或索引有关的方法:
方法 | 说明 |
---|---|
void add(int index, Object element) | 在指定位置插入元素,以前的元素全部后移一位 |
Object set(int index, Object element) | 修改指定位置的元素 |
Object get(int index) | 返回指定位置的元素 |
Object remove(int index) | 删除指定位置的元素,后面的元素全部前移一位 |
int indexOf(Object o) | 返回第一个匹配元素的索引,如果没有该元素则返回-1 |
int lastIndexOf(Object o) | 返回最后一个匹配元素的索引,如果没有该元素则返回-1 |
下标索引是从0开始的
ArrayList: ArrayList
Vector与Stack: Vector与Stack
LinkedList: LinkedList
Set接口
Set接口继承Collection,本身没有新增的方法,所以跟前面的List使用的Collection的方法是一样的。
Set接口的特点
- 无序
- 不可重复
HashSet与TreeSet: HashSet与TreeSet
Map接口
Map的特点
Map接口定义了双例集合的存储特征,它就是跟我们数学中的函数y=f(x)一样,键是x,值是y,键是唯一的,一个键只能对应一个值。Map真的很重要,由于它的键值对的存储方式,可以应用到许多地方,这个一定要会,比如我之前博客写的Redis数据库,就是完全适应键值对的方式进行存储数据。
Map的常用方法
方法 | 说明 |
---|---|
V put(K key,V value) | 把键值对key与value添加到Map集合中 |
void putAll(Map m) | 从指定Map中将所有映射关系复制到此Map中 |
V remove(Object key) | 删除key对应的value |
V get(Object key) | 根据指定的key,获取对应的value |
boolean containsKey(Object key) | 判断容器是否包含指定的key |
boolean containsValue(Object value) | 判断容器中是否包含指定的value |
Set keySet() | 获取Map集合中所有的key,存储到Set集合中 |
Set<Map.Entry<K,V> > entrySet() | 返回一个Set基于Map.Entry类型包含Map中所有映射 |
void clear() | 删除Map中的所有映射 |
HashMap与TreeMap: HashMap与TreeMap
Iterator迭代器
通过前面的图片可知,Collection接口继承Iterator接口,而Collection中的iterator方法会返回一个Iterator接口类型的迭代器对象,在该对象中包含了三个方法用于实现对单例容器的迭代处理。
Iterator主要有三个方法:
方法 | 说明 |
---|---|
boolean hasNext(); | 判断游标当前位置是否有元素,有返回true,没有返回false |
Object next() | 获取当前游标所在位置的元素,并将游标移动到下一个位置 |
void remove() | 删除游标当前位置的元素,在执行完next后该操作只能执行一次 |
使用 Iterator 迭代 List 接口类型容器
直接看代码:
public class IteratorList{
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
//方法一
System.out.println("---------------方法一----------------------");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String c = iterator.next();
System.out.println(c);
}
//方法二
System.out.println("----------------方法二--------------------");
for(Iterator<String> it = list.iterator(); it.hasNext();){
String c = it.next();
System.out.println(c);
}
}
}
结果:
使用 Iterator 迭代 Set 接口类型容器
跟遍历List基本一样
public class IteratorSet {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
//方法一
System.out.println("---------------方法一---------------------");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String c = iterator.next();
System.out.println(c);
}
//方法二
System.out.println("----------------方法二--------------------");
for(Iterator<String> it = set.iterator(); it.hasNext();){
String c = it.next();
System.out.println(c);
}
}
}
结果:
使用 Iterator 迭代 Map接口类型容器
前面说过,Iterator是用来遍历单例模式的,对于多例模式的Map我们可以将其转成Set再使用Iterator进行遍历即可,讲Map时不是说过entrySet() 和keySet()这两个方法了,忘了可以重新去看一遍。
public class IteratorMap {
public static void main(String[] args) {
Map<String ,String > map = new HashedMap();
map.put("yql","student");
map.put("mfq","teacher");
map.put("zjl","singer");
System.out.println("-----------方法一 --------------");
Set<String> sets = map.keySet();
String key = null;
Iterator<String> iterator = sets.iterator();
while(iterator.hasNext()){
key = iterator.next();
System.out.println("key = " + key + " value = " + map.get(key));
}
System.out.println("-----------方法二 --------------");
Set<Map.Entry<String, String> > entries = map.entrySet();
Map.Entry<String,String> kv;
for(Iterator<Map.Entry<String, String>> it = entries.iterator(); it.hasNext();){
kv = it.next();
System.out.println("key = " + kv.getKey() + " value = " + kv.getValue());
}
}
}
结果:
这样就实现了Iterator遍历双例的Map了。
Collections工具类
工具类里面的方法是静态方法
方法 | 说明 |
---|---|
void sort(List) | 对 List 容器内的元素排序,排序的规则是按照升序进行排序 |
void shuffle(List) | 对 List 容器内的元素进行随机排列 |
void reverse(List) | 对 List 容器内的元素进行逆续排列 |
void fill(List, Object) | 用一个特定的对象重写整个 List 容器 |
int binarySearch(List, Object) | 对于顺序的 List 容器,采用折半查找的方法查找特定对象 |
本 文就先写到这里,希望下次再用容器时别再忘记了。