2017-10-31 22:05:59

  • Map

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

HashMap是基于散列表实现的,插入、删除和定位元素时间复杂度平均能达到O(1)。

TreeMap基于红黑树(一种自平衡二叉查找树)实现的,时间复杂度平均能达到O(log n)。

Map的数据结构针对键值有效和值无关。

*常用方法

   public static void main(String[] args) {
Map<String, String> map = new HashMap<String,String>(); //添加元素
//如果键是第一次存储,则返回null
//如果键不是第一次了,则替换旧的值,并返回旧的值
map.put("刘亦菲","20");
map.put("章子怡", "22");
map.put("田馥甄", "24");
map.put("陈绮贞","22"); //remove(key),根据键值进行删除,返回值,如果不存在,返回null
map.remove("章子怡"); //containsKey()
map.containsKey("刘亦菲"); //get(key)根据键得到值,如果没有返回null
System.out.println(map.get("刘亦菲")); //keySet(),获取所有键值组成的集合
Set<String> set = map.keySet();
for(String s:set)
{
System.out.println(s+" ");
} //values,获取所有值组成的集合
Collection<String> collection= map.values();
for(String s:collection) System.out.println(s); //输出
System.out.println(map);
}

Map集合的遍历:

A:首先获得所有的键的集合,通过键的集合来获取值;

B:直接获得键值对的集合

public class MapDemo2 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String,String>(); //添加元素
//如果键是第一次存储,则返回null
//如果键不是第一次了,则替换旧的值,并返回旧的值
map.put("刘亦菲","20");
map.put("章子怡", "22");
map.put("田馥甄", "24");
map.put("陈绮贞","22"); //遍历方法1:通过键来找值
Set<String> set= map.keySet();
for(String s:set) {
String value= map.get(s);
System.out.println(s+"="+value);
} //遍历方法2:直接得到键值对的集合
Set<Map.Entry<String,String>> set2 = map.entrySet();
for(Map.Entry<String,String> m:set2){
System.out.println(m.getKey()+"="+m.getValue());
} }
}

Map的三个子类实现:

          HashMap

          LinkedHashMap

          TreeMap

~ HashMap

HashMap:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

注意,此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。

注意:HashMap底层依赖hashcode和equals,在键值为对象的时候需要重写这两个方法,这两个方法都可以通过右键直接生成。

*构造方法

*常用方法

public class MapDemo2 {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String,String>(); //添加元素
//如果键是第一次存储,则返回null
//如果键不是第一次了,则替换旧的值,并返回旧的值
map.put("刘亦菲","20");
map.put("章子怡", "22");
map.put("田馥甄", "24");
map.put("陈绮贞","22"); //遍历方法1:通过键来找值
Set<String> set= map.keySet();
for(String s:set) {
String value= map.get(s);
System.out.println(s+"="+value);
} //遍历方法2:直接得到键值对的集合
Set<Map.Entry<String,String>> set2 = map.entrySet();
for(Map.Entry<String,String> m:set2){
System.out.println(m.getKey()+"="+m.getValue());
} }
}

~ LinkedHashMap

LinkedHashMap:是Map接口的哈系表和链表的实现,具有可预知的迭代顺序。

用法和HashMap完全一致。

public class MapDemo2 {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<String,String>(); //添加元素
//如果键是第一次存储,则返回null
//如果键不是第一次了,则替换旧的值,并返回旧的值
map.put("刘亦菲","20");
map.put("章子怡", "22");
map.put("田馥甄", "24");
map.put("陈绮贞","22"); //遍历方法1:通过键来找值
Set<String> set= map.keySet();
for(String s:set) {
String value= map.get(s);
System.out.println(s+"="+value);
} //遍历方法2:直接得到键值对的集合
Set<Map.Entry<String,String>> set2 = map.entrySet();
for(Map.Entry<String,String> m:set2){
System.out.println(m.getKey()+"="+m.getValue());
} }
}

~ TreeMap

TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

此实现为 containsKeygetputremove 操作提供受保证的 log(n) 时间开销。这些算法是 Cormen、Leiserson 和 Rivest 的 Introduction to Algorithms 中的算法的改编。

注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。

注意:类为键值的话需要注意,如果是无参构造,则类需要实现Comparable接口;或者使用带比较器的构造方法。

public class Demo3 {
public static void main(String[] args) {
TreeMap<Student,String> treeMap = new TreeMap<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 主要条件,这样的话是递增排序
int num = o1.getAge() - o2.getAge(); // 次要条件
int num2 = num==0?o1.getName().compareTo(o2.getName()):num;
return num2; }
}); Student s1 = new Student("刘亦菲", 29);
Student s2 = new Student("章子怡", 25);
Student s3 = new Student("刘亦菲", 28); treeMap.put(s1,"01");
treeMap.put(s2,"02");
treeMap.put(s3,"03"); Set<Student> set= treeMap.keySet();
for(Student s:set) {
String value= treeMap.get(s);
System.out.println(s+"="+value);
} }
}

~ Hashtable 和 HashMap 的区别

Hashtable:线程安全,效率低。不允许null键和null值;(显然这养的命名是不规范的,但是由于其出现太早,改的话很不方便,于是就没有修改)

HashMap:线程不安全,效率高。允许null键和null值;(是用来替代Hashtable的)

Java 集合-Map接口和三个子类实现的更多相关文章

  1. Java 集合-List接口和三个子类实现

    List List:有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素.与 ...

  2. Java 集合-Set接口和三个子类实现

    2017-10-31 19:20:45 Set 一个不包含重复元素的 collection.无序且唯一. HashSet LinkedHashSet TreeSet HashSet是使用哈希表(has ...

  3. Java集合Map接口与Map.Entry学习

    Java集合Map接口与Map.Entry学习 Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs).该接口描述了从不重复的键到值的映射. (1) ...

  4. Java集合——Map接口

    1.定义 Map用于保存存在映射关系<key,value>的数据.其中,key值不能重复(使用equals()方法比较),value值可以重复 2.方法 V  put(key,value) ...

  5. Java集合-Map接口相关操作方法

    Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs). 该接口描述了从不重复的键到值的映射. (1) 添加.删除操作: Object put(Ob ...

  6. Java之Map接口(双列集合)

    Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...

  7. Java 之 Map 接口

    一.Map 接口概述 java.util.Map 接口专门用来存放键值对这种对象关系的对象. 下面比较一下 Collection 与 Map 的区别: Collection 中的集合,元素是孤立存在的 ...

  8. JAVA ,Map接口 ,迭代器Iterator

    1.    Map 接口概述 java.util.Map 接口描述了映射结构, Map 接口允许以键集.值集合或键 - 值映射关系集的形式查看某个映射的内容. Java 自带了各种 Map 类. 这些 ...

  9. Java Core - Map接口

    Map:是一组映射The java.util.Map interface represents a mapping between a key and a value. The Map interfa ...

随机推荐

  1. rest_framework之解析器详解 05

    解析器就是服务端写api,对于前端用户发来的数据进行解析.解析完之后拿到自己能用数据. 本质就是对请求体中的数据进行解析. django的解析器 post请求过来之后,django 的request. ...

  2. javascript飞机大战-----003创建英雄机

    /* 英雄机:因为英雄机只有一辆所以不需要用构造函数 */ var Hero = { //初始图片 self:null, //初始left left:0, //初始top top:0, //生命值 l ...

  3. Linux创建Python虚拟环境

    Linux创建Python虚拟环境 安装 pip install virtualenv 基本使用 为一个工程创建一个虚拟环境: $ cd my_project $ virtualenv venv #v ...

  4. Xshell配置ssh免密码登录-密钥公钥(Public key)

    1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步: 1 ...

  5. Css-常用css

    /*怪异盒子模型*/ .box { box-sizing: border-box; } /*水平居中的内联块级*/ .inBlock { display: inline-block; vertical ...

  6. 容斥原理解决某个区间[1,n]闭区间与m互质数数量问题

    首先贴出代码(闭区间[1,n]范围内和m互质的数) 代码: int solve(II n,II m){ vector<II>p; ;i*i<=m;i++){ ){ p.push_ba ...

  7. ora-28056错误解决

    问题描述:今天有同事找我,说是oracle数据库的监听器出现问题,我连接服务器查看后,发现不是监听器问题,而是进程连接数已经达到150个了,客户端连接不上服务器,因其是测试服务器,重启服务器后再次sq ...

  8. G.Finding the Radius for an Inserted Circle 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

    地址:https://nanti.jisuanke.com/t/17314 题目: Three circles C_{a}C​a​​, C_{b}C​b​​, and C_{c}C​c​​, all ...

  9. echarts页面中多图自适应

    $(function (){ //ups部分 var myChart = echarts.init(document.getElementById('result')) var option = { ...

  10. Java实现动态规划法求解0/1背包问题

    摘要: 使用动态规划法求解0/1背包问题. 难度: 初级 0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进 ...