Map介绍
在之前的学习中,我们学习了集合框架的Set和List,今天主要想讲一讲Map的一些知识点。而我本人也是第一次学习集合框架。前面我们知道了,Set和List。在Set中,元素有序不可重复;List中,元素有序,可重复。
而在Map当中,由于Map是映射,由键值对(Key-Value)组成的,所以,它的键不可重复,值可重复。
Map特点
位于包:jva.util.Map
特点:
- 1、是一个双列的数据模型
- 2、所存储的对象称为键值对,同一对象中,键唯一,值可重复
- 3、Map底层通过hash表进行数据存储
- JDK1.8之前hash表通过数组+链表的方式实现//提高查询效率之后hash表通过数组+链表+红黑树//链表长度大于八时,由链表转换为红黑树,进一步提升效率
- 4、常用实现类:
- HashMap:存储键值对,无序
- HashTable: 无序,线程安全
----Properties(子类):读取配置文件 - LinkedHashMap:存储键值对,无序
Map接口的实现
1、HashMap介绍
HashMap存放键值对,<Key,Value>其中,键值不可重复,值可重复。
1)构造方法:
HashMap(int initialCapacity)
构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity)
构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity, float loadFactor)
构造一个带指定初始容量和加载因子的空 HashMap。
HashMap(Map<? extends K,? extends V> m)
构造一个映射关系与指定 Map 相同的新 HashMap。
2)常用方法
void clear() 从此映射中移除所有映射关系。
boolean containsKey(Object key)
如果此映射包含对于指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet()
返回此映射所包含的映射关系的 Set 视图。
Set keySet()
返回此映射中所包含的键的 Set 视图。
boolean isEmpty()
如果此映射不包含键-值映射关系,则返回 true。
V put(K key, V value)
在此映射中关联指定值与指定键。(返回值为被替换的Value)
代码(主要是entrySet和KeySetd的使用):
//指定泛型时需要同时指定Key、Value的类型
Map<Integer,String> map=new HashMap<Integer,String>();
map.put(011, "小明");
map.put(102, "王二");
map.put(013, "张山");
map.put(014, "李四");
System.out.println(map.containsKey(014));//找键值为015的是否存在
System.out.println(map.containsValue("小明"));//找值为小明的是否存在
//set KeySet的应用,遍历
Set<Integer> se=map.keySet();//将Map的键取出来放于,Set集合中,用于遍历
//Map本身没有迭代器,不能遍历输出。
Iterator it=se.iterator();//Set执行遍历操作
while(it.hasNext()) {
Integer a=(Integer) it.next();
System.out.println("键值为:"+a+" "+"值为:"+map.get(a));
}
System.out.println("--------------------");
//EntrySet的应用
//public Set<Map.Entry<K,V>> entrySet()
Set<Entry<Integer,String>>sr=map.entrySet();//得到Entry集合。下面对其使用迭代器
Iterator ip=sr.iterator();
while(ip.hasNext()) {
Entry<Integer,String> sw=(Entry<Integer, String>) ip.next();
//Entry的sw对象可以分别取Key和Value
System.out.println("键为:"+sw.getKey()+" "+"值为:"+sw.getValue());
}
//增强for循环
System.out.println("-------==================------------");
for(Entry<Integer,String> c:sr) {
System.out.println(c.getKey()+" "+c.getValue());
}
2、HashTable和TreeMap
此处略略略。
值得一提的是HashTable是线程安全的。不过一般不太用它了。
但是它的一个子类在经常被使用:
----Properties(子类):读取配置文件。
感兴趣的可以自己去查询相关资料。