1、什么是map数据类型?
map是K-V类型的数据,map是一个该种数据类型的顶级接口。
2、map的实现类和组成以及扩充规则
map有多种实现类,其中日常开发中主要使用的有hashmap,linkedhashmap,treemap等。map实际就是是由一个一个entry对象组成,entry对象中包含key、value、next以及hash值。其中key和value就是我们设置的key和value,next是指向下一个entry对象,hash值是根据key的值经过一系列计算而得到的hash值。map中数据占位超过长度*负载因子后,将发生扩容。所以创建map时要大概预估要存放多少数据,从而设置合适的长度,避免频繁扩容从而影响效率。
3、map的主要方法
map包含多种操作方法,其中有:put(往map中添加数据)、get(根据key获取value值)、size(map长度)、remove(清除一个k-v)、clear(清空map)、isEmpty( 判断是否为空),putifabsent(添加一个k-v,已经存在则不添加)等等
4、map的遍历方法
1、keySet()方法
for(String key:map.keySet()){
system.out.println(key+":"+map.get(key))
}
2、values()方法
for(String vaule:map.values()){
system.out.println("vaule:"+value)
}
3、entrySet()方法
for(Entry en:map.entrySet()){
system.out.println(en.getKey()+":"+en.getValue())
}
4、Iterator()方法
Iterator<Entry<String, Object>> it = map.entrySet().iterator();
while(it.hasNext()){
Entry<String, Object> entry = it.next();
System.out.println("key:"+entry.getKey()+" key:"+entry.getValue());
}
5、hashmap
hashmap的底层是由数组和链表实现,存放数据时,通过key值经过一系列运算得到hash值,然后根据hash值在数组中找到对应的位置,如果对应的位置已经存在相关entry对象,则以链表形式存放在该对象后面。链表长度大于8并且hashmap长度大于64则会将链表转换为红黑树,以提高效率。
hashmap构建方法:
1、无参数构造方法:hashmap()
这种构造方法默认map长度为16,负载因子为0.75
2、一个参数构造方法:hashmap(int initialCapacity)
这种构造方法默认负载因子为0.75,map长度为指定
3、两个参数构造方法:hashmap(int initialCapacity, float loadFactor)
这种构造方法默认map长度和负载因子都为指定
6、linkedhashmap
linkedhashmap底层是由双向链表实现,它继承自hashmap,它与hashmap不同的是,它默认的取出数据顺序是存入顺序,而hashmap默认的取出顺序为hash值计算的顺序,而且它不仅支持存入数据,还支持通过使用频率来取数据 ,使用这个特性,可以用linkedhashmap来实现LRU缓存。
linkedhashmap构建方法:
1、无参数构造方法:linkedhashmap()
这种构造方法默认map长度为16,负载因子为0.75,此种输出顺序为存入顺序
2、一个参数构造方法:linkedhashmap(int initialCapacity)
这种构造方法默认负载因子为0.75,map长度为指定,此种输出顺序为存入顺序
3、两个参数构造方法:linkedhashmap(int initialCapacity, float loadFactor)
这种构造方法默认map长度和负载因子都为指定,此种输出顺序为存入顺序
4、两个参数构造方法:linkedhashmap(int initialCapacity, float loadFactor,true)
这种构造方法默认map长度和负载因子都为指定,此种输出顺序为使用频率,频率高的放后面
linkedhashmap实现LRU缓存:
要实现LRU缓存,需自己定义liankedhashmap子类:
定义自定义缓存map
public class LRUMap<K,V> extends LinkedHashMap<K,V>{
//缓存里面保存几条数据
private int maxSize;
public LRUMap(int maxSize){
super(16,0.75f,true);
this.maxSize=maxSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
return size()>this.maxSize;
}
}
使用:
Map LRU = new LRUMap(3);
LRU.put("x1",1);
LRU.put("x2",2);
LRU.put("x3",3);
LRU.put("x4",4);
LRU.put("x5",5);
System.out.println(LRU);
//输出为{x3=3,x4=4,x5=5}
LRU.get("x1");
System.out.println(LRU);
//输出为{x4=4,x5=5,x1=1}
7、treemap
TreeMap的实现是红黑树算法的实现。其输出数据默认为升序输出,当然也支持降序输出和自定义输出,降序和自定义输出需要自定义Comparator比较器
treemap构建方法:
1、无参数构造方法:treemap()
这种构造方法默认map长度为16,负载因子为0.75,此种输出顺序为正序顺序
2、一个参数构造方法:treemap(int initialCapacity)
这种构造方法默认负载因子为0.75,map长度为指定,此种输出顺序为正序顺序
3、两个参数构造方法:treemap(int initialCapacity, float loadFactor)
这种构造方法默认map长度和负载因子都为指定,此种输出顺序为正序顺序
4、两个参数构造方法:treemap(new Comparator<String>(){
public int compara(String a,String b){
//return a.comparaTo(b); 正序
return b.comparaTo(a); 倒序
}
})
这种构造方法默认map长度为16,负载因子为0.75,此种输出顺序为倒序顺序