Map
(1)java.util.Map接口
- 它是一个接口,不能实例化。
- Map集合的每个元素是一个键值对。
- 所有元素的键是唯一的,不能重复;所有元素的值可以重复。
(2)抽象方法
int size()
返回此地图中键值映射的数量。
void clear()
从该地图中删除所有的映射(可选操作)。
V put(K key, V value)
将指定的值与该映射中的指定键相关联(可选操作)。
V remove(Object key)
如果存在(从可选的操作),从该地图中删除一个键的映射。
V get(Object key)
返回到指定键所映射的值,或 null如果此映射包含该键的映射。
boolean containsKey(Object key)
如果此映射包含指定键的映射,则返回 true 。
boolean containsValue(Object value)
如果此地图将一个或多个键映射到指定的值,则返回 true 。
Set<K> keySet()
返回此地图中包含的键的Set视图。
Collection<V> values()
返回此地图中包含的值的Collection视图。
boolean isEmpty()
如果此地图不包含键值映射,则返回 true 。
Set<Map.Entry<K,V>> entrySet()
返回此地图中包含的映射的Set视图。
(3)实现类HashMap
构造器:
HashMap()
构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。
集合元素的遍历:
第一种方法
Set kvs=m.entrySet();
for(Object okv : kvs) {
Map.Entry kv=(Map.Entry)okv;
System.out.println(kv.getKey()+"="+kv.getValue());
}
第二种方法
Set keys=m.keySet();
for(Object key:keys) {
//System.out.println(key);
Object value=m.get(key);
System.out.println(key+"="+value);
}
第三种方法
m.forEach((k,v)->{
System.out.println(k+"="+v);
});
(4)常见的实现类区别
HashMap,Hashtable,TreeMap
- Hashtable、HashMap、TreeMap都实现了Map接口,使用键值对的形式存储数据和操作数据。
- Hashtable是java早期提供的,方法是同步的(加了synchronized)。key和value都不能是null值。
- HashMap的方法不是同步的,支持key和value为null的情况。行为上基本和Hashtable一致。由于Hashtable是同步的,性能开销比较大,一般不推荐使用Hashtable。通常会选择使用HashMap。
- HashMap进行put和get操作,基本上可以达到常数时间的性能
- TreeMap是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get或put操作的时间复杂度是O(log(n))。具体的顺序由指定的Comparator来决定,或者根据键key的具体顺序来决定。
泛型
(1)泛型的含义
广泛的数据类型,用来表示一种动态的数据类型(只能表示引用数据类型)。
(2)泛型的表示
如同我们数学的未知数,可以是用x代表一个数字。 在java中,我们可以使用大写英文字母表示泛型数据类型。
(3)泛型的使用
定义带有泛型的类或接口:
class<A,B> Test{
A one;
B two;
public A getOne(){
return one;
}
public B getTwo(){
return tow;
}
public void setOne(A one){
this.one=one;
}
public void setTwo(B two){
this.two=two;
}
}
使用带有泛型的类或接口:
//默认A=Object,B=Object
Test t=new Test();
//指定A=String,B=String
Test<String,String> t2=new Test<String,String>();
//指定A=Integer,B=String
Test<Integer,String> t2=new Test<Integer,String>();
(4)集合中泛型的使用
Collection<E>
List<E>
Set<E>
Map<K,V>