1:Map接口.

Collection体系中存储的是单个元素,单身汉,而Map中存储的是2个元素,存储的是成对的元素。

    Map和Collection是没有联系的!!不要以为Map是Collection的一种或者Collection是Map的一种

1.1:特点

Map存储的是键值对,然而并不是所有键的数据类型都可以做为Map的键,只有引用数据类型才可以做键,基本数据类型是不能作为键的,键不能重复,值可以重复。

1.2:HashMap:底层是用哈希表来保证键的唯一性。方法跟Map接口中的方法是一样的。如果HashMap的键为自定义数据类型,那么这个类型也必须重写hashCode()和equals方法。来告诉HashMap如何去除重复元素。

 package com.java.domai;

 public class Student implements Comparable<Student>{
private String Ename;
private String Cname;
private int age;
private String sex;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String ename, String cname, int age, String sex) {
super();
Ename = ename;
Cname = cname;
this.age = age;
this.sex = sex;
}
public Student(String cname, int age, String sex) {
super();
Cname = cname;
this.age = age;
this.sex = sex;
} //...省略get和set方法 @Override
public String toString() {
return "Student [Cname=" + Cname + ", age=" + age
+ ", sex=" + sex + "]";
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return age - o.age;
// return Cname.compareTo(o.Cname);
} }

1.3:TreeMap:底层是用红黑树(二叉树)来保证键的唯一性,和对键进行排序。排序:如果返回值>0,则传入的数据放在右边

TreeMap的键的对象必须实现Comparable接口,重写compareTo方法。或者让TreeMap具有可比性,可以传一个比较器给集合。

 package com.java.treemap;

 import java.util.Comparator;
import java.util.TreeMap; import com.java.domai.Student; /*
* 需求:创建TreeMap集合,键为学生对象:学生:姓名,年龄,性别。,值为学生的地址,,放几个学生对象到TreeMap集合中
* 再遍历集合。
*/
public class TreeMapDemo3 {
public static void main(String[] args) {
TreeMap<Student, String> map = new TreeMap<Student, String>();
map.put(new Student("aa", 20, "男"), "广州");
map.put(new Student("aa", 20, "男"), "北京");
map.put(new Student("cp", 22, "男"), "上海");
map.put(new Student("cc", 22, "女"), "上海");
map.put(new Student("dd", 23, "男"), "深圳");
//System.out.println(map);
// 以名字来进行排序 TreeMap<Student, String> map2 = new TreeMap<Student, String>(new Comparator<Student>() { @Override
public int compare(Student o1, Student o2) {
return o1.getCname().compareTo(o2.getCname());
}
}); map2.put(new Student("aa", 20, "男"), "广州");
map2.put(new Student("aa", 22, "女"), "广州");
map2.put(new Student("bb", 25, "男"), "北京");
map2.put(new Student("cp", 22, "男"), "上海");
map2.put(new Student("cc", 22, "女"), "上海");
map2.put(new Student("dd", 23, "男"), "深圳");
System.out.println(map2);
} }

1.4:HashTable:底层都是哈希表来保证键的唯一性。

跟HashMap区别

1:HashMap的键和值可以为null,而HashTable的键和值不能为null.

2:HashMap不是同步的,而HashTable是同步的。所以建议用HashMap.

1.5:Properties:键和值都是String。主要用于配置文件

   1.6:Map的遍历可以通过迭代器遍历:

      

Map<String, String> map = new HashMap<String, String>();
map.put("2012254101", "zjw");
map.put("2012254102", "jjl");
map.put("2012254103", "ywc");
map.put("2012254104", "tj"); Set<String> set = map.keySet();//获取键的Set集合,set和Map的键一样是不能重复的
Iterator<String> it = set.iterator();
while(it.hasNext()){
String key = it.next();
String name = map.get(key);
System.out.println(key+" : "+name);
}

2.个人掌握了解Map和Collection混合用法的例子

 package com.java.map;
好开心
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set; import com.java.domai.Student;//上面的Student类
public class CopyOfHashMapDemo1 {
public static void main(String[] args) {
/*
* 键就是对象的属性。值就是对象的属性值
* 一个对象用一个Map类表示
* 然后将这个Map装进一个集合里面
*/
/*
*这个List中泛型的数据类型是一个Map类型,做着做着发现后面不用list
*而泛型Map的键第是班级Map<String, String>,值是学生列表List<Student>
*/ List<Map<Map<String,String>, List<Student>>> schoolList = new ArrayList<Map<Map<String,String>, List<Student>>>(); //用这个Map保存班级信息,key=class;value=班级
Map<String, String> classMap1 = new HashMap<String, String>();
classMap1.put("class", "Java");
Map<String, String> classMap2 = new HashMap<String, String>();
classMap2.put("class", "IOS"); //创建两个学生集合吧
List<Student> list1 = new ArrayList<Student>();
list1.add(new Student("zjx", 34, "nan"));
list1.add(new Student("zjx1", 32, "nan"));
list1.add(new Student("zjx2", 12, "nan"));
//创建两个学生集合吧
List<Student> list2 = new ArrayList<Student>();
list2.add(new Student("dell", 34, "nan"));
list2.add(new Student("dell1", 32, "nan"));
list2.add(new Student("dell2", 12, "nan")); //将班级map和学生list放到一个集合里,键是map,值是list。这个看起来很搞怪
Map<Map<String, String>, List<Student>> map = new HashMap<Map<String,String>, List<Student>>();
map.put(classMap1, list1);
map.put(classMap2, list2); //开始获取key了
//keyset:中文就是键的set了,用来保存key的一个set结合。
//由于key在Map中是唯一的、不重复的,而Set保存的是不重复的元素,那就配合刚好
//key的类型是Map<String, String>,所以Set的泛型类型也要这样
Set<Map<String, String>> set = map.keySet();
//可以直接打印看看
//System.out.println(set);
//要开始用迭代器了,迭代的泛型类型和set的一样
Iterator<Map<String, String>> it = set.iterator();
//遍历
while(it.hasNext()){//如果有下个 话。。。
//获取了Map类型的键了
Map<String, String> key = it.next();
//key既然是个Map,那么它里面就还有键值对咯,没错,就是班级的键值对
String key2 = key.get("class");
System.out.println(key2);
//通过键来获取值吧,值是list类型的,是从最大的那个Map获取,就是List所在的那个Map
List<Student> stuList = map.get(key);
//得到List了可以遍历list,遍历的方式自己喜欢咯
//先迭代试试
Iterator<Student> it2 = stuList.iterator();
while(it2.hasNext()){
Student stu = it2.next();
System.out.println("\t"+stu);
}
System.out.println("+++++++++++++");
//也可以普通for循环遍历啊
/*for(int i=0; i<stuList.size(); i++){
Student stu = stuList.get(i);
System.out.println("\t"+stu);
}*/
System.out.println("+++++++++++++");
//还可以增强for循环
/*for (Student student : stuList) {
System.out.println("\t"+student);
}*/
//System.out.println(key+" : "+stuList);
}
/*
* ok 了,终于大功告成,虽然过程很绕,
* 但是我基本上明白了Map 的添加数据,添加不同类型的数据作为键和值
* 明白了怎样去使用迭代器去Map中的值,
* 知道了迭代器中的泛型类型是和使用迭代方法的集合的泛型类型是一样的
* 了解了几种循环遍历的方式,以及处理了繁杂的循环和取值
* 我觉得我之前不理解的就是用Map作为键去取值,其实和普通的取值方式一样的了,就是个类型不同
* Map<String, String>:键中有键,
*
*
*/ } }

对Map的一些总结的更多相关文章

  1. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  6. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  7. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

  8. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  9. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

  10. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

随机推荐

  1. 多线程的那点儿事(之windows锁)

    在windows系统中,系统本身为我们提供了很多锁.通过这些锁的使用,一方面可以加强我们对锁的认识,另外一方面可以提高代码的性能和健壮性.常用的锁以下四种:临界区,互斥量,信号量,event. (1) ...

  2. Activity Fragment转场动画

    Activity转场动画 先介绍个动画的好例子:https://github.com/lgvalle/Material-Animations Activity的转场动画是通过overridePendi ...

  3. ListControl的用法

    ListControl 控件可在窗体中管理和显示列 表项.可控制列表内容的显示方式,能够以图标和表格的形式显示数据.打开ListControl控件的属性窗口,在Styles选项卡中的View属性中 可 ...

  4. static 静态类

    C# 编译器对静态类进行了如下限制. 1. 静态类必须直接从System.Object派生,从其他任何基类生都没有意义,继承只适用于对象,而你不能创建静态类的实例. 2. 静态类不能实现任何接口,这是 ...

  5. bitnami openedx安装的各种坑及痛苦经历

    那天在华为网站上学习,看见他们的培训系统挺不错的,看到下边写着openedx,百度了一下是个开源软件,挺流行的,在这之前对于openedx没有任何了解,然后开始了一周多的痛苦经历. 首先在opened ...

  6. WPF 实现INotifyPropertyChanged .Net Framework 4.5

    自己动手写了一个基类来实现INotifyPropertyChanged接口,以后可以直接使用. using System.ComponentModel; using System.Runtime.Co ...

  7. 201621123012 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集 ...

  8. react学习之路-配制antd-mobile

    经过将近三个月的使用,现在终于在我老大的带领下做完了一个react的项目,感觉还可以,最大的不足就是,对于react中的很多的东西都是掺杂着jq使用来做的,这是最不满意的一点吧,但是开发进度很近,只能 ...

  9. react.js学习之路六

    学习react中,我一直认为,总组件里面才有构造函数,但是我才发现我的观点是错误的,构造函数是可以出现在子组件里面的. 今天有一个错误是点击增加/减少input框里面 的数值 我一直在寻找input框 ...

  10. 洛谷P5158 【模板】多项式快速插值

    题面 传送门 前置芝士 拉格朗日插值,多项式多点求值 题解 首先根据拉格朗日插值公式我们可以暴力\(O(n^2)\)插出这个多项式,然而这显然是\(gg\)的 那么看看怎么优化,先来看一看拉格朗日插值 ...