目录
一、Map
双列集合的特点
1、双列集合一次需要存一对数据,分别为键和值
2、键不能重复,值可以重复 1双列集合一次需要存一对数据,分别为键和值2键不能重复,值可以
重复
3、键和值是一一对应的,每一个键只能找到自己对应的值 3键和值是一一对应的,每一个键只能找到自己对应的值
4、键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象” 4键+值这个整体我们称之为“键值对”或者“键值对对象”,在中叫做“Entry对象”
1、Map的常见API
Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
方法名称 | 说明 |
v put(k key,v value) | 添加元素 |
v remove(object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(object key) | 判断集合是否包含指定的键 |
boolean containsValue(object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
示例:
//创建map集合,
Map<String,String> map = new HashMap();
//添加元素
map.put("张三","123");
map.put("李四","456");
map.put("王五","789");
System.out.println(map);
System.out.println("_________________");
//根据键删除键值对元素
map.remove("张三");
System.out.println(map);
//判断集合是否包含指定的键
boolean flag = map.containsKey("张三");
System.out.println(flag);
//判断集合是否包含指定的值
boolean b = map.containsValue("456");
System.out.println(b);
//判断集合是否为空
boolean empty = map.isEmpty();
System.out.println(empty);
//集合的长度,也就是集合中键值对的个数
int size = map.size();
System.out.println(size);
//移除所有的键值对元素
map.clear();
System.out.println(map);
2、map集合的三种遍历方式
1、键找值
示例:
//创建map集合,
Map<String,String> map = new HashMap();
//添加元素
map.put("张三","123");
map.put("李四","456");
map.put("王五","789");
//获取所有的键放在单列集合里
Set<String> stringSet = map.keySet();
//遍历单列集合,得到每一个键
for (String key : stringSet) {
//通过键找到对应的值
String value = map.get(key);
System.out.println(key + "=" + value);
}
System.out.println("-------------");
//通过迭代器遍历
Iterator<String> iterator = stringSet.iterator();
while (iterator.hasNext()){
String key = iterator.next();
String value = map.get(key);
System.out.println(key + "=" + value);
}
System.out.println("-------------");
//通过Lambda表达式遍历
stringSet.forEach(s -> {
//通过键找到对应的值
String value = map.get(s);
System.out.println(s + "=" + value);
});
2、通过键值对
示例:
//创建map集合,
Map<String,String> map = new HashMap();
//添加元素
map.put("张三","123");
map.put("李四","456");
map.put("王五","789");
//获取所有键值对放入一个集合
Set<Map.Entry<String, String>> entries = map.entrySet();
//增强for遍历集合
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "=" + value);
}
System.out.println("-----------------");
//迭代器遍历
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
while (iterator.hasNext()){
Map.Entry<String, String> next = iterator.next();
System.out.println(next);
}
System.out.println("-----------------");
//lambda表达式遍历
entries.forEach(Entry -> {
System.out.println(Entry);
});
3、lambda表达式
示例:
//创建map集合,
Map<String,String> map = new HashMap();
//添加元素
map.put("张三","123");
map.put("李四","456");
map.put("王五","789");
//匿名内部类
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String s, String s2) {
System.out.println(s + "=" + s2);
}
});
System.out.println("_________________");
//简化
map.forEach((String key,String value)->{
System.out.println(key + "=" + value);
});
//简化
System.out.println("_________________");
map.forEach((key,value)->System.out.println(key + "=" + value));
3、HashMap
HashMap的特点
1、HashMap是Map里面的一个实现类。
2、没有特有方法,直接使用Map里面的方法就可以了。
3、特点都是由键决定的:无序、不重复、无索引
4、HashMap跟HashSet底层原理是一模一样的,都是哈希表结构
5、HashMap底层是哈希表结构的
6、依赖hashcode方法和equals方法保证键的唯一
7、如果键存储的是自定义对象,需要重写hashCode和equals方法如果值存储自定义对象,不需要
重写hashCode和equals方法
HashMap练习,统计投票数
//创建map集合,
Map<String,Integer> map = new HashMap();
//添加元素;定义四个景点
List<String> list = new ArrayList<>();
String [] array = {"A","B","C","D"};
//定义票数
Random random = new Random();
for (int i = 0; i < 40; i++) {
int index = random.nextInt(array.length);
list.add(array[index]);
}
for (String name : list) {
//判断当前景点是否在map集合中
if (map.containsKey(name)){
//存在
//先获取当前经典的票数
int count = map.get(name);
//景点票数加1
count++;
//再放回集合中
map.put(name,count);
}else {
//不存在
map.put(name,1);
}
}
//求最大值
int max = 0;
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
int count = entry.getValue();
if (count>max){
max = count;
}
}
//判断那个景点票数最多,并打印
for (Map.Entry<String, Integer> entry : entries) {
int count = entry.getValue();
if (count == max){
System.out.println(entry.getKey());
}
}
System.out.println(map);
4、LinkedHashMap
由键决定:有序、不重复、无索引。
这里的有序指的是保证存储和取出的元素顺序一致
原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储
的顺序。
示例:
//创建集合,
LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap<>();
//添加元素
linkedHashMap.put("a",1);
linkedHashMap.put("a",2);
linkedHashMap.put("c",3);
linkedHashMap.put("d",4);
//打印集合
System.out.println(linkedHashMap);
5、TreeMap
TreeMap跟TreeSet底层原理一样,都是红黑树结构的。
由键决定特性:不重复、无索引、可排序
可排序:对键进行排序。
注意:默认按照键的从小到大进行排序,也可以自己规定键的排序规则
代码书写两种排序规则
1、实现Comparable接口,指定比较规则。
2、创建集合时传递Comparator比较器对象,指定比较规则。
示例:
//创建集合,
TreeMap<Integer,String> treeMap = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
//o1表示当前要添加的元素
//o2表示已在红黑树存在的元素
//实现倒序
return o2-o1;
}
});
//添加元素
treeMap.put(5,"a");
treeMap.put(4,"b");
treeMap.put(3,"c");
treeMap.put(2,"d");
treeMap.put(1,"e");
//打印
System.out.println(treeMap);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93336.html