【Java基础】Map集合简介 排序的集合TreeMap

来源:互联网 发布:大数据公司盈利模式 编辑:程序博客网 时间:2024/05/17 06:06

【声明】我不会一步一步带您剖析原理(大牛很多如果深入讲解也轮不到我 (*^__^*) 嘻嘻……),只会总结可用好用的与您分享

Java中的Map集合简介

    

  1 -- Map集合的基本特点Map集合 该集合存储键值对是一对一对往里存,而且要保证键的唯一性

  2 -- Map集合有三个小弟 两个常见


|-- 2.1HashTable
  
底层是哈希表数据结构不可以存入 null作为键,null作为值出现,该集合是线程同步JDK1.0 效率低
  
|--
2.2HashMap
  
底层是哈希表数据结构,并允许是null键null值,该集合是不同步的JDK 1.2 效率高
  
|-- 2.
3TreeMap
  
底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键进行排序和Set
很像,其实Set集合底层使用了Map集合


3 -- Map集合常用方法

<span style="white-space:pre"></span>//创建Map集合Map<String> map = new HashMap<String>();//向Map集合中添加元素map.put("01", "lilei");map.put(null,"lili");map.put("02",null);// 根据键判断Map集合是否包含某个元素System.out.println(map.containsKey("01"));// 根据键删除某个元素System.out.println("remove:" + map.remove("01"));// 根据键获取集合中的某个元素System.out.println("get:" + map.get("02"));// 获取集合中的null键元素System.out.println(map.get(null));// 获取map集合中所有的值Collection<String> c = map.values();System.out.println(c);// 打印集合System.out.println(map);


4 --下面说下Map集合中最重要的两个方法 一个是keySet 一个是entrySet()

|-- 4.1Map集合中的keySet()  

keySet将Map中所有的键都存入到Set集合中因为Set集合具备迭代器,所有可以迭代当时取出所有的键, 在根据get方法,获取每一个键对应的值 Map集合的取出原理,将Map集合转化成Set集合,在通过迭代器的方式取出 



public static void main(String[]args){Map<String, String> map = new HashMap<String, String>();map.put("01", "lilei");map.put("02", "hanmei");map.put("03", "lili");map.put("04", "luxi");map.put("05", null);map.put(null, "tom");// 取出map集合中的所有的键Set<String> set = map.keySet();// 通过map集合的迭代器 取出set集合中键,通过map的get取出值Iterator<String> it = set.iterator();while (it.hasNext()) {//it.next即为map集合中的键 这里根据键拿到所有的值System.out.println(map.get(it.next()));}}

|-- 4.2Map集合中entrySet()方法

Set<Map.Entry<K,V>> entrySet:将Map集合中的映射关系存入到set集合中,而这个关系的数据类型就是Map.EntryMap.Entry 其实Entry也是一个接口 它是map接口中的内部接口

public static void main(String[] args) {Map<HashMapStudent, String> map = new HashMap<HashMapStudent, String>();map.put(new HashMapStudent("lilei", 11), "北京");map.put(new HashMapStudent("lilei", 11), "天津");map.put(new HashMapStudent("hanmei", 12), "上海");map.put(new HashMapStudent("lili", 13), "天津");map.put(new HashMapStudent("luxi", 14), "南昌");map.put(new HashMapStudent("tom", 15), "武汉");//将Map.entrySet()转化成Set集合 Set集合中有迭代功能Set<Map.Entry<HashMapStudent, String>> entry = map.entrySet();Iterator<Map.Entry<HashMapStudent, String>> it = entry.iterator();while (it.hasNext()) {Map.Entry<HashMapStudent, String> mapEntry = it.next();//获取map集合中的键HashMapStudent key = mapEntry.getKey();//获取map集合中的值String value = mapEntry.getValue();System.out.println(" Key = " + key.toString() + " Value = " + value);}}class HashMapStudent {private String name;private int age;public HashMapStudent(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "HashMapStudent [name=" + name + ", age=" + age + "]";}}
5 -- 可排序的Map集合 TreeMap

|-- 5.1让元素具有比较性

按照存入键的年龄进行排序,当主要条件年龄相同时按照次要条件姓名进行排序

|-- 5.2集合中的键为一个实体类  用实体类实现Comparable 接口 并覆盖接口中的compareTo方法 此方法的返回值为 int类型 

public class JavaMap03 {public static void main(String[] args) {TreeMap<TreeMapStudent, String> map = new TreeMap<TreeMapStudent, String>();map.put(new TreeMapStudent("tom", 12), "tianjing");map.put(new TreeMapStudent("lilei", 11), "beijing");map.put(new TreeMapStudent("hanmei", 14), "wuhan");map.put(new TreeMapStudent("hanmei", 15), "wuhan");map.put(new TreeMapStudent("lilia", 13), "shanghai");map.put(new TreeMapStudent("lilib", 13), "shanghai");Set<Map.Entry<TreeMapStudent, String>> set = map.entrySet();Iterator<Map.Entry<TreeMapStudent, String>> it = set.iterator();while (it.hasNext()) {Map.Entry<TreeMapStudent, String> mps = it.next();TreeMapStudent tree = mps.getKey();String str = mps.getValue();System.out.println(tree + "..." + str);}}}class TreeMapStudent implements Comparable<TreeMapStudent> {private String name;private int age;public TreeMapStudent(String name, int age) {this.name = name;this.age = age;}//覆写Comparable 中的方法public int compareTo(TreeMapStudent another) {int num = new Integer(this.age).compareTo(new Integer(another.age));//当主要条件年龄相等的时候 此时需要比较次要条件 就是姓名 字符串中自带compareTo方法if (num == 0) {return this.name.compareTo(another.name);}return num;}// 覆盖hashCode方法public int hashCode() {return name.hashCode() + age * 37;}// 覆盖equals 方法public boolean equals(Object o) {if (!(o instanceof HashMapStudent)) {throw new ClassCastException("类型不匹配");}TreeMapStudent student = (TreeMapStudent) o;return this.name.equals(student.name) && this.age == student.age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "HashMapStudent [name=" + name + ", age=" + age + "]";}}

打印结果为:

[name=lilei, age=11]...beijing
[name=tom, age=12]...tianjing
[name=lilia, age=13]...shanghai
[name=lilib, age=13]...shanghai
[name=hanmei, age=14]...wuhan
[name=hanmei, age=15]...wuhan

证明集合是按照类HashMapStudent 类中的年龄进行排序的 当主要条件年龄相同时会按照次要条件姓名进行排序


| -- 5.3让集合自身具有比较性 

|-- 5.4写一个类 StudentComparator 实现Comparator 并将要比较的条件传入,当集合初始化时,将StudentComparator  作为参数传入


public class JavaMap03 {public static void main(String[] args) {TreeMap<TreeMapStudent, String> map = new TreeMap<TreeMapStudent, String>(new StudentComparator() );map.put(new TreeMapStudent("tom", 12), "tianjing");map.put(new TreeMapStudent("lilei", 11), "beijing");map.put(new TreeMapStudent("hanmei", 14), "wuhan");map.put(new TreeMapStudent("hanmei", 15), "wuhan");map.put(new TreeMapStudent("lilia", 13), "shanghai");map.put(new TreeMapStudent("lilib", 13), "shanghai");Set<Map.Entry<TreeMapStudent, String>> set = map.entrySet();Iterator<Map.Entry<TreeMapStudent, String>> it = set.iterator();while (it.hasNext()) {Map.Entry<TreeMapStudent, String> mps = it.next();TreeMapStudent tms = mps.getKey();String str = mps.getValue();System.out.println(tms + "..." + str);}}}class StudentComparator implements Comparator<TreeMapStudent> {@Overridepublic int compare(TreeMapStudent lhs, TreeMapStudent rhs) {int num = lhs.getName().compareTo(rhs.getName());if (num == 0) {return new Integer(lhs.getAge()).compareTo(new Integer(rhs.getAge()));}return num;}}class TreeMapStudent  {private String name;private int age;public TreeMapStudent(String name, int age) {this.name = name;this.age = age;}@Overridepublic int compareTo(TreeMapStudent another) {int num = new Integer(this.age).compareTo(new Integer(another.age));if (num == 0) {return this.name.compareTo(another.name);}return num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "HashMapStudent [name=" + name + ", age=" + age + "]";}}

打印结果为:

[name=hanmei, age=14]...wuhan
[name=hanmei, age=15]...wuhan
[name=lilei, age=11]...beijing
[name=lilia, age=13]...shanghai
[name=lilib, age=13]...shanghai
[name=tom, age=12]...tianjing

证明集合是按照姓名进行排序的

1 0
原创粉丝点击