一.Map集合特点: 二.HashMa与 LinkedHashMap 四.HashMap存储自定义类型 五.Hashtable
集合的遍历 1.使用KeySet方法取出所有key 放入set 2.使用entrySet(); 方法将多个Entry对象放入set集合
一.Map集合特点:
1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
3.Map集合中的元素,key是不允许重复的,value是可以重复的
4.Map集合中的元素,key和value是一一对应,与python字典类似
Interface Map<K,V>接口 已知实现类 : HashMap , Hashtable , 而 LinkedHashMap 是HashMap 的子类
二.HashMa与 LinkedHashMap
1.HashMap集合的特点:
1.HashMap集合底层是哈希表:查询的速度特别的快
1. JDK1.8之前:数组+单向链表 2. JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
2.LinkedHashMap的特点:
1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
3.定义Map集合 都可以添加null数据
Map<Integer, String> map = new HashMap<>(); map.put(1,"wyc"); map.put(2,"wyc1"); map.put(3,"wyc2");
public V put(K key, V value): 添加一对键值对 key不重复, 返回值 是null
key重复,会使用新的value替换map中重复的value, 返回被替换的value值
一. 对键的操作
1.boolean containsKey(Object key) 判断集合中是否包含指定的键。 包含返回true,不包含返回false
2.public V get(Object key) 获取键对应值。 存在返回 value 不存在返回null
3.public V remove(Object key): 删除键对应的值,返回被删除元素的值 不存在返回null
4. Map<String,Integer> map = new HashMap<>();
Set<String> set = map.keySet(); keySet(),把Map集合所有的key取出来,存储到一个Set集合中 [1, 2,3]
二.对键值对的操作
1. Set< Map.Entry<String, Integer> > set = map.entrySet(); 返回map的 多个Entry对象 [1=wyc, 2=wyc1]
2.Map.Entry<String, Integer> 这是一个Entry 类型,是一个引用型数据类型
三.集合的遍历
1.使用KeySet方法取出所有key 放入set,
1.使用 set集合的iterator()方法生成迭代器 再遍历迭代器 使用get方法获取值
Map<Integer, String> map = new HashMap<>();
map.put(1, "wyc");
map.put(2, "wyc1");
map.put(3, "wyc2");
Set<Integer> set = map.keySet();
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
Integer key = iterator.next();
String s = map.get(key); key 和 value 可以分离
System.out.println(key+s);
}
2.使用增强for循环 不需要生成迭代器,底层完成
Map<Integer, String> map = new HashMap<>();
map.put(1, "wyc");
map.put(2, "wyc1");
map.put(3, "wyc2");
Set<Integer> set = map.keySet();
for (Integer key : set) { 可以省略为 for (Integer key : map.keySet())
System.out.println(key+map.get(key));
}
2.使用entrySet(); 方法将多个Entry对象放入set集合
1.使用迭代器
Map<Integer, String> map = new HashMap<>();
map.put(1, "wyc");
map.put(2, "wyc1");
map.put(3, "wyc2");
Set<Map.Entry<Integer, String>> entries = map.entrySet();
Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();
while (iterator.hasNext()){
Map.Entry<Integer, String> next = iterator.next();
System.out.println(next);
2.使用增强for循环
Map<Integer, String> map = new HashMap<>();
map.put(1, "wyc");
map.put(2, "wyc1");
map.put(3, "wyc2");
Set<Map.Entry<Integer, String>> entries = map.entrySet();
for (Map.Entry<Integer, String> entry : entries) { 可简写为for (Map.Entry<Integer, String> entry : map.entrySet())
System.out.println(entry);}
四.HashMap存储自定义类型
1. 键值 key:Person类型 Person类就必须重写hashCode方法和equals方法,以保证key唯一 2.value可以重复
HashMap<String,Person> map = new HashMap<>(); key是String类型,已经重写hashCode方法和equals方法
map.put("北京",new Person("张三",18));
HashMap<Person,String> map = new HashMap<>(); key是自定义类型,所以在Person类中手动重写hashCode方法和equals方法
map.put(new Person("秦始皇",18),"秦国");
五.Hashtable
1.java.util.Hashtable<K,V>集合 implements Map<K,V>接口 也实现了Map接口,但是是 HashMap的子类
2.Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
3.Hashtable的子类 Properties集合是一个唯一和IO流相结合的集合
4.与HashMap的区别是,key value都不能存储null 数据