目录
Map和Set集合
主要的数据结构:
二分搜索树
在Java标准库中的实现叫 TreeMap / TreeSet
哈希表
在Java标准库中的实现叫 HashMap / HashSet
Map集合和Set集合的基础使用
Map的基础使用
Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap。
Map保存的是键值对元素
不重复的key对应一个可以重复的value值map.put(key,value):添加一个新的键值对。(添加&修改操作)
若key不存在,就新增一个Map.Entry对象,保存到Map中。没有键映射,则返回NULL。
若key已经存在,修改原来的value为新的value,返回修改前的value。(既是新增又是修改)
map.containsKey(1) :判断1这个值在当前map的key中是否存在 ——> truemap.containsValue(100):判断100这个值在map中Value中是否存在 ——> false
Map集合的遍历:实际上就是取出一对一对的元素,使用for eachfor(Map.Entry<k,v> entry : map.entrySet()) { //每次从Map集合中取出一个键值对对象 entry.getKey(); entry.getValue(); }
Map中的键值对这个类型——> Map.Entry 表示当前Map中的一个个键值对。
map.entrySet():返回Map中所有键值对对象,即数组Map.Entry[]。{ {1:10}, // Map.Entry1 {2:20}, // Map.Entry2 {3:10}, // Map.Entry3 }
Map.Entry方法
entry.getKey():当前键值对的key值entry.getValue():当前键值对的Value值
package jcl; import java.util.HashMap; import java.util.Map; public class MapTest { public static void main(String[] args) { Map<Integer, Integer> map = new HashMap<>(); map.put(1, 10); map.put(2, 10); map.put(3, 10); System.out.println(map.containsKey(3)); System.out.println(map.containsValue(40)); //Map.Entry[] for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); } } }
get():根据相应的key取出相应的value值。若不存在,返回null。
getOrDefault(key,default):若key不存在,返回默认值defaultVal。
remove():删除指定key值的这一对健值对,返回删除的value值。
Set<k> keySet():返回当前Map接口中所有的key值集合。返回值是一个Set集合,key不能重复。Set接口中就保存的不重复元素。
Collection<V> values():返回当前Map接口中所有的value值集合。返回值是一个Collection接口的集合,value可以重复。
package jcl; import java.util.*; /** * Map集合 */ public class MapTest { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("及时雨", "宋江"); map.put("智多星", "吴用"); map.put("九纹龙", "史进"); map.put("豹子头", "林冲"); System.out.println(map.put("智多星", "张三")); //取出所有的k值 Set<String> keys = map.keySet(); System.out.println("当前所有的key为:"); for (String str : keys) { System.out.print(str +" "); } System.out.println(); //取出所有的value值 Collection<String> values = map.values(); System.out.println("当前所有的value为:"); for (String str : values) { System.out.print(str +" "); } } }
在Map中元素添加的顺序和保存的顺序没有必然联系。
关于Map接口常见子类的添加问题
1. Map接口中元素的添加顺序和元素的保存顺序没有必然联系。
不像List,添加顺序和保存顺序一致。即先添加1,再添加2,则1这个元素一定保存在2之前,逻辑连续。package jcl; import java.util.*; public class MapTest { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("及时雨", "宋江"); map.put("智多星", "吴用"); map.put("九纹龙", "史进"); map.put("豹子头", "林冲"); System.out.println(map.toString()); } }
HashMap中保存的元素顺序由hash函数来决定。
由TreeMap中的compareTo方法决定
package jcl; import java.util.*; public class MapTest { public static void main(String[] args) { Map<String, String> map = new TreeMap<>(); map.put("及时雨", "宋江"); map.put("智多星", "吴用"); map.put("九纹龙", "史进"); map.put("豹子头", "林冲"); System.out.println(map.toString()); } }
要使用TreeMap保存元素,该类必须实现Comparable或传入一个比较器。
HashMap不需要实现比较
2. 关于保存null值的说明
HashMap的key和value都能为null,若key为null,有且只有一个。
TreeMap中key不能为null,value可以为null。
Set的基础使用
Set:其实就是披着Set外衣的Map。
是Collection接口的子接口,一次保存一个元素,和List集合最大的区别在于,Set集合保存的元素不能重复。
Set:元素不重复,使用Set集合来进行去重处理
boolean add():添加一个元素,若该元素不存在则添加成功,返回true,若该元素已经存在,添加失败,返回false。
boolean contains():判断一个元素o是否在当前set中存在。
boolean remove():在Set集合中删除指定元素o,若该元素不存在,删除失败返回false;否则删除该元素,返回true。
没有提供修改的方法,若需要修改元素,只能先把要修改的元素删除,再添加新元素。
遍历集合使用for- each循环即可
package jcl; import java.util.HashSet; import java.util.Set; public class SetTest { public static void main(String[] args) { Set<Integer> set = new HashSet(); System.out.println(set.add(1)); System.out.println(set.add(1)); System.out.println(set.add(2)); System.out.println(set.add(3)); System.out.println(set.contains(3)); System.out.println(set.contains(4)); System.out.println(set.remove(2)); for (int i : set) { System.out.print(i + " "); } } }