Java集合Map
Map 双列集合的顶层接口
Collections 工具类
项目:斗地主的制牌,洗牌,发牌
1.Map:(key,value)
2.map始发地址,目的地址
3.描述的就是一个数据到另一个数据的映射
4.Map的特点:
key是唯一的,value不是唯一的
5.Map和Collection的区别
Map是双列集合
Collection是单列集合
Map的键是唯一的,Collection中的子接口的Set也是唯一的;
Set的底层结构是Map
Map的常用方法Map<K,V> key,value
void clear() 从此映射中移除所有映射关系(可选操作)。
boolean containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o) 比较指定的对象与此映射是否相等。
V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int hashCode() 返回此映射的哈希码值。
boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 true。
Set<K> keySet() 返回此映射中包含的键的 Set 视图。
V put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。*添加值*
void putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。
V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
int size() 返回此映射中的键-值映射关系数。
Collection<V> values() 返回此映射中包含的值的 Collection 视图。
Map的遍历
两张遍历方式
1.转成Set Set<E> keySet = map.keySet();键的Set集合,get(key)获取value的值
for() 循环
Iterator 迭代器
2.Set<Map.Entry<K,V>> entrySet() getKey() getValue()
返回此映射中包含的映射关系的 Set 视图。
![Entry原理图](https://img-blog.csdnimg.cn/20190716142044421.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTczOTYyOA==,size_16,color_FFFFFF,t_70)
boolean equals(Object o)
比较指定对象与此项的相等性。
K getKey()
返回与此项对应的键。
V getValue()
返回与此项对应的值。
int hashCode()
返回此映射项的哈希码值。
V setValue(V value)
用指定的值替换与此项对应的值(可选操作)。
Set<Entry<K,V>> set = map.entrySet();
Iterator it = set .iterator();
练习:录入一个字符串,统计每个字符出现的个数;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
public class Map01{
public static void main(String[] args) {
Map<Character,Integer> map = new TreeMap();
StringBuilder sb = new StringBuilder();
Scanner sc = new Scanner(System.in);
System.out.println("亲,请录入一个字符串");
String str = sc.nextLine();
//sdfjlsknlkh
//获取字符串的字符数组 字符串--》字符数组
char[] arr = str.toCharArray();
//遍历
for(char c:arr) {
//判断该字符是否在map集合中
//无,第一次出现,添加到集合中,同时赋value值为1
//有,把原有的值取出来,加1再赋值回去
/* if(map.containsKey(c)) {
//包含
//先把原来的字符的次数取出
int count = map.get(c);
map.put(c, count+1);
}else {
//不包含
map.put(c, 1);
}*/
map.put(c, map.containsKey(c)?map.get(c)+1:1);
}
//遍历map集合
Set<Character> keySet = map.keySet();
for(char c:keySet) {
int count = map.get(c);
sb.append(c+"("+count+")");
}
System.out.println(sb.toString());
}
}
HashMap 哈希表 HashSet的底层是HashMap,重写hashCode(),equals();
HashSet和HashMap的键值列保证元素唯一的方式是相同的;
TreeMap 二叉树 TreeMap的底层是TreeMap,重写compareTo()方法
TreeSet和TreeMap的键值列保持元素唯一的方式相同;
LinkedHashMap
1.是HashMap的子类;
2.拥有可预知的位置顺序,存储于取出的顺序一致
HashTable已废弃
与HashMap的区别
都是采用哈希表存取;
版本出现不同:HashTable 从1.0开始,HashMap从1.2开始
线程安全不同:HashTable是线程安全的,HashMap是线程不安全的;
HashTable不能存储null值和null键,HashMap可以;
命名规则不同:HashTable早期没有形成严格的命名体系;
Collections工具类
常用方法:
static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)
使用二分搜索法搜索指定列表,以获得指定对象。
static int frequency(Collection<?> c, Object o)
返回指定 collection 中等于指定对象的元素数。
static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值。
static <T> void fill(List<? super T> list, T obj)
使用指定元素替换指定列表中的所有元素。 //全部填充
static void reverse(List<?> list)
反转指定列表中元素的顺序。
static void shuffle(List<?> list)
使用默认随机源对指定列表进行置换。 //随机打乱顺序
static void swap(List<?> list, int i, int j)
在指定列表的指定位置处交换元素。