这篇文章所要讲的内容与上述图片紧密相关。有了该图,便可以理解许多问题了。
目录
Map
概念
Map是一个接口类,如上图,它没有继承Collection,Map存储的是<key,val>结构的键值对,key是唯一的,不能重复。
使用
因为Map是一个接口类,所以不能直接单独实例化,所以通常实现TreeMap或者HashMap(实现了Map接口的类)。
常用方法
增加:V put(K key, V value)
import java.util.Map;
import java.util.TreeMap;
public class TestMap {
public static void main(String[] args) {
//通过TreeMap来演示
Map<String, Integer> map = new TreeMap<>();
//增加
map.put("张三", 8);
map.put("李四", 2);
}
}
删除:V remove(Object key)
//增加
map.put("张三", 8);
map.put("李四", 2);
System.out.println(map);
//删除
map.remove("李四");
System.out.println(map);
查找Key的Val:
V get(Object key)V getOrDefault(Object key, V defaultValue)
//增加
map.put("张三", 8);
map.put("李四", 2);
System.out.println(map);
//查找
//该方法返回key所对应的val,如果没有找到,则返回null
Integer find1 = map.get("张三");
Integer find2 = map.get("王五");
//该方法返回key所对应的val,如果没有找到,则返回给的默认值
Integer find3 = map.getOrDefault("王五", -1);
System.out.println(find1);
System.out.println(find2);
System.out.println(find3);
查找是否包含Key 或者 Val:
boolean containsKey(Object key)boolean containsValue(Object value)
map.put("张三", 8);
map.put("李四", 2);
System.out.println(map);
System.out.println(map.containsKey("张三"));
System.out.println(map.containsKey("王五"));
//自动装包了
System.out.println(map.containsValue(2));
System.out.println(map.containsValue(6));
返回所有Key 或者 Val
Set<K> keySet()Collection<V> values()
返回Key和Val
Set<Map.Entry<K, V>> entrySet()
map.put("张三", 8);
map.put("李四", 2);
System.out.println(map);
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> x: entrySet) {
System.out.println(x);
}
Map.Entry<K, V>
Map.Entry<K, V> 是 Map 内部实现的用来存放 <key, value> 键值对映射关系的内部接口类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式。
方法 | 说明 |
K getKey()
|
返回 entry 中的 key
|
V getValue()
|
返回 entry 中的 value
|
V setValue(V value)
|
将键值对中的value替换为指定value
|
因为Key不可变,所以没有提供替换Key的方法。
Set
概念
Set是一个接口类,它继承了Collection。Set存储Key值,并且Key都不相同。
使用
因为Set是一个接口类,所以不能直接单独实例化,所以通常实现TreeSet或者HashSet(实现了Map接口的类)。
常用方法:
增加某个值,或某个集合:
boolean add(E e)
boolean addAll(Collection<? extends E> c)
import java.util.Set;
import java.util.TreeSet;
public class TestSet {
public static void main(String[] args) {
//通过TreeSet举例
Set<String> set = new TreeSet<>();
//增加
set.add("abc");
set.add("aaa");
set.add("abc");
System.out.println(set);
}
}
Set<String> set = new TreeSet<>();
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("aaa");
arrayList.add("abc");
arrayList.add("abc");
set.addAll(arrayList);
System.out.println(set);
删除:
boolean remove(Object o)
//增加
set.add("abc");
set.add("aaa");
set.add("abc");
System.out.println(set);
System.out.println(set.remove("aaa"));
System.out.println(set.remove("a"));
System.out.println(set);
转成数组:
Object[] toArray()
set.add("abc");
set.add("aaa");
System.out.println(set);
String[] arr = set.toArray(new String[0]);
System.out.println(arr[1]);
返回迭代器:
Iterator<E> iterator()
为什么Map没有这个方法,是因为Map没有继承于Collection,Collection是继承在Iterable下的。所以这就是为什么Map为什么有Set<Map.Entry<K, V>> entrySet()方法,就是为了转成Set好使用迭代器。for each底层是迭代器,所以上面打印的时候直接使用的是for each
set.add("abc");
set.add("aaa");
System.out.println(set);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
是否包含某个值,某个集合:
boolean contains(Object o)boolean containsAll(Collection<?> c)
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("aaa");
arrayList.add("abc");
//增加
set.add("abc");
set.add("aaa");
System.out.println(set);
System.out.println(set.contains("a"));
System.out.println(set.contains("aaa"));
System.out.println(set.containsAll(arrayList));
Map和Set的关系
Set的底层是Map,通过下面的源码可以知道。
有什么错误评论区指出,希望可以帮到你。