java中的Map集合
除了我们之前所学习的Collection集合之外,还有Map集合,它是一个接口,Map集合是用键(key)存储元素的容器,键是不能重复的,如果重复就会被替换掉,但是值(value)可以重复,每个键都对应一个值,具有键值对映射关系,Map要保证唯一性,Map集合主要包含了3个实现类,HashMap、TreeMap和LinkedMap。让我们来看看吧
集合框架图
Interface Map<K,V> K:键的类型;V:值的类型
将键映射到值的对象,不能包含重复的键;每个键可以映射到最多一个值
Map集合的特点:
1.键值对映射关系。
2.键不能重复。
3.元素的存取无序。
4.一个键只能对应一个值。
常用方法
public class MapDemo02 {
public static void main(String[] args) {
//创建集合对象
Map<String,String> map=new HashMap<String,String>();
//V put(K key, V value): 添加元素。
map.put("张无忌","赵敏");
map.put("郭靖","黄蓉");
map.put("杨过","小龙女");
//V remove(Object key): 根据键删除值对元素
// System.out.println(map.remove("郭靖"));
// System.out.println(map.remove("郭襄"));//没有键对应的值返回null
// void clear():移除所有的键值元素
//map.clear();
//boolean containsKey(Object key):判断集合是否包含指定的键
// System.out.println(map.containsKey("郭靖"));
// System.out.println(map.containsKey("郭襄"));
//boolean isEmpty():判断集合是否为空
//System.out.println(map.isEmpty());
//int size():集合的长度,也就是集合中键对的个数
System.out.println(map.size());
//输出集合对象
System.out.println(map);
Map集合的遍历方式:
Map集合的遍历(方式1):
1.获取所有值的集合,用KeySet()方法实现
2.遍历键的集合,获取到每一个键,用增强for循环实现
3.根据键去找值,用get(Object key)方法实现
//获取所有值的集合,用KeySet()方法实现
Set<String> keySet = map.keySet();
//遍历键的集合,获取到每一个键,用增强for循环实现
for(String key: keySet){
//根据键去找值,用get(Object key)方法实现
String value = map.get(key);
System.out.println(key+","+value);
Map集合的遍历(方式2):
1.获取所有键值对对象的集合
Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
2.遍历键值对对象的集合,得到每一个键值对对象
用增强for实现,得到每一个Map.Entry
3.根据键值对对象获取键和值
用getKey()得到键
用getValue()得到值
// 获取所有键值对对象的集合
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//遍历键值对对象的集合,得到每一个键值对对象
for(Map.Entry<String,String> me:entrySet){
//根据键值对对象获取键和值
String key = me.getKey();
String value = me.getValue();
System.out.println(key+","+value);
1、HashMap
HashMap底层哈希表数据结构,和HashSet一样,是用哈希表实现,所以无序,线程是不同步的,可以存入null键和null值,要保证它的唯一性,就需要重写HashCode()和Equals()方法(自动生成即可)HashMap是经常用到的。
有两种遍历方式:
方式1:键找值
方式2:键值对对象找键和值
//遍历集合
//方式1:键找值
Set<String> keySet = hm.keySet();
for(String key: keySet){
Student value = hm.get(key);
System.out.println(key+","+value.getName()+","+value.getAge());
}
System.out.println("--------");
// 方式2:键值对对象找键和值
Set<Map.Entry<String, Student>> entrySet = hm.entrySet();
for(Map.Entry<String,Student>me : entrySet){
String key = me.getKey();
Student value = me.getValue();
System.out.println(key+","+value.getName()+value.getAge());
}
}
}
在JDK1.8以前是通过数组和链表实现,在JDK1.8以后(阈值大于8),为解决哈希冲突,用数组加链表加红黑树(结点只有两种颜色,非黑即白)表示,红黑树是二叉查找树的一种,是有序的树形结构。
2、TreeMap
TreeMap底层是二叉树数据结构,可以通过比较器对Map中的键进行排序。
两种排序(参照之前所学的TreeSet):
1.自然排序Comparable:
无参构造采用的是自然排序,重写Comparator()方法
2.比较器排序Comparator:
带参构造犯法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接受Comparator的实现类对象,重写compare(To1,To2)方法
3、LinkedMap
我们来简单说一下LinkedMap吧,底层是链表加数组(迭代顺序),是一个有序的集合存取元素的顺序是一致的。
4、Collections
Collections是一个包装类,是针对集合操作的工具类,包含各种有关集合的静态多态方法,不能实例化服务于Collection框架,提供一系列静态方法实现对各种集合的搜索、排序和线程安全。
常用方法
public class CollectionsDemo01 {
public static void main(String[] args) {
//创建集合对象
List<Integer> list = new ArrayList<Integer>();
//添加元素
list.add(30);
list.add(20);
list.add(50);
list.add(10);
list.add(40);
//public static <T extends Comparable<? super T>> void sort(List<T> list):将指定的列表按升序排序
// Collections.sort(list);
//public static void reverse(List<?> list):反转指定列表中元素的顺序
// Collections.reverse(list);
//public static void shuffle(List<?> list):使用默认的随机源随机排列指定的列表
Collections.shuffle(list);
System.out.println(list);
}
}
Collection和Collections的区别
Colection:
Colection是一个接口,有List和Set两个子接口,提供了集合对象进行基本操作的通用接口方法,在java类库中有许多具体实现,Collection接口的具体意义式危重症具体集合提供了最大化的统一操作方式。
Colections:
Colections是一个工具类,不能实例化。