1:Map集合(掌握)
(1)Map集合存储的是键值对元素。键是唯一的,值可以重复。
(2)Map和Collection的区别?
A:Map是双列集合,存储的元素键值对,键唯一,值可以重复。
B:Collection是单列集合,存储的元素是单一的,List集合可以重复,Set集合元素唯一。
(3)Map集合的功能
A:添加功能
V put(K key,V value)
B:删除功能
remove(K key)
C:判断功能
containsKey(K key)
containsValue(V value)
D:获取功能
V get(K key)
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
E:长度功能
int size()
(4)Map集合的数据结构问题:
Map集合的数据结构对键有效,跟值无关。
它的底层数据结构和Set中讲解的一致。
如果是哈希表结构,就需要重写hashCode()和equals()。
如果是二叉树结构,就有两种方式:Comparable,Comparator
(5)Map的遍历方式
假设有一个HashMap集合,存储的键和值都是String类型。名称叫hm。
A:根据键找值(掌握)
a:获取所有键的集合
b:遍历键的集合,获取到每一个键
c:根据键找值
代码体现:
B:根据键值对对象找键和值(理解)
a:获取所有键值对对象的集合
b:遍历键值对对象的集合,获取到每一个键值对对象
c:根据键值对对象获取键和值
代码体现:
(6)案例:
(7)Map集合的体系
Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap
底层数据结构是链表和哈希表,键唯一且有序
2:Collections工具类(理解)
(1)Collections是针对集合操作的工具类。
(2)面试题:
Collection和Collections的区别?
Collection是单列集合的顶层接口。
Collections是操作集合的工具类。
(3)常见功能:
A:排序
sort()
B:二分查找
binarySearch()
C:最大值
max()
D:反转
reverse()
E:随机置换
shuffle()
(4)如何造一个线程安全的集合:
//如果是造了一个线程安全的ArrayList集合。其他的方式类似,查看API即可
List<String> list = synchronizedList(new ArrayList<String>());
(1)Map集合存储的是键值对元素。键是唯一的,值可以重复。
(2)Map和Collection的区别?
A:Map是双列集合,存储的元素键值对,键唯一,值可以重复。
B:Collection是单列集合,存储的元素是单一的,List集合可以重复,Set集合元素唯一。
(3)Map集合的功能
A:添加功能
V put(K key,V value)
B:删除功能
remove(K key)
C:判断功能
containsKey(K key)
containsValue(V value)
D:获取功能
V get(K key)
Set<K> keySet()
Collection<V> values()
Set<Map.Entry<K,V>> entrySet()
E:长度功能
int size()
(4)Map集合的数据结构问题:
Map集合的数据结构对键有效,跟值无关。
它的底层数据结构和Set中讲解的一致。
如果是哈希表结构,就需要重写hashCode()和equals()。
如果是二叉树结构,就有两种方式:Comparable,Comparator
(5)Map的遍历方式
假设有一个HashMap集合,存储的键和值都是String类型。名称叫hm。
A:根据键找值(掌握)
a:获取所有键的集合
b:遍历键的集合,获取到每一个键
c:根据键找值
代码体现:
Set<String> set = hm.keySet();
for(String key : set) {
String value = hm.get(key);
System.out.println(key+"---"+value);
}
B:根据键值对对象找键和值(理解)
a:获取所有键值对对象的集合
b:遍历键值对对象的集合,获取到每一个键值对对象
c:根据键值对对象获取键和值
代码体现:
Set<Map.Entry<String,String>> set = hm.entrySet();
for(Map.Entry<String,String> me : set) {
String key = me.getKey();
String vlaue = me.getValue();
System.out.println(key+"---"+value);
}
(6)案例:
A:统计一个字符串中每个字符出现的次数
import java.util.Set;
import java.util.TreeMap;
/*
* "cbxzbvavdvgd"获取字符串中,每一个字母出现次数:"a(1)b(2)c(1)d(2)g(1)v(3)x(1)z(1)"
*
* 思路:
* A:定义字符串。
* B:把字符串转换成字符数组。
* C:定义TreeMap集合。
* D:遍历字符数组,获取到每一个字符。
* E:拿这个字符作为键去TreeMap集合中查找值
* 返回null,说明以前不存在,我们就存储一次,记录次数为1
* 不为null,说明以前存在,我们就把值加1,然后重新存储。
* F:把TreeMap集合中的元素遍历并拼接成一个满足条件的字符串。
* G:输出字符串。
*/
public class TreeMapDemo {
public static void main(String[] args) {
// 定义字符串。
String str = "cbxzbvavdvgd";
// 把字符串转换成字符数组。
char[] chs = str.toCharArray();
// 定义TreeMap集合。
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
// 遍历字符数组,获取到每一个字符。
for (char ch : chs) {
// 拿这个字符作为键去TreeMap集合中查找值
Integer i = tm.get(ch);
if (i == null) {
// 返回null,说明以前不存在,我们就存储一次,记录次数为1
tm.put(ch, 1);
} else {
// 不为null,说明以前存在,我们就把值加1,然后重新存储。
i++;
tm.put(ch, i);
}
}
// 把TreeMap集合中的元素遍历并拼接成一个满足条件的字符串。
StringBuilder sb = new StringBuilder();
Set<Character> set = tm.keySet();
for (Character key : set) {
Integer value = tm.get(key);
sb.append(key).append("(").append(value).append(")");
}
//输出字符串。
String result = sb.toString();
System.out.println(result);
}
}
B:Map集合的嵌套存储和遍历
package cn.itcast.test;
import java.util.HashMap;
import java.util.Set;
/*
* Map集合的嵌套及其遍历。
czbk:
yr 预热班
jy 就业班
预热班:
01 zhangsan
02 lisi
就业班:
01 wangwu
02 zhaoliu
*/
public class HashMapDemo {
public static void main(String[] args) {
// 创建集合
HashMap<String, HashMap<String, String>> czbk = new HashMap<String, HashMap<String, String>>();
// 创建元素对象
// 预热班
HashMap<String, String> yr = new HashMap<String, String>();
yr.put("01", "zhangsan");
yr.put("02", "lisi");
// 就业班
HashMap<String, String> jy = new HashMap<String, String>();
jy.put("01", "wangwu");
jy.put("02", "zhaoliu");
// 添加到czbk中
czbk.put("yr", yr);
czbk.put("jy", jy);
// 遍历
Set<String> set = czbk.keySet();
for (String key : set) {
System.out.println(key);
HashMap<String, String> hm = czbk.get(key);
Set<String> hmSet = hm.keySet();
for (String hmKey : hmSet) {
String hmValue = hm.get(hmKey);
System.out.println("\t" + hmKey + "---" + hmValue);
}
}
}
}
(7)Map集合的体系
Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap
A:HashMap和Hashtable的区别?
HashMap是线程不安全的,效率高,可以出现null键值
Hashtable是线程安全的,效率低,不可以有null键值,否则出现NullPointerException
底层数据结构是链表和哈希表,键唯一且有序
2:Collections工具类(理解)
(1)Collections是针对集合操作的工具类。
(2)面试题:
Collection和Collections的区别?
Collection是单列集合的顶层接口。
Collections是操作集合的工具类。
(3)常见功能:
A:排序
sort()
B:二分查找
binarySearch()
C:最大值
max()
D:反转
reverse()
E:随机置换
shuffle()
(4)如何造一个线程安全的集合:
//如果是造了一个线程安全的ArrayList集合。其他的方式类似,查看API即可
List<String> list = synchronizedList(new ArrayList<String>());
3:集合总结(什么时候使用谁?)
是否键值对:
是:Map
是否排序:
是:TreeMap
否:HashMap
不知道,HashMap
否:Collection
是否唯一:
是:Set
是否排序:
是:TreeSet
否:HashSet
不知道,HashSet
否:List
增删多:LinkedList
查询多:ArrayList
不知道,ArrayList
不知道,用ArrayList
4:集合体系总结
集合:
|--Collection
|--List
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
|--Set
|--HashSet
底层数据结构是哈希表。
如何保证唯一性?
依赖hashCode()和equals()
顺序:
先判断hashCode()值是否相同:
是:继续走equals(),看返回值
true:元素重复。不添加
false:元素不重复。添加
否:直接添加
|--LinkedHashSet
底层数据结构是链表和哈希表。
由链表保证有序(存储和取出一致)。
由哈希表保证元素唯一。
|--TreeSet
底层数据结构是二叉树。
如果保证唯一性?
根据返回值是否是0。
如何排序:
自然排序:Comparable
比较器排序:Comparator
|--Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap