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. 正确理解volatile与happens-before

    1. 双重校验锁实现单例的问题 在延迟实现单例时,一般代码形式如下: public class Foo { private static volatile Foo instance; public s ...

  2. delphi 中封装的VCl窗体Tab键响应问题

    在DLL中的子窗体不会响应Tab按键的,这个时候就需要手动去指定Tab键的操作,但是前提是主窗体要向这个窗体发送一个消息,一个Tab键按下的消息.基本顺序是这样的: 1. 主窗体用Hook技术捕获Ta ...

  3. cxgrid取消过滤下拉框

    选择tableview1.optionscustomize.columnfiltering=fasle;

  4. layui中折叠面板的使用

    运用折叠面板后 可以让页面更加整洁 有什么不懂的可以留言 代码放到底部 需要引入的文件 JQuery代码: html代码 <div class="layui-colla-item&qu ...

  5. winfrom 右下角弹窗(渐渐消失)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 【Newtonsoft.Json.dll】操作列表JSON数据

    JObject data = JObject.Parse(json); JArray array = JArray.Parse(data["list"] + "" ...

  7. mvc - Authorize授权

    from : http://www.cnblogs.com/asks/p/4372783.html http://www.cnblogs.com/myindex/p/5479428.html

  8. 谈谈iOS开发如何写个人中心这类页面--静态tableView页面的编写

    本文来自 网易云社区 . 一.本文讲的是什么问题? 在开发 iOS 应用时,基本都会遇到个人中心.设置.详情信息等页面,这里截取了某应用的详情编辑页面和个人中心页面,如下: 我们以页面结构的角度考虑这 ...

  9. docker : RabbitMQ ElasticSearch

    docker  运行RabbitMQ容器 docker run -d -p 5672:5672 -p 15672:15672 --name 命名 CONTAINER ID 放出5672  /  156 ...

  10. [bzoj3714] [PA2014] Kuglarz(最小生成树)

    我们考虑这个题...思路比较神仙. 就是我们设\(sum[i]\)为前i个的区间里的情况,然后我们知道\(sum[j]\)的话,我们就可以知道\(j-i\)的情况了 所以说这很像最小生成树里面的约束条 ...