Map集合
Map集合中会一次性保存俩个对象,且这俩个对象的关系为:key = value结构;即可以通过key找到对应的value内容。
1.Map接口概述
Map接口定义:public interface Map<K,V>
在Map接口中有如下常用方法:
- 向Map中追加数据:
public V put(K key,V value)
- 更具key值取得相应的value:
public V get(Object key)
(如果没有返回null) - 取得所有key信息,key不能重复:
public Set<K> keySet()
- 取得所有value信息,可以重复:
public Collection<V> values()
Map本身是一个接口,要使用Map需要通过子类进行对象实例化。
Map接口的常用子类有:HashMap , HashTable , TreeMap , ConcurrentHashMap。
1.1 HashMap子类
HashMap是使用Map集合中最为常用的子类。
HashMap中允许key和value为null,且key值有且只有一个为null,value可以有任意多个为null
eg:HashMap基本操作:
public class TestDemo {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"Hello");
map.put(1,"Hello");
map.put(2,"Hi");
map.put(3,"Java");
//不会出现重复元素
System.out.println(map);
//根据key值取得value
System.out.println(map.get(2));
//找不到结构返回null
System.out.println(map.get(100));
}
}
eg:取得Map中的所有Key信息:
public class Test {
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<>();
map.put(1,"Hello");
map.put(1,"Hello");
map.put(2,"Hi");
map.put(3,"Java");
Set<Integer> set = map.keySet();
Iterator<Integer> it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
}
1.2 HashTable子类
HashTable中,key与value均不为null
eg:HashTable的基本使用:
public class TestDemo {
public static void main(String[] args) {
Map<Integer,String> map = new Hashtable<>();
map.put(1,"Hello");
map.put(2,"Hi");
map.put(1,"Hello");
map.put(3,"world");
System.out.println(map);
}
}
1.3TreeMap子类
TreeMap是一个可以排序的Map子类,它是按照Key的内容排序的。
eg:TreeMap的基本使用:
public class TestDemo {
public static void main(String[] args) {
Map<Integer,String> map = new TreeMap<>();
map.put(2,"A");
map.put(1,"B");
map.put(3,"C");
System.out.println(map);
}
}
HashMap、TreeMap、Hashtable的关系与区别
- HashMap、TreeMap、Hashtable都是Map的常用子类
- HashMap基于哈希表+红黑树(JDK1.8之后)
- Hashtable基于哈希表
- TreeMap基于红黑树
- HashMap采用懒加载策略,采用异步处理,线程不安全,性能较高
- Hashtable产生对象时初始化内部哈希表(默认大小为16),采用synchronized同步方法,线程安全,性能很低(读读互斥)
- 关于null
- HashMap K与V都允许为null
- TreeMap K不为null,V可以为null
- Hashtable K与V都不允许为null