Collection这个接口下的4个子接口:List、Set、Queue(队列)、Map(键值对/映射表 /字典/关联数组)
List:它以特定的顺序保存一组元素,有序可重复的,查找快,删除和插入慢因为会重新排序
Set:与List一样,但是它的元素是无序且不能重复的,查找慢,删除和插入快
Queue:按照排队规则来确定对象的产生顺序,只允许在一端插入对象,并从另一端移除对象
Map:保存两个对象,键和值
实现List接口的类有:ArrayList、LinkedList(链表)、Vector、Stack(栈):LIFO后进先出
实现Set接口的类有:HashSet、TreeSet、LinkedHashSet
实现Queue接口的类有:FIFO先进先出
实现Map接口的类有:HashMap、TreeMap、LinkedHashMap
迭代器:Iterator,它是一个对象 ,它的工作:遍历并选择序列中的对象。Java中的Iterator只能单向移动。它的常用方法:
iterator() 返回一个Iterator,并且准备好返回序列的第一个元素。
next()获取 序列中的下一个元素
hasNext() 检查序列中是否还有元素
remove() 将迭代器新近返回的元素删除
Map集合:Map 存储的是键值对形式的元素,每个键最多只能映射到一个值。键唯一,值可以重复。
Map的常见实现类:
HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现不是同步的。
LinkedHashMp:Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。此实现不是同步的
WeakHashMap:以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,null 值和 null 键都被支持。
Hashtable:此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。 Hashtable 是同步的
TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 此实现不是同步的
Map的常用方法如下:
Map的常用方法示例:
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapReview {
public static void main(String[] args) {
Map<String,String> map=new HashMap<String,String>();
map.put("000", "qqq");
map.put("003", "rrr");
map.put("001", "www");
map.put("002", "eee");
map.put("004", "sss");
System.out.println(map);
// 遍历1 : 通过键值对对象entrySet获取键与值
Set<Map.Entry<String,String>> entrySet=map.entrySet();
for(Map.Entry<String,String> entry:entrySet) {
String key=entry.getKey();
String value=entry.getValue();
System.out.println("Key="+key+" Value="+value);
}
System.out.println("------------------------");
// 遍历2 : 通过键keySet获取值
Set<String> keySet=map.keySet();
for(String key:keySet) {
String value=map.get(key);
System.out.println("Key="+key+" Value="+value);
}
System.out.println("------------------------");
// 获取Map值的集合
Collection<String> values=map.values();
System.out.println(values);
// 判断是否存在键和值
System.out.println("containsKey="+map.containsKey("001"));
System.out.println("containsValue="+map.containsValue("ooo"));
// 向Map集合添加元素时,若键存在,则返回之前与键对应的值
String put=map.put("000", "aaa");
System.out.println("put="+put);
//替换功能,将旧值替换成新值,并返回旧值(若有的话)
String replace=map.replace("003", "666");
System.out.println("replace="+replace);
System.out.println(map);
// 只有当键key存在,并且oldKey与oldValue相匹配时,旧的值才会被替换成新的值,并且返回true
boolean success=map.replace("004", "sss", "lll");
System.out.println("replace2="+success);
}
}
运行结果:
HashMap的例子(失败的例子)
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
//import javax.sound.sampled.DataLine.Info;
class Info{
public Info(int i,String s) {
Map<Integer,String > info=new HashMap<Integer,String>();
info.put(i, s);
}
}
public class HashMapReview {
public static void main(String[] args) {
test1();
test2();
}
private static void test2() {
HashMap<Info,String> map=new HashMap<Info,String>();
map.put(new Info(0,"aaa"), "0000");
map.put(new Info(1,"bbb"), "1111");
map.put(new Info(3,"ddd"), "3333");
map.put(new Info(0,"aaa"), "4444");
map.put(new Info(2,"ccc"), "2222");
printMap(map);
}
private static void test1() {
HashMap<String,String> map=new HashMap<String,String>();
map.put("aaa", "123");
map.put("bbb", "789");
map.put("aaa", "456");
map.put("ccc", "321");
System.out.println(map);
}
private static void printMap(Map<Info,String> map) {
Set<Map.Entry<Info,String>> entrySet=map.entrySet();
for(Map.Entry<Info,String> entry:entrySet) {
System.out.println("key="+entry.getKey()+" value="+entry.getValue());
}
}
}
运行结果:
{aaa=456, ccc=321, bbb=789}
key=Info@7852e922 value=0000
key=Info@5c647e05 value=4444
key=Info@33909752 value=2222
key=Info@70dea4e value=3333
key=Info@4e25154f value=1111