Java基础之map总结
map的基础理解
话不多说,先上图,可以这样简单的对容器中的map进行分类:
我们在Java开发中,除了最常用的基本数据类型和String对象之外,也会经常用到集合类。集合类中存放的都是对象的引用,而非对象本身,为了语言上的便利,我们暂且把集合中的对象默认为集合中对象的引用。
集合只用于存储对象,集合的长度是可变的,集合中可以存储不同数据类型的对象。集合类可以分为两大类,一类是Collection,另外一类是Map。
讲到这里,有一个小插曲要说一下。
严格意义上讲,map并不是一个集合。 而是两个集合之间的的映射关系,因为它并没有继承Collection接口也没有继承Iterable接口,但是map可以存储数据,每次存储集合A中的一个值和与之对应的集合B中的一个值,所以我们还是习惯上把map称之为集合。所以这也是为什么不能对map进行for-each操作了,但是我们可以对key集合、value集合和entry集合进行迭代操作。
Map集合与Set集合元素的存储形式很像,如Set接口下有HashSet、LinkedHashSet、SortedSet(接口)、TreeSet、EnumSet等实现类和子接口,而Map接口下则有HashMap、LinkedHashMap、SortedMap(接口)、TreeMap、EnumMap等实现类和子接口。
Map有时也称为字典,或关联数组。
Map中包括一个内部类:Entry。该类封装了一个key-value对,Entry包含三个方法:
Object getkey():返回该Entry里包含的key值。
Object getValue():返回该Entry里包含的value值。
Object setValue():设置该Entry里包含的value值,并返回新设置的value值。
可以把Map理解成一个特殊的Set,只是该Set里包含的集合元素是Entry对象,而不是普通对象。
Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图:
Set keyset():返回map中所有key的一个set视图
Collection values():返回map中所有value的一个Collection视图
Set<map.entry<k,v>> entrySet():返回map中所有映射的一个集合视图
这里用一些简单的示例对上面的话做一下解释:public static void main(String[] args) {//new的是map的子类,并定义key、value的数据类型HashMap<String, String> map = new HashMap<>();map.put("北京","安河桥北");map.put("上海","虹桥机场");map.put("广州","嘉禾望岗");map.put("深圳","翻身");System.out.println(map);//此时直接打印结果:{上海=虹桥机场, 广州=嘉禾望岗, 北京=安河桥北, 深圳=翻身}//迭代所有的key组成的集合Set<String> keySet = map.keySet();for (String s : keySet) {System.out.println(s);}//迭代所有的value组成的集合Collection<String> values = map.values();for (String value : values) {System.out.println(value);}//迭代所有的entry对象Set<Map.Entry<String, String>> entrySet = map.entrySet();//entrySet的数据类型是Set,泛型是 Map.Entry<String, String>for (Map.Entry<String, String> entry : entrySet) {String key = entry.getKey();// 获取此时 entry 的keyString value = entry.getValue();// 获取此时 entry 的valueSystem.out.println(key+":"+value);// 把每个键值对打印出来entry.setValue("?"); // 修改map中的value值,在for循环之外查看更新后的value}System.out.println(map.get("北京"));// 打印结果:?System.out.println(map.get("上海"));// 打印结果:?System.out.println(map.get("广州"));// 打印结果:?System.out.println(map.get("深圳"));// 打印结果:?}
注意: 1.map集合不允许key重复,其value值可以重复。2.map本身是一个接口,不能通过new一个map实现对象的初始化,常见的形式为:Map<Key,Value> mapName = new HashMap<Key,Value>();常见的实现类有:HashMap、LinkedHashMap、HashTabel、TreeMap等3.map里存储的是引用类型的对象,所以键值对key-value都是引用类型(基本类型的包装类)4.map中用到的数据结构都是应用在“键”上的5.根据key获取value,当key不存在时,获取到的value为null6.put方法,存入已有的key时,会新值覆盖旧值
map常用方法:
- void clear( ) 清空map中所有键值对,没有返回值
- Object remove(Object key) 删除指定key的键值对映射,并返回key对应的value值
- boolean remove(Object Key,Object Value) 删除指定key-value键值对,并返回是否删除成功的 boolean 值
- Object put(Object k, Object v) 将指定键值对存入map,返回null;如果指定key已经存在,则新值覆盖旧值,并返回旧值
- void putAll(Map m) 将指定map中的所有键值对存入新的map中,并去重(新值覆盖旧值)
- int size( ) 返回map中键值对的个数
- boolean isEmpty( ) 判断map是否为空,为空则返回 true,不为空则返回 false
- boolean containsKey(Object key) 判断map中是否存在指定key,并返回一个 boolean 值
- boolean containsValue(Object value) 判断map中是否存在指定value,并返回一个boolean值
- Object get(Object k) 根据指定key获取map中的value值,如果不存在指定key,则返回null
- int hashCode( ) 返回指定键或值的哈希码值
map的四种遍历方法
Map集合不能直接遍历,只能通过某种方式转换为“Set集合”进行遍历。
方法一:先获取所有key,通过key获取value
for (String key : map.keySet()) {System.out.println("key= "+ key + " and value= " + map.get(key));}方法二:不获取key,直接获取所有value
for (String value : map.values()) {System.out.println("value= " + value);}方法三:通过entry对象获取key、value
for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println("key= " + entry.getKey() + " value= " + entry.getValue());}方法四:通过entry对象获取一个迭代器对象,然后利用迭代器的方法进行遍历
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry<String, String> entry = it.next();System.out.println("key= " + entry.getKey() + " value= " + entry.getValue());}
上面第四种方法提到了 Iterator (迭代器),这里我们简单讲讲迭代器,其中的细节以后再讲
迭代器(Iterator)模式,又叫做游标模式,它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。
简单的说,迭代器就是一个接口Iterator,实现该接口的类就叫做可迭代类,这些类多数时候指的就是java.util包下的集合类
迭代器就是专门取出集合元素的对象,但是该对象比较特殊,不能直接创建对象(通过new),该对象是以内部类的形式存在于每个集合类的内部。Collection接口中定义了获取集合类迭代器的方法(iterator()),所以所有的Collection体系集合都可以获取自身的迭代器。
示例:
public class RunoobTest {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<Integer>();numbers.add(12);numbers.add(8);numbers.add(2);numbers.add(23);Iterator<Integer> it = numbers.iterator();while(it.hasNext()) {Integer i = it.next();if(i < 10) { it.remove(); // 删除小于 10 的元素}}System.out.println(numbers);}
}输出结果:[12, 23]通过iterator()方法获取一个迭代器对象
hasNext() 该方法用于判断集合中是否还有元素
next() 该方法获取集合中的元素值
remove() 该方法删除当前迭代器的元素值
Java基础之map总结相关推荐
- Java基础——常用Map的实现细节
2019独角兽企业重金招聘Python工程师标准>>> Java基础--Map HashMap 数据结构: 数组 + 单链表 transient Entry[] table; // ...
- 【CXY】JAVA基础 之 Map
概述: 1.键值对,key-value,具有映射关系的数据 2.Map的key不允许重复,value可以重复 3.Map里的key类似一个Set,甚至可以通过map.keySet()拿到key的Set ...
- [Java基础]让Map value自增
需求:我要在map中判断是否存在key,存在则让key对应的value = value+1,否则设置<key,value=1> 代码实现方式如下: ContainsKey import j ...
- 【java基础】Map数据的存进和取出的顺序相同
Map数据的存进和取出的顺序相同,需要用到linkedHashMap结构,如下所示: import java.util.HashMap; import java.util.LinkedHashMap; ...
- java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机;
文章目录 前言 一.map 遍历方法 二.java正则学习 三.后端传到前端图片三种情况 1. 图片流数据(InputStream) 转 base64,前端展示保存 a. 后端:输入流转base,直接 ...
- Java基础之Map集合
Map集合: 1.Map集合与Collection集合的区别: 1.Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储. 2.Map中的集合1,元素是成对存在的, ...
- Java基础之Map类
Map类 Map 键(key)值(value)对形式 interface Map<K, V> class HashMap<K, V>哈希表结构 class Tree M ...
- 【java基础】map的基本使用与字符串中每个字符出现的次数统计
Map集合概述和特点 Map集合概述 interface Map<K,V> K:键的类型:V:值的类型 Map集合的特点 键值对映射关系 一个键对应一个值 键不能重复,值可以重复 元素存取 ...
- 回忆Java基础中Map的遍历方法
转自http://blog.163.com/fw_long/blog/static/51771186201392982041337/ keySet是键的集合,Set里面的类型即key的类型 entry ...
最新文章
- 只想多吃,而不考虑能吃掉多少——如何恰到好处的按需进度规划?
- feedback from waic
- 容器学习 之 本地镜像与共有镜像(十)
- java对象头_我的并发编程(二):java对象头以及synchronized升级过程
- RTX5 | 内存池02 - 剩下几个API
- pythonpy文件打包成exe软件
- OAUI前台设计(二)
- markdown编辑器Typora的使用方法(保姆级教程)
- 图片批量转换成jpg格式的方法!
- Python values()函数用法
- 带有图形界面的通用趋势
- 几个 ICON 图标 网站
- Unreal Engine 4 —— Smear Frame效果的实现与分析
- 应用程序正常初始化(0xc0000005)失败
- shell wait 等待命令
- 用python在前程无忧高效投递简历
- 【学习笔记】VGG 网络结构
- ideagit更新一个文件_IDEA 配置 Git,GitHub, 获取项目, 更新项目 (Windows 版本)
- 选题五 篮球24秒计时
- a problem occurred with this webpage so it was reloaded问题研究