【java】【Map】HashMap、Hashtable、Collections
一、基本概述
键值对:一个映射不能包含重复的键,每个键最多只能映射到一个值
Map接口和Collection接口的不同
- Map是双列的,Collection是单列的
- Map的键唯一,Collection的子体系Set是唯一的
- Map集合的数据结构值针对键有效,跟值无关。Collection集合的数据结构是针对元素有效。
二、Map集合的功能
1、添加功能
- V put(Kkey,V value):添加元素。
* 如果键是第一次存储,就直接存储元素,返回null
* 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
2、删除功能
* void clear():移除所有的键值对元素
* V remove(Object key):根据键删除键值对元素,并把值返回
3、判断功能
* boolean containsKey(Object key):判断集合是否包含指定的键
* boolean containsValue(Object value):判断集合是否包含指定的值
* boolean isEmpty():判断集合是否为空
4、获取功能
*Set<Map.Entry<K,V>> entrySet():
说明:Map.Entry表示Entry是Map的内部接口,将键和值封装成了Entry对象,并存储在Set集合中
* V get(Object key):根据键获取值
*Set<K> keySet():获取集合中所有键的集合
*Collection<V> values():获取集合中所有值的集合
5、长度功能
* intsize():返回集合中的键值对的个数
三、Map集合的遍历
1、键找值 思路:
* 获取所有键的集合
* 遍历键的集合,获取到每一个键
* 根据键找值
HashMap<String, Integer> hm = new HashMap<>();
hm.put("张三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("赵六", 26);
Set<String> keySet = hm.keySet(); //获取集合中所有的键
Iterator<String> it = keySet.iterator(); //获取迭代器
while(it.hasNext()) { //判断单列集合中是否有元素
String key = it.next(); //获取集合中的每一个元素,其实就是双列集合中的键
Integer value = hm.get(key); //根据键获取值
System.out.println(key + "=" + value); //打印键值对
}
for(String key : hm.keySet()) { //增强for循环迭代双列集合第一种方式
System.out.println(key + "=" + hm.get(key));
}
2、键值对对象找键和值 思路
* 获取所有键值对对象的集合
* 遍历键值对对象的集合,获取到每一个键值对对象
* 根据键值对对象找键和值
HashMap<String, Integer> hm = new HashMap<>();
hm.put("张三", 23);
hm.put("李四", 24);
hm.put("王五", 25);
hm.put("赵六", 26);
/*Set<Map.Entry<String, Integer>> entrySet = hm.entrySet(); //获取所有的键值对象的集合
Iterator<Entry<String, Integer>> it = entrySet.iterator(); //获取迭代器
while(it.hasNext()) {
Entry<String, Integer> en = it.next(); //获取键值对对象
String key = en.getKey(); //根据键值对对象获取键
Integer value = en.getValue(); //根据键值对对象获取值
System.out.println(key + "=" + value);
}*/
for(Entry<String,Integer> en : hm.entrySet()) {
System.out.println(en.getKey() + "=" + en.getValue());
}
四、LinkedHashMap,TreeMap
LinkedHashMap:底层是链表实现的可以保证怎么存就怎么取
TreeMap:底层是二叉树,会对键值对进行排序五、案例:统计字符串中每个字符出现的次数
分析:
1、定义一个需要被统计字符的字符串
2、将字符串转换为字符数组
3、定义双列集合,存储字符串中字符以及字符出现的次数
4、遍历字符数组获取每一个字符,并将字符存储在双列集合中
5、存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
6、打印双列集合获取字符出现的次数
import java.util.HashMap;
public class Test1 {
public static void main(String[] args) {
//1,定义一个需要被统计字符的字符串
String s = "aaaabbbbbccccccccccccc";
//2,将字符串转换为字符数组
char[] arr = s.toCharArray();
//3,定义双列集合,存储字符串中字符以及字符出现的次数
HashMap<Character, Integer> hm = new HashMap<>();
//4,遍历字符数组获取每一个字符,并将字符存储在双列集合中
for(char c: arr) {
//5,存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
/*if(!hm.containsKey(c)) { //如果不包含这个键
hm.put(c, 1);
}else {
hm.put(c, hm.get(c) + 1);
}*/
hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
}
//6,打印双列集合获取字符出现的次数
for (Character key : hm.keySet()) { //hm.keySet()代表所有键的集合
System.out.println(key + "=" + hm.get(key));//hm.get(key)根据键获取值
}
}
}
六、HashMap和Hashtable的区别
- Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
- Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
七、Collections
针对集合操作 的工具类
public static <T> void sort(List<T> list)
-
publicstatic <T> int binarySearch(List<?> list,T key):二分查找法
publicstatic <T> T max(Collection<?> coll):获取最大值
publicstatic void shuffle(List<?> list):随机置换,可以用来洗牌
publicstatic void reverse(List<?> list):反转
推荐阅读
-
Java中HashMap和Hashtable及HashSet的区别
-
浅析Java中Map与HashMap,Hashtable,HashSet的区别
-
浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别
-
Java中HashMap和Hashtable及HashSet的区别
-
浅析Java中Map与HashMap,Hashtable,HashSet的区别
-
浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别
-
java中Hashtable和HashMap的区别分析
-
java语法ArrayList、LinkedList、HashSet、HashMap、HashTable、Collection、Collections详解
-
java中集合(LinkedList、HashSet、HashMap、HashTable、Collection、Collections)
-
java中Hashtable和HashMap的区别分析