Map集合—双列集合
一、map集合的概述和特点
1.public interface Map<K,V>
*map是一个接口,创建对象的时候需要使用接口多态
*有两个泛型<K,V>,说明map集合是以"键值对"形式体现的,而且K和V之间是有"对应关系"的
2.遍历map集合的注意事项
map集合的最小单位是键值对,不能直接把K全部输出来,然后再把V输出来;因为这样就失去了K和V之间的对应关系
3.map集合的特点
key:
(1)唯一
(2)存取无序
value:
没有什么要求,是根据key来的
二、map集合的常用功能
1.V put(K key,V value) 添加元素 //不是add
*新增:当key在map集合中不存在的时候
*修改:当key在map集合中已经存在的时候
2.V remove(Object key) 根据键删除键值对元素
//删除的是键值对
3.void clear() 移除所有的键值对元素 //高危方法,基本不用
4.boolean containsKey(Object key) 判断集合是否包含指定的键 //容易忘
5.boolean containsValue(Object value) 判断集合是否包含指定的值//容易忘
6.boolean isEmpty() 判断集合是否为空 //忘记
7.int size() 集合的长度,也就是集合中键值对的个数
//回忆
* map集合怎么判空?
if(null!=map && map.size()>0){
xxxxx
}
*length、length()、size()三者的区别?
length:数组的长度(属性)
length():字符串的长度(方法)
size():集合的长度(方法)
三、map集合的获取功能
1.V get(Object key) 根据键获取值
2.Set keySet() 获取所有"键"的集合
//这里为什么返回的是set集合呀?
因为key值的特点是唯一、存取无序,和set集合的特点一样,所以用set集合来接收
3.Collection values() 获取所有"值"的集合
//为什么返回值是Collection?
map集合的value值是可以重复的,没有什么特殊要求,所以使用collection接收
4.Set<Map.Entry<K,V>> entrySet() 获取所有键值对对象的集合
//entry:条目、记录的意思,在这里指的是键值对信息的意思
四、map集合的两种遍历方式
1.根据keyset来遍历
步骤:
*使用keySet()得到所有的key集合
*使用增强for遍历得到每一个key
*根据每一个key使用get(Object key)得到对应的value值
代码实现:
Set<String> keys = map.keySet();
for (String key : keys){
String value = map.get(key);
System.out.println(key+"======="+value);
}
2.根据entryset来遍历
步骤:
*使用entrySet()得到所有的键值对对象的集合
*使用增强for遍历每一个键值对对象
*再使用没一个个键值对对象的getKey()和getValue()方法,得到每一个键和值
代码实现:
//根据entrySet来遍历
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> me : entries){
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"======="+value);
}
//map集合的相关总结: ☆☆☆☆☆
增:
V put(K key,V value) 添加元素 //不是add
//key值在map集合中不存在
删:
V remove(Object key) 根据键删除键值对元素
改:
V put(K key,V value) 添加元素
//key值在map集合中已经存在
遍历:有两种遍历方式
*根据keySet方式遍历
*根据entrySet的方式遍历
判空:
if(null!=map && map.size()>0){
xxxxx
}
//关于map集合特点
相对于key值来说的,key值必须是唯一的,并且它还是存取无序的
//hashmap集合的key值是怎么保证唯一的
和hashset集合保证唯一性的原理一样
依赖于hashcode和equals两个方法
(1)哈希表中不存在该哈希值
直接将元素添加到哈希表中
(2)哈希表中已经存在该哈希值
使用equals方法和该哈希值下面"桶"中的数据逐一比较
*发现里面有要添加的元素,覆盖
*发现里面没有要添加的元素,在"桶"中继续添加该元素
五、案例分析
1.map集合key是学生对象,value是string的案例
//什么时候需要重写hashcode和equals方法?
条件一:需要保证唯一的时候
条件二:我们自定义的类
*hashset集合存储自定义对象
*linkedHashSet集合存储自定义对象
*hashmap集合的key存储自定义对象
Collections的概述和使用
1.COllections是一个操作集合的工具类
//回忆
工具类要求:
*工具类所在的包,包名必须以util或者utils结尾
*工具类的类名必须以util或者utils结尾 //DateUtils
*构造方法私有
*所有的方法必须用static修饰
2.常用方法
public static void sort(List list) 将指定的列表按升序排序 //自然排序
public static void reverse(List<?> list) 反转指定列表中元素的顺序
//字符串怎么反转?
new StringBuilder("asdsfg").reverse().toString()
public static void shuffle(List<?> list) 使用默认的随机源随机排列指定的列表
//应用场景:洗牌、随机点名
3.Collections和Collection的区别? //面试题
*Collections是一个操作集合的工具类,常用的方法有排序、反转、随机的方法
*Collection是单列集合的顶层接口,有两个子接口List和Set。
4.ArrayList集合存储学生对象并排序
static <T> void sort(List<T> list, Comparator<? super T> c)
//TreeSet(Comparator<? super E> comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。
Comparator:比较器排序接口,重写里面的compare方法。 //排序的规则
5.模拟斗地主案例
(1)造54张牌
*分为两种
第一种:大王 小王 //字符串
第二种:A-2
//定义花色数组
String[] colors = {"♦", "♣", "♥", "♠"};
//定义点数数组
String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J","Q", "K", "A"};
for (String color : colors) {
for (String number : numbers) {
array.add(color + number);
}
}
(2)洗牌
Collections工具类的 void shuffle();
(3)发牌
分为四类
第一个:三个玩家
for (int i = 0; i < array.size(); i++) {
String poker = array.get(i);
if (i >= array.size() - 3) {
dpArray.add(poker);
} else if (i % 3 == 0) {
lqxArray.add(poker);
} else if (i % 3 == 1) {
lyArray.add(poker);
} else if (i % 3 == 2) {
fqyArray.add(poker);
}
}
第二个:底牌
取最后三张牌作为底牌
if (i >= array.size() - 3) {
dpArray.add(poker);
}
(4)看牌
遍历各自的ArrayList数组
(5)都记住案例升级版
问题:我们只对索引进行了自然排序,为什么对应的value也是从小到大的呢?
String[] colors = {"♦", "♣", "♥", "♠"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q","K", "A", "2"};
//从0开始往HashMap里面存储编号,并存储对应的牌。同时往ArrayList里面存储编号
int index = 0;
for (String number : numbers) { //外层循环 数字
for (String color : colors) { //花色
hm.put(index, color + number);
array.add(index);
index++;
}
}