Day18-1
1 Map集合实现类
- 概述:Map集合为双列集合的顶层接口,底层根据不同的实现方式,有不同的实现类
- 实现类:
TreeMap和HashMap
2 TreeMap集合
- 概述:是一个双列集合,是Map集合的实现类
- 特点:
(1)集合中的key值是唯一的,元素是无序的
key值唯一的原理和TreeSet原理相同
元素排序的方式,是根据key来实现排序,排序的方式和TreeSet方式一样
(2)TreeSet集合和TreeMap集合的关系:
TreeSet集合底层是由TreeMap实现的
3 HashMap集合
- 概述:是一个双列集合,属于map集合的实现类。
- 特点:
(1)集合中的key值不可以重复,元素是无序的
key值去重和无序的原理,跟昨天讲的HashSet一样
通过key的哈希值来实现存储和取出
(2)HashSet集合和HashMap集合的关系:
HashSet集合底层是由HashMap集合实现的
4 LinkedHashMap集合
- 概述:是一个双列集合,是HashMap集合的子类
- 特点:
(1)本类没有特殊的方法,只能使用父类中继承的
(2)集合中元素有序(存入和取出)
可以跟根据key值保证元素的有序,可以记录下一个key的地址
(3)集合中的key值唯一
5 练习
键盘录入一个字符串,统计每个字符出现的次数,并按照指定格式进行输出(按照元素录入字符的顺序输出)
例如,录入数据为:aaaabbccddd!@#@#KaTeX parse error: Expected 'EOF', got '#' at position 2: @#̲%cc66ff
打印出来:a有4个,b有2个,c有4个,d有3个,!有1个,@有3个,$有2个,% 有1个,6有2个,f有2个
代码
package demos2_map;
import java.util.LinkedHashMap;
import java.util.Map;
public class Test02 {
public static void main(String[] args) {
//统计一个字符串中 字符---个数
//1、每一个字符和对应的个数都是一一对应的映射关系:想到使用,map
//2、获取字符串中的每一个字符:
// 判断该字符和次数 在map集合中有没有存储过
// 如果有存储过,表示需要将之前该字符对应个数取出+1,再存入
// 如果没有存储过,表示需要将该字符当做key,将1当做value存储到集合
LinkedHashMap<Character,Integer> lin = new LinkedHashMap<>();
String str = "aaaabbccddd!@#@#$@#$%cc66ff";
for(char c:str.toCharArray()){
if(lin.containsKey(c)){
lin.put(c,lin.get(c)+1);
}else{
lin.put(c,1);
}
}
//遍历存储过的字符和个数关系
StringBuilder sb = new StringBuilder();
for(Map.Entry<Character,Integer> en:lin.entrySet()){
Character key = en.getKey();
Integer value = en.getValue();
sb.append(key).append("有").append(value).append("个,");
}
System.out.println(sb.substring(0,sb.length()-1));
}
}
6 HashMap和Hashtable集合的区别【面试题】
- 相同点:
(1)HashMap和Hashtable都是Java用于存储映射关系的集合,都是Map的实现类
(2)底层都采用了哈希表存储数据。
(3)两个类中的方法都相同 - 不同点:
(1)版本不同,Hashtable是jdk1.0版本出现的,HashMap是jdk1.2版本出现的
(2)线程安全性不同,Hashtable是线程安全的,HashMap是线程不安全的
(3)HashMap集合操作元素的效率高,HashTable集合操作元素的效率低
(4)Hashtable不能存储null键null值,如果存储,出现空指针异常
HashMap可以存储null键null值
6.1 线程安全不安全类型小总结
- StringBuiler是线程不安全,使用效率高
StringBuffer是线程安全,使用效率低 - HashMap线程不安全,使用效率高
Hashtable线程安全,使用效率低 - ArrayList 线程不安全,使用效率高
Vector 线程安全 ,使用效率低
7 Collections工具类
- 概述:本类是JDK提供的操作集合的工具类,类中定义了一些操作集合元素的方法
- 常用方法:
项目 | Value |
---|---|
binarySearch(List<? extends Comparable<? super T>> list, T key) | 通过二分查找法查找元素key在集合中的索引 |
frequency(Collection<?> c, Object o) | 获取集合中o元素出现的次数 |
max(Collection c) | 求出集合中的最大值 |
min(Collection c) | 求出集合中的最小值 |
reverse(List<?> list) | 反转集合中的元素顺序 |
shuffle(List<?> list) | 随机排列集合元素的顺序 |
sort(List<T> list) | 将集合中的元素进行升序排列 |
swap(List<?> list, int i, int j) | 交换集合中两个元素的位置 |
synchronizedList(List<T> list) | 将线程不安全的单列集合可以转换为安全的单列集合 |
synchronizedMap(Map<K,V> m) | 将线程不安全的双列集合转为安全的双列集合 |