桃李春风一杯酒,江湖夜雨十年灯
——寄黄几复
之前图上写错了,是Hashtable类。t是小写的,它是个很古老的类,以至于命名都没有那么规范..
HashMap
HashMap就是存储key-value键值对的集合,是一种映射关系。key中的元素组成了一个Set集合(key无序,不允许重复,可以是null),且任意key中的元素有且只有一个value值与其对应(value值可以是null)
上代码:
1 public class MapTest { 2 3 public static void main(String[] args) { 4 Map<String, Integer> map = new HashMap<>(); 5 //成对放入 6 map.put("疯狂Java讲义", 109); 7 map.put("疯狂iOS讲义", 10); 8 map.put("疯狂Ajax讲义", 79); 9 //value可以重复 10 map.put("轻量级Java EE企业应用实战", 79); 11 //key重复时,新的value会覆盖原有的value,并返回被覆盖的value值,输出:10,不重复返回null 12 System.out.println(map.put("疯狂iOS讲义", 108)); 13 //无序的,形式{key =value,key=value,...} 14 System.out.println(map); 15 //是否包含指定key,输出:true 16 System.out.println(map.containsKey("疯狂Java讲义")); 17 //是否包含指定value,输出:true 18 System.out.println(map.containsValue(79)); 19 //获取所有key集合,通过key,value遍历所有 20 for (String item : map.keySet()) { 21 System.out.println(item+"--"+map.get(item)); 22 } 23 //entry遍历 24 for (Entry<String, Integer> item : map.entrySet()) { 25 System.out.println(item.getKey()+"--"+item.getValue()); 26 } 27 map.remove("疯狂Java讲义"); 28 System.out.println(map); 29 } 30 }
Java8新增方法:
1 public class MapTest02 { 2 3 public static void main(String[] args) { 4 Map<String, Integer> map = new HashMap<>(); 5 //成对放入 6 map.put("疯狂Java讲义", 109); 7 map.put("疯狂iOS讲义", 10); 8 map.put("疯狂Ajax讲义", 79); 9 //尝试替换value值 10 map.replace("疯狂Java讲义", 56); 11 System.out.println(map); 12 //没有找到key,所以不会替换 13 map.replace("疯狂Jav讲", 12); 14 System.out.println(map); 15 //使用原value与传入参数计算出来的结果覆盖原value 16 //该方法调用BiFunction<T, U, R>接口的apply(oldValue, value)方法,该接口为函数式接口(只含有一个抽象方法的接口),可使用lambda表达式 17 map.merge("疯狂Java讲义", 23, (oldVal,newVal) -> oldVal/newVal);//Value值为56/23 18 //key为Java对应的value为null或者key本身为null时使用计算结果作为新value 19 map.computeIfAbsent("Java", (key) -> ((String)key).length()); 20 //key为Java对应的value为存在时使用计算结果作为新value 21 map.computeIfPresent("Java",(key,value) -> value*value );//感觉这个lambda表达式没什么用 22 System.out.println(map); 23 } 24 }
Hashtable
Hashtable是一个线程安全的实现,HashMap是线程不安全的。所有HashMap性能比HashTable高一些。但如果多个线程访问同一个Map对象也可以使用Hashtable。
Hashtable不允许使用null作为key值和value值,如果使用,将会引发NullPointerException
判断HashMap和HashTable中key值是否重复的方法和判断HashSet中元素是否重复是一样的:
1、两个key对象equals
2、连个key对象的hashCode相等
判断HashMap和HashTable都有containsValue()方法,判断连个value相等的标准是:
两个对象通过equals方法比较返回true即可
TreeMap
类似TreeSet,TreeMap的key值自然排序