黑马程序员 Java基础 ---> 集合(下)

来源:互联网 发布:一路向南知乎 编辑:程序博客网 时间:2024/05/16 06:50

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

集合Map

Map集合的特点

  Map存储了一系列键值的映射关系

  Map集合需要保证键的唯一性

  可以通过键获得值,反之则不能

  Map集合存储元素使用put(key,value)方法

  Map集合的两种遍历方式

  通过keySet方法返回由键组成的集合,迭代该集合的元素就拿到了所有的键,再调用get方法根据键拿到值。

  通过entrySet方法返回键值映射关系组成的集合,迭代该集合就拿到了一个个的键值映射关系,通过getKey方法拿到键,通过getValue方法拿到值。

常用方法
  put(K key, V value)                             添加元素
  get(Object key)           获取指定Key对应的元素
  remove(Object key)         移除指定Key对应的元素
  size()                                                  获取集合的长度
  containsKey(Object key)      判断是否有这个Key
  containsValue(Object key)                 判断是否有这个Key是否有 对应的 value
  values()                                              获取所有值组成的集合, 顺序就是Map的顺序

import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class Demo1_Map {public static void main(String[] args) {//demo1();//demo2();//demo3();//demo4();//demo5();//demo6();//demo7();}private static void demo7() {Map<String, Integer> map = new HashMap<>();map.put("张三", 80);map.put("李四", 90);map.put("王五", 85);map.put("赵六", 80);Collection<Integer> c = map.values();// 获取所有值组成的集合, 顺序就是Map的顺序for (Integer i : c) {System.out.println(i);}}private static void demo6() {Map<String, Integer> map = new HashMap<>();map.put("张三", 80);map.put("李四", 90);map.put("王五", 85);map.put("赵六", 80);Set<Entry<String, Integer>> set = map.entrySet();// 获取Map中所有Entry组成的Set集合for (Entry<String, Integer> e : set) {// 遍历Set集合, 得到每一个EntrySystem.out.println(e.getKey() + ": " + e.getValue());// 每个Entry都可以获取其中的Key和Value}}private static void demo5() {Map<String, Integer> map = new HashMap<>();map.put("张三", 80);map.put("李四", 90);map.put("王五", 85);map.put("赵六", 80);Set<String> set = map.keySet();// 获取Map中所有Key组成的Setfor (String key : set) {// 遍历Set就可以得到每一个KeySystem.out.println(key + ": " + map.get(key));// 有了Key就可以获取Value}}private static void demo4() {Map<String, Integer> map1 = new HashMap<>();Map<String, Integer> map2 = new HashMap<>();map1.put("张三", 80);map1.put("李四", 90);map2.put("王五", 85);map2.put("赵六", 80);map1.putAll(map2);// 把map2中的所有数据装入map1System.out.println(map1);System.out.println(map2);}private static void demo3() {Map<String, Integer> map = new HashMap<>();map.put("张三", 80);map.put("李四", 90);map.put("王五", 85);map.put("赵六", 80);System.out.println(map.containsKey("张三"));// 判断是否包含指定的键System.out.println(map.containsKey("张三丰"));System.out.println(map.containsValue(80));// 判断是否包含指定的值System.out.println(map.containsValue(81));}private static void demo2() {Map<String, Integer> map = new HashMap<>();System.out.println(map.put("张三", 80));System.out.println(map.put("李四", 90));System.out.println(map.put("王五", 85));System.out.println(map.put("赵六", 82));System.out.println(map.put("张三", 90));// 装入一个键值对, 返回该键以前对应的值, 如果以前没有这个键, 那么返回nullSystem.out.println(map.remove("赵六"));// 根据键对象删除一个键值对. 返回该键对应的值, 如果没有这个键, 返回null}private static void demo1() {Map<String, Integer> map = new HashMap<>();// 创建了一个Map对象, 指定了泛型map.put("张三", 80);// 向Map中装入一个键值对(Entry)map.put("李四", 90);map.put("王五", 85);map.put("赵六", 82);map.put("张三", 90);// 如果使用相同的键向Map中存储数据, 后来的值会覆盖先来的值System.out.println(map.get("张三"));// 可以通过键查找值System.out.println(map.get("李四"));System.out.println(map.get("王五"));System.out.println(map.get("赵六"));System.out.println(map.get("王二麻子"));}}


 

HashMap

  线程不安全,存取速度快,允许存放null键,null值。

  通过HashSet原理保证键唯一性

  底层是哈希表结构。

  在存储一个键值对的时候, 先调用Key对象的hashCode()方法得到一个哈希值  
  然后在集合中查找是否有哈希值相同的对象
  如果没有哈希值相同的, 直接存入. 如果有哈希值相同的, 和相同的Key对象逐个进行equals()比较
  比较结果为false就存入, true则覆盖Value
  如果自定义一个类, 存入HashMap, 需要重写hashCode()和equals()

import java.util.HashMap;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.Map;public class Demo2_HashMap {public static void main(String[] args) {//demo1();//demo2();}private static void demo2() {Map<Student, Integer> map = new LinkedHashMap<>();    //创建一个LinkedHashMap对象     map.put(new Student(1, "张三"), 80);                      //添加元素 map.put(new Student(2, "李四"), 97);map.put(new Student(3, "王五"), 82);map.put(new Student(4, "赵六"), 85);map.put(new Student(4, "赵六"), 90);map.put(new Student(5, "赵六"), 70);for (Iterator<Student> iter = map.keySet().iterator(); iter.hasNext();) {        //获取迭代器进行遍历Student key = iter.next();System.out.println(key + ": " + map.get(key));}}private static void demo1() {Map<String, Integer> map = new HashMap<>();    //创建一个HashMap对象map.put("张三", 80);map.put("李四", 90);map.put("王五", 85);map.put("赵六", 80);map.put("赵六", 85);for (String key : map.keySet()) //用高级for循环进行遍历System.out.println(key + ": " + map.get(key));}}
public class Student implements Comparable<Student> {private int id;private String name;public Student() {super();}public Student(int id, String name) {super();this.id = id;this.name = name;}@Overridepublic int hashCode() {         //重写hashCode方法final int prime = 31;int result = 1;result = prime * result + id;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {        //重写equals方法if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (id != other.id)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic String toString() {         //重写toString方法return "Student [id=" + id + ", name=" + name + "]";}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int compareTo(Student o) {return id - o.id;}}

 

Hashtable

  线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。

  

TreeMap

  通过二叉树算法保证键唯一性

  对键进行排序,排序原理与TreeSet相同。

import java.util.Comparator;import java.util.Map;import java.util.TreeMap;import cn.itcast.bean.Student;public class Demo3_TreeMap {public static void main(String[] args) {Map<Student, Integer> map = new TreeMap<>(new StudentComparator());       //创建一个TreeMap集合map.put(new Student(1, "zs"), 85);map.put(new Student(2, "ls"), 97);map.put(new Student(3, "ww"), 82);map.put(new Student(4, "zl"), 80);map.put(new Student(4, "zl"), 91);map.put(new Student(5, "zl"), 85);for (Student s : map.keySet()) {         //用高级for循环进行遍历 System.out.println(s + ": " + map.get(s)); }}}class StudentComparator implements Comparator<Student> {public int compare(Student o1, Student o2) {            //重写compare方法int x = o1.getName().compareTo(o2.getName());// 比较两个对象的名字, 得到名字的差值return x != 0 ? x : o1.getId() - o2.getId();// 如果名字的差值不等于0, 代表名字不同, 就直接按照名字差值排序. 如果名字相同, 计算ID差值.}}


 

Properties

  Hashtable的子类,所以也是线程安全的

  用于读写配置文件的,一般配置项等号两边都是String,所以该集合中的两列保存的都是String类型的数据

  这个集合中只能存String,所以不需要定义泛型。

import java.io.FileInputStream;import java.util.Properties;public class Demo5_Properties {public static void main(String[] args) throws Exception {Properties prop = new Properties();// 创建Map对象prop.load(new FileInputStream("config.properties"));        // 加载文件中的数据prop.setProperty("password", "987654321");System.out.println(prop.getProperty("username"));// 根据键获取值System.out.println(prop.getProperty("password"));System.out.println(prop.getProperty("phone"));System.out.println(prop.getProperty("email"));}}


 

LinkedHeshMap

  基本跟HashMap相同,他们不同的是LinkedHeshMap 是能保证集合元素的添加顺序。

 

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------