声明
Map只是一个接口,HashMap,Hashtable,LinkedHashMap,TresMap们都是实现了map接口所以我们创建的时候一般创建他的子实现类,他们四个的方法都是继承自map没有区别,所以下面演示的时候只做一次方法的演示,他们之间的区别分HashMap,Hashtable二者间的区别HashMap,Hashtable二者间的区别。方法演示过后会说明他们的区别
HashMap
第一个我做一下方法的演示(后续三个不在做方法演示),从第二个开始我开始逐一说明他们之间的区别,方法代码如下
public static void main(String[] args) {
Map<Integer,String> map=new HashMap();
// map的插入方法 建议 先规定好map的泛指,如果不规定,里面的键值对是独立存在的
// 就可能造成key 和value的混乱 ,比如我这里如果没有定义泛型 那么我可以这样插入
// map.put("1","一");
// map.put(2,"二");
System.out.println("===================增====================");
// 一个一个增加
map.put(1,"一");
map.put(2,"二");
map.put(3,"三");
// 注意map中的替换 就是依靠添加的覆盖功能来实现
map.put(3,"覆盖掉了本来的三");
System.out.println(map);
Map<Integer,String> map2=new HashMap();
// map的插入方法
map2.put(4,"四");
map2.put(5,"五");
map2.put(6,"六");
System.out.println(map2);
// 按照map增加
map.putAll(map2);
System.out.println("按照集合增加后的结果");
System.out.println(map);
System.out.println("===============删除===================");
// 直接清空
map.clear();
System.out.println("清空后打印结果为map:"+map);
// 一个一个删除 根据key值删除 ,返回值为被删除的value
System.out.println("返回被删除的value:"+ map2.remove(5));
System.out.println("只删除一个的结果为:"+map2);
System.out.println("==================查找=================");
// 以下返回值都是boolean类型
// 根据查询是否存在key值
System.out.println("根据查询是否存在key值");
System.out.println(map2.containsKey(5));
System.out.println(map2.containsKey(6));
// 根据查询是否存在value值
System.out.println(" 根据查询是否存在value值");
System.out.println(map2.containsValue("五"));
System.out.println(map2.containsValue("六"));
// 查询是否为空
System.out.println("查询是否为空");
System.out.println(map.isEmpty());
System.out.println(map2.isEmpty());
System.out.println("============大小==========");
int size=map2.size();
System.out.println(size);
System.out.println("遍历的二种方式");
// keySet()方法用来获取整个map中的 key值的集合
System.out.println("增强for循环遍历,没有索引不能用普通的for");
Set<Integer> keys=map2.keySet();
// 同过遍历得到的key值的集合 来间接遍历来获得整个map
for (Integer num : keys) {
System.out.println(num+":"+map2.get(num));
}
// 迭代器直接遍历value
System.out.println("迭代器遍历value");
Iterator it=map2.values().iterator();
while (it.hasNext()){
String str= (String) it.next();
System.out.println(str);
}
// 迭代器直接遍历key
System.out.println("迭代器遍历key");
Iterator it2=map2.keySet().iterator();
while (it2.hasNext()){
int key= (int) it2.next();
System.out.println(key);
}
}
Hashtable
// Hashtable中方法和Hashmap中的一样
// 但是存在一些注意事项 下面值演示注意事项
Map<Integer,String> map=new Hashtable<>();
// map的插入方法
map.put(1,"一");
map.put(2,"二");
map.put(3,"三");
System.out.println(map);
System.out.println("因为我限制了泛型所以key的不为null就不做演示了,key和value一样可以为字符串空;,但是不可为null");
map.put(1,"");
// try {
// map.put(1,null);
// }catch (Exception e){
// e.printStackTrace();
// }
System.out.println(map);
Map<Integer,String> map2=new HashMap<>();
// map的插入方法
map2.put(1,"一");
map2.put(2,"二");
map2.put(3,"三");
System.out.println(map2);
map2.put(1,"");
map2.put(1,null);
System.out.println(map2);
}
注意:捕获异常部分就能够捕获到错误信息,说明了Hashtable里面的键值对不能为null但是可以为字符串""空
LinkedHashMap,TresMap
public static void main(String[] args) {
Map<Integer,String> map=new LinkedHashMap();
System.out.println("按照插入的顺序插入");
map.put(5,"五");
map.put(8,"八");
map.put(3,"三");
map.put(4,"四");
System.out.println(map);
Map map2=new TreeMap();
System.out.println("按照hashcode值的大小顺序插入");
map2.put(5,"五");
map2.put(8,"八");
map2.put(3,"三");
map2.put(4,"四");
System.out.println(map2);
}