【Java数据结构】Map Set
Java中Map和Set是两个接口,可以利用它们选择任意一个实现类。Map中存储的是key-value的键值(通过key找到value值),Set中存储的是key(快速找出这个key)。
Map
1.关于Map的说明
Map分TreeMap和HashMap,Map在比较是是通过key来比较的,下面是构造方法:
Map<String,Integer> map = new TreeMap<>();
TreeMap<Strinh,Integer> map1 = new TreeMap<>();
2.Map的主要方法
put方法是存储key-value,get方法是得到key对应的value值。Map存储键值时,key一定是唯一的(不能重复),如果重复出现就可以修改value的值。
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("This",3);
map.put("This",5);//相同的key只能出现一次,如果再次出现就会改变value
int value = map.get("This");
System.out.println("This对应的value:"+value);
}
如果想要找一个key的value值,但是Map存储中又不存在这个key,那就会报错(空指针异常);但是不想出现空指针异常的话可以使用Map的方法getOrDefault,如果不存在这个key,那就自己设置一个数字用来识别空指针异常的操作(例如:可以使用-1、或者更大的数字10000等)
int value2 = map.get("a");
System.out.println(value2);
//getOrDefault方法
int value1 = map.getOrDefault("a",-1);
System.out.println(value1);
remove方法是将Map中存储的key删除,并且返回的是该key的value值,再次删除时Map中就不存在这个key,就返回null。
System.out.println(map.remove("This"));//5
System.out.println(map.remove("This"));//null 删除成功
System.out.println(map.remove("a"));//null
keySet方法是保存所有的key的不重复集合,保存的顺序是无序的(不会按照添加的顺序进行排序),如果使用HashSet就有可能按照字典顺序或者升序进行排列。既然有保存所有的key那就也有保存所有的value值,values方法就是保存所有的value值,并且它也是没有顺序而言的。
map.put("This",3);
map.put("a",4);
map.put("one", 29);
map.put("dog", 7);
Set<String> set = map.keySet();
Collection<Integer> values = map.values();
entrySet方法是将map存储的key连成一棵树,每一个结点的类型都是Map.Entry<K,V>,这个方法是保存Map中所有的key和key对应的value值,既然保存下来了,就可以遍历所有的key和value,通过增强for循环来遍历。Map.Entry<K, V>是Map内部实现的用来存放<key, value>键值对映射关系的内部类,它可以获取key(getKey方法)和获取value(getValue方法),也可以设置value值(setValue方法)。
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for (Map.Entry<String, Integer> entry:entries){
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
if (entry.getKey().equals("a")){
Integer value1 = entry.setValue(23);//将“a”对应的value值设置成23
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
}
Map也可以使用迭代器遍历所有数据,如下代码:
// 获取 map 的 entry 集合
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
// 使用迭代器遍历 map
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("Key: " + key + ", Value: " + value);
}
Map直接输出key以及key对应的value值。
System.out.println(map);
Set
1.关于Set的说明
Set与Map的主要区别:Set是继承自Collection的接口类,Set中只存储类Key。
Set<String> set1 = new HashSet<>();
Set<String> set = new TreeSet<>();
2.关于Set的主要方法
Set添加元素用add,TreeSet底层逻辑也是Set,和Map的put的用法一样,相同的还有remove删除。以下代码是关于Set中主要方法的使用:
Set<String> set = new TreeSet<>();
Set<String> set2 = new TreeSet<>();
set2.add("a");
set2.add("d");
set.add("a");
set.add("b");
set.add("c");
System.out.println(set);
//set.clear();//清空数据
//System.out.println(set);
System.out.println(set.contains("d"));//"d"这个元素是否在set存储的数据中
System.out.println(set.size());//set中存储的数据个数
System.out.println(set.isEmpty());//set中的数据是否为空
Object[] s = set.toArray();//将set中的数据转成数组
for (int i = 0; i < s.length; i++){
System.out.println("key:"+s[i]);
}
System.out.println(set.containsAll(set2));//set2中所有数据在set中是否都有
System.out.println(set.addAll(set2));//如果set2中的数据set中都有,那就重复了就返回false;如果添加了新的元素返回true
System.out.println(set);
//迭代器
Iterator<String> it = set.iterator();
while(it.hasNext()){
System.out.println("key:"+it.next());
}
TreeSet的底层是Map实现的,所以set存储数据时key必须是唯一的。并且在Set中没有方法可以实现Key的修改,只有将原来的删除再插入新的数据。TreeSet中不能插入null,但HashSet可以。