映射==> 一一对应
-->java.util.Map接口
单列集合Collection中的集合==> 元素是孤立存在的,元素采取单独存储方式
双列集合Map中的集合==> 元素是承兑存在的,每个元素有键与值两部分组成-->可以通过键找对应的值(key-value)
Map的集合
不能包含重复的键
,
值可以重复
,但是键只能对应一个值
Map集合
Map接口常用方法
void clear()
==> 删除Map对象中所有key-value对
boolean
containsKey
(Object key) ==>查询Map中是否包含指定key包含,返回true
boolean
containValue
(Object value)==> 查询Map是否包含一个或者多个value
Set entrySet() ==> 返回Map中所包含Set-value对应的Set集合,每个集合元素都是Map.Entry(Enty是Map的内部类)对象
boolean isEmpty() ==> 查询
public V put(K key,V value)
==>指定的键与指定的值添加到Map集合中
相同的键不存储,值覆盖 -->如果没有产生覆盖的效果,返回值null,如果产生了覆盖的效果,那么返回值就是被覆盖的值
public V remove(Object key)
==>指定的键和所对应的键值,在Map集合中删除,返回被删除元素的值 --》 根据键删除值
public C values() ==> 返回值
public int size() ==> 长度
public V get (Object key)
==>根据指定的键,在Map集合中获取对应的值
public Set<K> keySet()
==>获取Map集合中所有的键,存储到Set集合中
public Set<Map.Entry<K,V>> entrySet()
==>获取到Map集合中所有的键值对对象的集合(Set)
遍历键找值方式
(Map集合
没有iterator方法)
1.Set<K> keySet(); --> 获取Map中所有键==>返回
一个Set集合存储
所有的键
2.遍历键的Set集合
3.根据键,获取键所对应的值
(后期用的比较多)
Set<String> keySet =
map.keySet
();// 获取所有键的集合
迭代器遍历
Iterator<String> it = keySet.iterator();//Set集合即具有迭代器,调用迭代器
while(it.hasNext()){
//
String key = it.next(); //获取每一个键
Integer value = map.get(key); //根据键获取值
sout(key + "==" +value);
}
增强for循环
for(String key : map.keySet()-->所有键的集合){
sout(key + map.get(key));
}
Entry
key和value在Map中是一一对应关系,被
称作Map中的一个Entry项
Entry将键值对的对应关系,
封装成了对象,即键值对对象
方法:
public K getKey();==> 获取Entry对象的键
public V getValue==> 获取Entry对象的值
Object setValue(V value) ==> 设置该Entry里包含的value值,放回新设置的value
public Set<
Map.Entry<K,V>
> entrySet()==> 获取Map集合中所有键值对对象的集合
Map.Entry<K,V> ==> Entry<K,V>是Map内部接口(将键和值封装成了Entry对象,存储在Set中)
遍历键值对
1.获取集合中所有键值对对象,以Set几何形式返回 ==> entrySet()
2.遍历包含键值对(Entry)对象的Set集合,得到每一个键值对对象
3.通过键值对对象,获取entry对象中的键与值 ==> getkey()/getValue()
JDK9对集合添加的优化
1:of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如 HashSet,ArrayList等待;
2:返回的集合是不可变的;
Map常用的子类
HashMap<K,V> ==> 存储数据采用的哈希表结构,元素的存取顺序
不能保证
一致,由于要保证键的唯一,不重复,
需要重写hashCode方法,equals方法
其子类--> LinkedHashMap<K,V> ==> 存储数据采用
哈希表结构和链表结构
, 通过链表结构
保证元素存取顺序一致
,通过哈希表结构可以保证键的唯一/不重复,需要重写hashCode/equals方法
tips: 两个泛型在使用时,要为两个泛型富裕数据类型,可以相同也可以不同
Hashtable 和 HashMap区别
都是哈希算法,都是双列集合
1.Hashtable 线程安全,效率低,jdk1.0版本,HashMap线程不安全,效率高,jdk1.2版本
2.Hashtable不允许使用null作为key和value,HashMap允许
--(HashMap只允许一项key-value的key值为null,但可以有无数多项key-value的value为null)--
两者判断value相等标准: 两个key通过equals方法比较返回true,两个key的hashCode值也相等
jdk9新特性
--> 在list、set、map接口提供了静态of方法,可以直接创建带有少量元素的集合
--> 在以上接口的实现类中没有此方法
--> 通过这个of方法创建出来的集合是不可修改的(比如不能往集合中添加元素)
Properties是Hashtable子类:...
bug
--> 本意指虫子,在计算机世界中,指出现问题
--> debug解决bug
--> 断点 -> 让程序在运行的时候停下来
如何加断电:哪一行停下来,就在哪一行单击;
SortedMap接口和TreeMap
Map接口派生子接口SortedMap,TreeMap实现类-->基于红黑树对TreeMap中所有key排序,保证key-value处于有序状态
排序方式
1.自然排序: TreeMap所有key必须实现Comparable接口,key应是同一类的对象,否咋ClassCaseException异常
2,定制排序: 创建TreeMap时,传入Comparator对象,负责对TreeMap中所有key排序,采用地址顺序不要求Map实现Comparable接口
TreeMap判断key相等的标准:key通过equals比较返回true,通过compareTo返回0
--(自定义类作为key时,应重写equals和compareTo方法返回结果一直)--
其他实现类
WeakHashMap ==> 与HashMap用法基本一致,区别在于,HashMap的key保留对实际对象的强引用,即,只要该HashMap对象不被销毁,其hey所引用对象不会被垃圾回收,,,但WeakHashMap只保留弱引用,这意味着该HashMap对象可能被垃圾回收,也可能被自动删除
IdentityHashMap ==> 在两个key相等时比较独特,当且仅当两个key严格相等,该类才认为两个key相等
EnumMap ==> 与枚举类以其使用的Map实现
所有Map实现类都重写了toString方法
方法