Map
Map集合是一种双列集合,每个键值对包含两个元素,所以又称为键值对集合
特点:
- 由键决定的
- 无序,不重复,无索引的,值不做要求
- 后面重复的键对应的值会覆盖前面重复键的值
- 键值对都可以为null
Map集合实现类特点:
- HashMap:无序,不重复,无索引,值不做要求
- LinkedHashMap:元素按照键是,有序,不重复,无索引,值不做要求
- TreeMap:排序,不重复,无索引
Map集合ApI
API | 功能 |
---|---|
Map<String,Integer> maps=new HashMap<>(); | 集合的创建 |
maps.put(“iphonex”,10) | 添加元素,无序,不重复,无索引 |
maps.clear() | 清空集合 |
maps.isEmpty() | 判断是否为空 |
Integer key=maps.get(“iphonex”) | 根据键获取对应的值 |
maps.remove(“iphonex”) | 根据键删除整个值 |
maps.containskey(“哇哇哇”) | 判断是否包含某个键 |
maps.containsValue(10) | 判断是否包含某个值 |
Set sets=maps.keyset() | 获取全部键的集合 |
Collection values=maps.values(); | 获取所有值的集合 |
maps.size() | 集合的大小 |
map1.putAll(map2) | 把集合map2的元素拷贝到map1中去 |
Map集合的遍历
-
键找值:先拿到集合的全部键
Set<String> keys=maps.keySet(); for(String key:keys){//遍历set集合,提取键/值 int value=maps.get(key); System.out.printfln(value); }
-
键值对
- 把Map集合转换成Set集合
先把Map集合转换成Set集合,Set集合中每个元素都是键值对实体类型了,遍历set集合,提取键以及提取值。
maps={yang=1000,手表=10,娃娃=30}
使用foreach遍历map集合,发现Map集合的键值对元素直接是没有类型的,所以不可以直接使用foreach遍历集合。可以通过调用Map的方法entryset把Map集合转换成Set集合形式
Set<Map.Entry<String,Integer>> entries=maps.entrySet();
Map.Entry迭代器会生成EntryIterator,返回的实例是一个包含key/value键值对的对象。Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。他表示Map中的一个实体(含有一个key,一个value键值对),接口中有getKey(),getValue()方法。
- 开始遍历
for(Map.Entry<String,Integer> entry:entries ){ String key =entry.getKey(); int value=entry.getValue(); System.out.println(key+" "+value); }
-
Lambda表达式
maps.forEach((k,v)->{System.out.println(k+"---->"+v);});
其扩展形式为
maps.forEach(new BiConsumer<String,Integer>(){ @Override public void accept(String key,Integer value){ System.out.println(key+"-->"+value); } })
HashMap的特点和底层原理
- 由键决定:无序,不重复,无索引。HashMap底层是哈希表结构的
- 依赖hashCode方法和equals方法保证键的唯一
- 底层原理:
- Hashmap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已,实际上,Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。
- 可以依赖hashCode方法和equals方法保证键的唯一,若键要存储的是自定义对象需要重写hashCode和equals方法。
LinkedHashMap集合
-
由键决定:有序,不重复,无索引
-
底层原理:
- 依然是哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序
TreeMap集合
- 特点:不重复,无索引,可排序
- 可排序:按照键数据大小默认升序排序。只能对键排序。
- TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序。
- TreeMap跟TreeSet一样底层原理是一样的
使用TreeMap集合自定义排序规则:
-
类实现Comparable接口,重写比较规则
-
集合自定义Comparator比较器对象,重写比较规则
Map<Apple,String> maps2=new TreeMap<>(new Comparator<Apple>(){ @Override public int compare(Apple o1,Apple o2){ return Double.compare(o2.getPrice(),o1.getPrice()); } })
不可变集合
为什么要创建不可变集合?
如何创建不可变集合?
在list,set,map接口中,都存在of方法,可以创建一个不可变集合
Static<E> list<E> of(E...elements);//创建一个具有指定元素的list集合对象 Static<E> Set<E> of(E...elements);//创建一个具有指定元素的Set集合对象 Static<E> Map<K,V> of(E...elements);//创建一个具有指定元素的Map集合对象
不可变集合的特点:
定义完成后不可以修改,或者添加或者删除