前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础-18(01)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类

Java基础-18(01)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类

作者头像
Java帮帮
发布2018-03-15 16:20:03
6860
发布2018-03-15 16:20:03
举报
1:Map(掌握)

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

(2)Map和Collection的区别?

A:Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对

B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。光棍

(3)Map接口功能概述(自己补齐)

A:添加功能

B:删除功能

C:判断功能

D:获取功能

E:长度功能

代码语言:javascript
复制
package cn.itcast_01;
import java.util.HashMap;
import java.util.Map;
/*
 * 作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请问怎么做呢?
 * 如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,然后存储整个对象,将来遍历的时候,判断,获取对应的名称。
 * 但是呢,如果我都能把学生姓名拿出来了,我还需要根据编号去找吗?
 * 针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,Java就提供了一种新的集合 Map。
 * 通过查看API,我们知道Map集合的一个最大的特点,就是它可以存储键值对的元素。这个时候存储我们上面的需求,就可以这样做
 *  学号1  姓名1
 *  学号2           姓名2
 *  学号3  姓名3
 *  学号2(不行)       姓名4
 *  学号4            姓名4
 * Map集合的特点:
 *  将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 
 * 
 * Map集合和Collection集合的区别?
 *  Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
 *  Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
 * 
 * 注意:
 *  Map集合的数据结构值针对键有效,跟值无关 
 *  HashMap,TreeMap等会讲。
 * Collection集合的数据结构是针对元素有效
 * 
 * Map集合的功能概述:
 * 1:添加功能
 *  V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
 *  如果键是第一次存储,就直接存储元素,返回null
 *  如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
 * 2:删除功能
 *  void clear():移除所有的键值对元素
 *  V remove(Object key):根据键删除键值对元素,并把值返回
 * 3:判断功能
 *  boolean containsKey(Object key):判断集合是否包含指定的键
 *  boolean containsValue(Object value):判断集合是否包含指定的值
 *  boolean isEmpty():判断集合是否为空
 * 4:获取功能
 *  Set<Map.Entry<K,V>> entrySet():???
 *  V get(Object key):根据键获取值
 *  Set<K> keySet():获取集合中所有键的集合
 *  Collection<V> values():获取集合中所有值的集合
 * 5:长度功能
 *  int size():返回集合中的键值对的对数
 */
public class MapDemo {
 public static void main(String[] args) {
 // 创建集合对象
 Map<String, String> map = new HashMap<String, String>();
 // 添加元素
 // V put(K key,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
 // System.out.println("put:" + map.put("文章", "马伊俐"));
 // System.out.println("put:" + map.put("文章", "姚笛"));
 map.put("邓超", "孙俪");
 map.put("黄晓明", "杨颖");
 map.put("周杰伦", "蔡依林");
 map.put("刘恺威", "杨幂");
 // void clear():移除所有的键值对元素
 // map.clear();
 // V remove(Object key):根据键删除键值对元素,并把值返回
 // System.out.println("remove:" + map.remove("黄晓明"));
 // System.out.println("remove:" + map.remove("黄晓波"));
 // boolean containsKey(Object key):判断集合是否包含指定的键
 // System.out.println("containsKey:" + map.containsKey("黄晓明"));
 // System.out.println("containsKey:" + map.containsKey("黄晓波"));
 // boolean isEmpty():判断集合是否为空
 // System.out.println("isEmpty:"+map.isEmpty());
 //int size():返回集合中的键值对的对数
 System.out.println("size:"+map.size());
 // 输出集合名称
 System.out.println("map:" + map);
 }
}
 (4)Map集合的遍历
 A:键找值
 a:获取所有键的集合
 b:遍历键的集合,得到每一个键
 c:根据键到集合中去找值
 B:键值对对象找键和值
 a:获取所有的键值对对象的集合
 b:遍历键值对对象的集合,获取每一个键值对对象
 c:根据键值对对象去获取键和值
 代码体现:
 Map<String,String> hm = new HashMap<String,String>();
 hm.put("it002","hello");
 hm.put("it003","world");
 hm.put("it001","java");
 //方式1 键找值
 Set<String> set = hm.keySet();
 for(String key : set) {
 String value = hm.get(key);
 System.out.println(key+"---"+value);
 }
package cn.itcast_01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
 * Map集合的遍历。
 * Map -- 夫妻对
 * 思路:
 *  A:把所有的丈夫给集中起来。
 *  B:遍历丈夫的集合,获取得到每一个丈夫。
 *  C:让丈夫去找自己的妻子。
 * 
 * 转换:
 *  A:获取所有的键
 *  B:遍历键的集合,获取得到每一个键
 *  C:根据键去找值
 */
public class MapDemo3 {
 public static void main(String[] args) {
 // 创建集合对象
 Map<String, String> map = new HashMap<String, String>();
 // 创建元素并添加到集合
 map.put("杨过", "小龙女");
 map.put("郭靖", "黄蓉");
 map.put("杨康", "穆念慈");
 map.put("陈玄风", "梅超风");
 // 遍历
 // 获取所有的键
 Set<String> set = map.keySet();
 // 遍历键的集合,获取得到每一个键
 for (String key : set) {
 // 根据键去找值
 String value = map.get(key);
 System.out.println(key + "---" + value);
 }
 }
}
 //方式2 键值对对象找键和值
 Set<Map.Entry<String,String>> set2 = hm.entrySet();
 for(Map.Entry<String,String> me : set2) {
 String key = me.getKey();
 String value = me.getValue();
 System.out.println(key+"---"+value);
 }
package cn.itcast_01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
 * Map集合的遍历。
 * Map -- 夫妻对
 * 
 * 思路:
 *  A:获取所有结婚证的集合
 *  B:遍历结婚证的集合,得到每一个结婚证
 *  C:根据结婚证获取丈夫和妻子
 * 
 * 转换:
 *  A:获取所有键值对对象的集合
 *  B:遍历键值对对象的集合,得到每一个键值对对象
 *  C:根据键值对对象获取键和值
 * 
 * 这里面最麻烦的就是键值对对象如何表示呢?
 * 看看我们开始的一个方法:
 *  Set<Map.Entry<K,V>> entrySet():返回的是键值对对象的集合
 */
public class MapDemo4 {
 public static void main(String[] args) {
 // 创建集合对象
 Map<String, String> map = new HashMap<String, String>();
 // 创建元素并添加到集合
 map.put("杨过", "小龙女");
 map.put("郭靖", "黄蓉");
 map.put("杨康", "穆念慈");
 map.put("陈玄风", "梅超风");
 // 获取所有键值对对象的集合
 Set<Map.Entry<String, String>> set = map.entrySet();
 // 遍历键值对对象的集合,得到每一个键值对对象
 for (Map.Entry<String, String> me : set) {
 // 根据键值对对象获取键和值
 String key = me.getKey();
 String value = me.getValue();
 System.out.println(key + "---" + value);
 }
 }
}
 (5)HashMap集合的练习
 A:HashMap<String,String>
package cn.itcast_02;
import java.util.HashMap;
import java.util.Set;
/*
 * HashMap:是基于哈希表的Map接口实现。
 * 哈希表的作用是用来保证键的唯一性的。
 * 
 * HashMap<String,String>
 * 键:String
 * 值:String
 */
public class HashMapDemo {
 public static void main(String[] args) {
 // 创建集合对象
 HashMap<String, String> hm = new HashMap<String, String>();
 // 创建元素并添加元素
 // String key1 = "it001";
 // String value1 = "马云";
 // hm.put(key1, value1);
 hm.put("it001", "马云");
 hm.put("it003", "马化腾");
 hm.put("it004", "乔布斯");
 hm.put("it005", "张朝阳");
 hm.put("it002", "裘伯君"); // wps
 hm.put("it001", "比尔盖茨");
 // 遍历
 Set<String> set = hm.keySet();
 for (String key : set) {
 String value = hm.get(key);
 System.out.println(key + "---" + value);
 }
 }
}
 B:HashMap<Integer,String>
package cn.itcast_02;
import java.util.HashMap;
import java.util.Set;
/*
 * HashMap<Integer,String>
 * 键:Integer
 * 值:String
 */
public class HashMapDemo2 {
 public static void main(String[] args) {
 // 创建集合对象
 HashMap<Integer, String> hm = new HashMap<Integer, String>();
 // 创建元素并添加元素
 // Integer i = new Integer(27);
 // Integer i = 27;
 // String s = "林青霞";
 // hm.put(i, s);
 hm.put(27, "林青霞");
 hm.put(30, "风清扬");
 hm.put(28, "刘意");
 hm.put(29, "林青霞");
 // 下面的写法是八进制,但是不能出现8以上的单个数据
 // hm.put(003, "hello");
 // hm.put(006, "hello");
 // hm.put(007, "hello");
 // hm.put(008, "hello");
 // 遍历
 Set<Integer> set = hm.keySet();
 for (Integer key : set) {
 String value = hm.get(key);
 System.out.println(key + "---" + value);
 }
 // 下面这种方式仅仅是集合的元素的字符串表示
 // System.out.println("hm:" + hm);
 }
}
 C:HashMap<String,Student>
package cn.itcast_02;
public class Student {
 private String name;
 private int age;
 public Student() {
 super();
 }
 public Student(String name, int age) {
 super();
 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;
 }
 @Override
 public int hashCode() {
 final int prime = 31;
 int result = 1;
 result = prime * result + age;
 result = prime * result + ((name == null) ? 0 : name.hashCode());
 return result;
 }
 @Override
 public boolean equals(Object obj) {
 if (this == obj)
 return true;
 if (obj == null)
 return false;
 if (getClass() != obj.getClass())
 return false;
 Student other = (Student) obj;
 if (age != other.age)
 return false;
 if (name == null) {
 if (other.name != null)
 return false;
 } else if (!name.equals(other.name))
 return false;
 return true;
 }
}
package cn.itcast_02;
import java.util.HashMap;
import java.util.Set;
/*
 * HashMap<String,Student>
 * 键:String 学号
 * 值:Student 学生对象
 */
public class HashMapDemo3 {
 public static void main(String[] args) {
 // 创建集合对象
 HashMap<String, Student> hm = new HashMap<String, Student>();
 // 创建学生对象
 Student s1 = new Student("周星驰", 58);
 Student s2 = new Student("刘德华", 55);
 Student s3 = new Student("梁朝伟", 54);
 Student s4 = new Student("刘嘉玲", 50);
 // 添加元素
 hm.put("9527", s1);
 hm.put("9522", s2);
 hm.put("9524", s3);
 hm.put("9529", s4);
 // 遍历
 Set<String> set = hm.keySet();
 for (String key : set) {
 // 注意了:这次值不是字符串了
 // String value = hm.get(key);
 Student value = hm.get(key);
 System.out.println(key + "---" + value.getName() + "---"
 + value.getAge());
 }
 }
}
 D:HashMap<Student,String>
package cn.itcast_02;
public class Student {
 private String name;
 private int age;
 public Student() {
 super();
 }
 public Student(String name, int age) {
 super();
 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;
 }
 @Override
 public int hashCode() {
 final int prime = 31;
 int result = 1;
 result = prime * result + age;
 result = prime * result + ((name == null) ? 0 : name.hashCode());
 return result;
 }
 @Override
 public boolean equals(Object obj) {
 if (this == obj)
 return true;
 if (obj == null)
 return false;
 if (getClass() != obj.getClass())
 return false;
 Student other = (Student) obj;
 if (age != other.age)
 return false;
 if (name == null) {
 if (other.name != null)
 return false;
 } else if (!name.equals(other.name))
 return false;
 return true;
 }
}
package cn.itcast_02;
import java.util.HashMap;
import java.util.Set;
/*
 * HashMap<Student,String>
 * 键:Student
 *  要求:如果两个对象的成员变量值都相同,则为同一个对象。
 * 值:String
 */
public class HashMapDemo4 {
 public static void main(String[] args) {
 // 创建集合对象
 HashMap<Student, String> hm = new HashMap<Student, String>();
 // 创建学生对象
 Student s1 = new Student("貂蝉", 27);
 Student s2 = new Student("王昭君", 30);
 Student s3 = new Student("西施", 33);
 Student s4 = new Student("杨玉环", 35);
 Student s5 = new Student("貂蝉", 27);
 // 添加元素
 hm.put(s1, "8888");
 hm.put(s2, "6666");
 hm.put(s3, "5555");
 hm.put(s4, "7777");
 hm.put(s5, "9999");
 // 遍历
 Set<Student> set = hm.keySet();
 for (Student key : set) {
 String value = hm.get(key);
 System.out.println(key.getName() + "---" + key.getAge() + "---"
 + value);
 }
 }
}
 (6)LinkedHashMap集合的特点
package cn.itcast_03;
import java.util.LinkedHashMap;
import java.util.Set;
/*
 * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
 * 由哈希表保证键的唯一性
 * 由链表保证键盘的有序(存储和取出的顺序一致)
 */
public class LinkedHashMapDemo {
 public static void main(String[] args) {
 // 创建集合对象
 LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();
 // 创建并添加元素
 hm.put("2345", "hello");
 hm.put("1234", "world");
 hm.put("3456", "java");
 hm.put("1234", "javaee");
 hm.put("3456", "android");
 // 遍历
 Set<String> set = hm.keySet();
 for (String key : set) {
 String value = hm.get(key);
 System.out.println(key + "---" + value);
 }
 }
}

(7)TreeMap集合的练习

代码语言:javascript
复制
 A:TreeMap<String,String>
package cn.itcast_04;
public class Student {
 private String name;
 private int age;
 public Student() {
 super();
 }
 public Student(String name, int age) {
 super();
 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;
 }
}
package cn.itcast_04;
import java.util.Set;
import java.util.TreeMap;
/*
 * TreeMap:是基于红黑树的Map接口的实现。
 * 
 * HashMap<String,String>
 * 键:String
 * 值:String
 */
public class TreeMapDemo {
 public static void main(String[] args) {
 // 创建集合对象
 TreeMap<String, String> tm = new TreeMap<String, String>();
 // 创建元素并添加元素
 tm.put("hello", "你好");
 tm.put("world", "世界");
 tm.put("java", "爪哇");
 tm.put("world", "世界2");
 tm.put("javaee", "爪哇EE");
 // 遍历集合
 Set<String> set = tm.keySet();
 for (String key : set) {
 String value = tm.get(key);
 System.out.println(key + "---" + value);
 }
 }
}
 B:TreeMap<Student,String>
package cn.itcast_04;
public class Student {
 private String name;
 private int age;
 public Student() {
 super();
 }
 public Student(String name, int age) {
 super();
 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;
 }
}
package cn.itcast_04;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
/*
 * TreeMap<Student,String>
 * 键:Student
 * 值:String
 */
public class TreeMapDemo2 {
 public static void main(String[] args) {
 // 创建集合对象
 TreeMap<Student, String> tm = new TreeMap<Student, String>(
 new Comparator<Student>() {
 @Override
 public int compare(Student s1, Student s2) {
 // 主要条件
 int num = s1.getAge() - s2.getAge();
 // 次要条件
 int num2 = num == 0 ? s1.getName().compareTo(
 s2.getName()) : num;
 return num2;
 }
 });
 // 创建学生对象
 Student s1 = new Student("潘安", 30);
 Student s2 = new Student("柳下惠", 35);
 Student s3 = new Student("唐伯虎", 33);
 Student s4 = new Student("燕青", 32);
 Student s5 = new Student("唐伯虎", 33);
 // 存储元素
 tm.put(s1, "宋朝");
 tm.put(s2, "元朝");
 tm.put(s3, "明朝");
 tm.put(s4, "清朝");
 tm.put(s5, "汉朝");
 // 遍历
 Set<Student> set = tm.keySet();
 for (Student key : set) {
 String value = tm.get(key);
 System.out.println(key.getName() + "---" + key.getAge() + "---"
 + value);
 }
 }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档