Map接口及其常用方法
写在开头
我是一名java小白,目前在B站学习java,学习的视频是尚学堂高琪老师的java300集课程,笔记大部分参考老师的随堂笔记,我仅以博客的方式记录下我的笔记代码和一些个人见解,对一些问题的考虑可能不周全,代码也不够好看,希望大家多多包涵,有意见的也可以在下面评论,我会好好总结错误,慢慢进步的。
Map接口
Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键对象”不能重复。
Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。
常用方法
【示例1】Map接口中(HashMap)的常用方法
public class TestMap {
public static void main(String[] args) {
Map<Integer, String> m1 = new HashMap<Integer, String>();
Map<Integer, String> m2 = new HashMap<Integer, String>();
m1.put(1, "one");
m1.put(2, "two");
m1.put(3, "three");
m2.put(1, "一");
m2.put(2, "二");
System.out.println(m1.size());
System.out.println(m1.containsKey(1));
System.out.println(m2.containsValue("two"));
m1.put(3, "third"); //键重复了,则会替换旧的键值对
Map<Integer, String> m3 = new HashMap<Integer, String>();
m3.putAll(m1);
m3.putAll(m2);
System.out.println("m1:" + m1);
System.out.println("m2:" + m2);
System.out.println("m3:" + m3);
}
}
执行结果如图:
HashMap与HashTable的区别
HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。
- HashMap: 线程不安全,效率高。允许key或value为null。
- HashTable: 线程安全,效率低。不允许key或value为null。
Map接口中(TreeMap)的常用方法
TreeMap 类不仅实现了 Map 接口,还实现了 Map 接口的子接口 java.util.SortedMap。
TreeMap 类中不允许键对象为 null 或是 基本数据类型,这是因为 TreeMap 中的对象必须是可排序的(即对象需要实现 java.lang.Comparable 接口)
【示例2】TreeMap常用方法
import java.util.TreeMap;
public class TestTreeMap {
public static void main(String[] args) {
TreeMap< Integer,String> map2 = new TreeMap<>();
map2.put(10, "bbbb");
map2.put(5, "aaaa");
map2.put(20, "ddd");
map2.put(15, "ccc");
map2.put(25, "eee");
System.out.println(map2);
System.out.println(map2.subMap(6, 15));//获取一个子集。其所有对象的 key 的值小于 toKey ,大于等于 fromKey
System.out.println(map2.subMap(6,true ,15,true));
System.out.println(map2.tailMap(15));//获取一个子集。其所有对象的 key 的值大于等于 fromKey
System.out.println(map2.headMap(20));//获取一个子集。其所有对象的 key 的值小于 toKey
System.out.println(map2.firstKey());//获取第一个(排在最低的)对象的 Key
System.out.println(map2.lastKey());//获取最后个(排在最高的)对象的 Key
}
}
结果:
HashMap与TreeMap区别
如果不需要一个有序的集合,则建议使用HashMap类;如果需要进行有序的遍历输出,则建议使用TreeMap类。 在这种情况下,可以先使用 HashMap。在需要排序时,利用现有的 HashMap,创建一个 TreeMap 类型的实例(例如下面的例子)
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class TestCollection {
public static void main(String[] args) {
System.out.println("开始:");
Person person1 = new Person("马先生", 220181);
Person person2 = new Person("李先生", 220193);
Person person3 = new Person("王小姐", 220186);
Map<Number, Person> map = new HashMap<Number, Person>();
map.put(person1.getId_card(), person1);
map.put(person2.getId_card(), person2);
map.put(person3.getId_card(), person3);
// HashMap
System.out.println("HashMap,无序:");
for (Iterator<Number> it = map.keySet().iterator(); it.hasNext();) {
Person person = map.get(it.next());
System.out.println(person.getId_card() + " " + person.getName());
}
// TreeMap
System.out.println("TreeMap,升序:");
TreeMap<Number, Person> treeMap = new TreeMap<Number, Person>();
treeMap.putAll(map);
for (Iterator<Number> it = treeMap.keySet().iterator(); it.hasNext();) {
Person person = treeMap.get(it.next());
System.out.println(person.getId_card() + " " + person.getName());
}
System.out.println("TreeMap,降序:");
TreeMap<Number, Person> treeMap2 =
new TreeMap<Number, Person>(Collections.reverseOrder());
treeMap2.putAll(map);
for (Iterator it = treeMap2.keySet().iterator(); it.hasNext();) {
Person person = (Person) treeMap2.get(it.next());
System.out.println(person.getId_card() + " " + person.getName());
}
System.out.println("结束!");
}
}