【Java】Collection,set,List,Map介绍(附实例)
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection、List、Set、Map的关系图
一、对比数组和集合:
1.数组是存储同一种数据类型的集合容器。
数组的特点:
(1)只能存储同一种数据类型。
(2)初始化之后,长度固定。
(3)数组中的元素与元素之间的内存地址是连续的。
注意:Object类型的数组可以存储任意类型的数据。
2.集合是存储对象数据的集合容器。
集合的优势:
(1)集合可以存储任意类型的对象数据。
(2)集合的长度可以发生变化。
二、基本概念:
1.Collection 单例集合的根接口,List和Set是继承自Collection的子接口。
1.1List 如果是实现了List接口的集合类,具备的特点: 有序,可重复。
1.1.1ArrayList ArrayList 底层是维护了一个Object数组实现的。 特点: 查询速度快,增删慢。
1.1.2LinkedList LinkedList 底层是使用了链表数据结构实现的, 特点: 查询速度慢,增删快。
1.1.3Vector(了解即可) 底层也是维护了一个Object的数组实现的,实现与ArrayList是一样的,但是Vector是线程安全的,操作效率低。
1.2Set 如果是实现了Set接口的集合类,具备的特点: 无序,不可重复。
1.2.1HashSet 底层是使用了哈希表来支持的,特点: 存取速度快.
1.2.2TreeSet 如果元素具备自然顺序 的特性,那么就按照元素自然顺序的特性进行排序存储。
三、常用方法
1.Collection接口
(1)遍历使用迭代子:
1 Collection collection=new ArrayList(); 2 Iterator it = collection.iterator(); // 获得一个迭代子 3 while(it.hasNext()) { 4 Object obj = it.next(); // 得到下一个元素 5 }
Collection方法:
函数 | 返回值 | 作用 |
add(E o) | boolean | 确保此 collection 包含指定的元素(可选操作)。 |
addAll(Collection<? extends E> c) | boolean | 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 |
clear() | void | 移除此 collection 中的所有元素(可选操作)。 |
contains(Object o) | boolean | 如果此 collection 包含指定的元素,则返回 true。 |
containsAll(Collection<?> c) | boolean | 如果此 collection 包含指定 collection 中的所有元素,则返回true。 |
equals(Object o) | boolean | 比较此 collection 与指定对象是否相等。 |
hashCode() | int | 返回此 collection 的哈希码值。 |
isEmpty() | boolean | 如果此 collection 不包含元素,则返回 true。 |
iterator() | Iterator<E> | 返回在此 collection 的元素上进行迭代的迭代器。 |
remove(Object o) | boolean | 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 |
removeAll(Collection<?> c) | boolean | 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 |
retainAll(Collection<?> c) | boolean | 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 |
size() | int | 返回此 collection 中的元素数。 |
toArray() | Object[] | 返回包含此 collection 中所有元素的数组。 |
toArray(T[] a) | <T> T[] | 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
Iterator接口方法:
函数 | 返回值 | 作用 |
hasNext() | boolean | 如果仍有元素可以迭代,则返回 true。 |
next() | E | 返回迭代的下一个元素。 |
remove() | void | 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。 |
2.Map 接口
2.1Map 接口不是 Collection 接口的继承。Collection是单列集合, Map 是双列集合。按定义,该接口描述了从不重复的键到值的映射。
(1)Map存储的是键值对。
(2)Map存储元素使用put方法,Collection使用add方法。
(3)Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素。
(4)Map集合中键要保证唯一性。
2.2Map常用方法:
函数 | 返回值 | 作用 |
clear() | void | 删除图中所有的条目 |
containsKey(key:Object) | boolean | 若图中包含指定键值对应的条目返回true |
containsValue(value:Object) | boolean | 若图中一个或多个键值映射到特定值则返回true |
entrySet() | Set<Map.Entry<K,V>> | 返回一个包含图中条目的规则集 |
get(key:Object) | v | 返回一个包含图中条目的规则集 |
isEmpty() | boolean | 若图中不包含任何条目则为true |
keySet() | Set<K> | 返回包含图中键值的一个规则集 |
put(key:K,vale:V) | V | 将一个映射放入图中 |
putAll(m:Map<,>) | void | 将所有来自m的条目添加到图中 |
remove(key:Object) | V | 删除指定键值对应的条目 |
size() | int | 返回图中的条目个数 |
values() | Collection<v> | 返回包含图中值的集合 |
四、实例
(1)ArrayList的增加与删除遍历;HashMap的增加删除与遍历。
import java.util.*;
public class CollectionAndMap {
public static void add() {
// ArrayList增加删除
Collection collection = new ArrayList(Arrays.asList("red", "blue", 2, 5.2));// 初始化
collection.add("green");// 添加
Object[] string = collection.toArray(); // 转换为Object[]
for (Object str : string)
System.out.println(str.toString());
Iterator it = collection.iterator();// 迭代子访问
while (it.hasNext()) {
Object temp = it.next();
System.out.print(temp + "\t");
it.remove();
}
System.out.println("\n" + "现在为:空即为true:" + collection.isEmpty());
// 使用HashMap存储访问<String,Integer>;
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("red", 2);
map.put("red", 3);// 前一个会被覆盖
map.put("blue", 5);
Set<Map.Entry<String, Integer>> set = map.entrySet();
Iterator<Map.Entry<String, Integer>> itSet = set.iterator();// 迭代子访问
int tag=1;
while (itSet.hasNext()) {
Map.Entry<String, Integer> temp = itSet.next();
String str = temp.getKey();
Integer integer = temp.getValue();
if(tag==1){
itSet.remove();//删除第一项
tag--;
}
System.out.println(str + ":" + integer.intValue());
}
System.out.println(map.size());
}
public static void main(String[] args){
add();
}
}
(2)HashMap<String,Integer>统计String的个数(从文件中读取数据):形如(第三个参数不使用):
1 red 2 one 2 green 5 two 3 black 7 three 4 red 10 forth
实现代码:
public static HashMap<String, Integer> MapRead(File filea) throws FileNotFoundException { HashMap<String, Integer> hashmap = new HashMap<String, Integer>(); BufferedReader bra = new BufferedReader(new FileReader(filea)); Scanner sa = new Scanner(bra); while (sa.hasNextLine()) { String line = sa.nextLine(); String[] lines = line.split("\t"); String name = lines[0]; String num = lines[1]; /* 统计第一个String 个数 */ if (hashmap.containsKey(name)) hashmap.put(name, hashmap.get(name) + 1); else hashmap.put(name, 1); } System.out.println("单词"+"\t"+"个数"); for (Map.Entry<String, Integer> entry : hashmap.entrySet()) { Object key = entry.getKey(); Object val = entry.getValue(); System.out.println(key.toString() + "\t" + val.toString());
} return hashmap; }
输出结果: