Map集合
1.Map接口实现类的特点
注意:这里讲的是JDK8的Map接口特点
- Map与Collection并列存在,用于保存具有映射关系的数据key-value;
- Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node对象中;
- Map中的key不允许重复;
- Map中的value可以重复;
- Map的key可以为null,value也可以为null,注意key为null只能有一个,value为null,可以多个;
- 常用String类作为Map的key;
- key和value之间存在单向一对一关系,即通过指定的key总能找到对应的value;
- Map存放数据的key-value,一对k-v是放在一个Node中的,又因为Node实现了Enty接口,有些书上也说,一对k-v就是一个Entry。
1.EntrySet介绍
- k-v 最后是 HashMap$Node node = new Node(hash,key,value,null);
- k-v为了方便程序员遍历,还会创建EntrySet集合,该集合存放的元素类型是Entry,而Entry对象就有k-v【EntrySet<Entry<K,V>>】。
- entry中,定义的类型是Map.Entry ,但是实际上存放的还是HashMap N o d e , 这 是 因 为 H a s h M a p Node,这是因为HashMap Node,这是因为HashMapNode implments Map.Entry。
- 当把HashMap$Node对象存放到EntrySet就方便我们遍历了,因为Map.Entry提供了重要的方法getKey()和getValue()。
2.Map接口常用方法
- put 添加
- remove 根据键删除映射关系
- get 根据键获取值
- size 获取元素个数
- isEmpty 判断个数是否为0
- containsKey 查找键是否存在
3.Map接口遍历方法
- containsKey 查找键是否存在
- keySet 获取所有的键
- entrySet 获取所有关系
- values 获取所有的值
1.keySet遍历
Map map = new HashMap();
map.put("A","1");
map.put("B","2");
map.put("C","3");
map.put("D","4");
//第一组:先取出所有的key,通过key取出对应的value
Set keyset = map.keySet();
//1.增强for
for(Object key:keyset){
System.out.println(key + "-" + map.get(key));
}
//2.迭代器
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}
2.values遍历
Map map = new HashMap();
map.put("A","1");
map.put("B","2");
map.put("C","3");
map.put("D","4");
//第二组,把所有的values取出来
Collection values = map.values();
//这里可以使用所有的Collections使用的遍历方法
//1.增强for
//取出所有的值
for(Object value:values){
System.out.println(value);
}
//2.迭代器
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()){
Object value = iterator1.next();
System.out.println(value);
}
3.EntrySet遍历
Map map = new HashMap();
map.put("A","1");
map.put("B","2");
map.put("C","3");
map.put("D","4");
//第三组,通过EntrySet 来获取k-v
Set entrySet = map.entrySet();
//1.增强for
for (Object entry : entrySet){
//将entry转成Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//2.迭代器
Iterator iterator2 = entrySet.iterator();
while (iterator2.hasNext()){
Map.Entry m = (Map.Entry) iterator2.next();
System.out.println(m.getKey() + "-" + m.getValue());
}
4.HashMap小结
- Map接口的常用实现类:HashMap、hashtable、properties;
- HashMap是Map接口使用频率最高的实现类;
- HashMap是以key-value对的方式存储数据;
- key不能重复,但是值矿业重复,允许使用null键和null值;
- 如果添加相同的key,则会覆盖原来的值;
- 与hashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的;
- HashMap没有实现同步,因此是线程不安全的。
5.HashTable的基本介绍
- 存放的元素时键值对:即K-V;
- hashtable的键和值都不能为null;
- hashtable使用方法基本上和HashMap一样;
- hashtable是线程安全,HashMap是线程不安全;
1.HashTable底层简单说明
- 底层有数组Hashtable$Entry[] 初始化大小为11;
- threshold 8 = 11 * 0.75;临界值
- 扩容:(前容量*2)+1 ;
6.Hashtable和HashMap对比
版本 | 线程安全(同步) | 效率 | 允许null键null值 | |
---|---|---|---|---|
HashMap | 1.2 | 不安全 | 高 | 可以 |
Hashtable | 1.0 | 安全 | 较低 | 不可以 |
7.Properties
- Properties类继承自Hashtable 类并且实现了Map接口,也是使用一种键值对的形式来保存数据;
- 它的使用特点和Hashtable类似;
- Properties还可以用于从xxx.properties文件中,加载数据到Properties类对象,并进行读取和修改;
8.开发中如何选择集合实现类
-
先判断存储的类型(一组对象或一组键值对);
-
一组对象:Collection接口
允许重复:List
增删多:LinkedList【底层维护了一个双向链表】
改查多:ArrayList 【底层维护了Object类型的可变数组】
不允许重复:Set
无排序:HashSet 【底层是HashMap ,维护了一个哈希表,即数组+链表+红黑树】
排序: TreeSet
插入和取出顺序一致:LinkedHashSet (底层是LinkHashMap(底层是HashMap))【维护数组+双向链表】 -
一组键值对:Map
键无序: HashMap 【底层是:哈希表;jdk7:数组+链表;jdk8:数组+链表+红黑树】
键排序:TreeMap
键插入和取出顺序一致:LinkedHashMap
读取文件:Properties
9.TreeSet和TreeMap排序
1.TreeSet
//排序
TreeSet treeSet = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//调用Sting的compareTo方法比较大小
return ((String)o2).compareTo((String)o1);
}
});
treeSet.add("a");
treeSet.add("b");
treeSet.add("c");
treeSet.add("d");
System.out.println(treeSet);
2.TreeMap
//[排序
TreeMap treeMap = new TreeMap(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
//调用Sting的compareTo方法比较大小
return ((String)o1).compareTo((String)o2);
}
});
treeMap.put("a","1");
treeMap.put("b","2");
treeMap.put("c","3");
treeMap.put("d","4");
10.Collections工具类
1.Collections工具类介绍
- Collections是一个操作Set、List和Map等集合的工具类;
- Collections中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作。
2.排序操作
- reverse(List):反转List中元素的排序;
- shuffle(List):对List集合元素进行随机排序;
- sort(List):根据元素的自然顺序对指定List集合元素按升序排序;
- sort(List、Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序;
- swap(List、int、int):将指定List集合中的i处元素和j处元素进行交换。
3.查找与替换操作
- Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素;
- Object max(Collection , Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素;
- Object min(Collection);
- Object min(Collection , Comparator);
- int frequency(Collection , Object):返回指定集合中指定元素的出现次数;
- void copy(List dest , List src):将src中的内容复制到dest中;
- boolean replaceAll(List list , Object oldVal , Object newVal):使用新值替换List对象的所有旧值。