Java基础系列31-双列 Map集合、Properties集合

x33g5p2x  于2021-12-18 转载在 其他  
字(15.0k)|赞(0)|评价(0)|浏览(520)

一. Map集合

Map集合将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

1.1 创建Map集合对象并添加元素

代码:

  1. package Java_study;
  2. import java.util.HashMap;
  3. /**
  4. *
  5. * @author 只是甲
  6. * @date 2021-07-13
  7. * @remark 创建Map集合对象并添加元素
  8. *
  9. */
  10. public class map1 {
  11. public static void main(String[] args) {
  12. //创建集合对象
  13. HashMap<String, String> map = new HashMap<>();
  14. //添加元素 put(K key, V value)
  15. map.put("NBA001", "詹姆斯" );
  16. map.put("NBA002", "杜兰特");
  17. map.put("NBA001", "库里");
  18. //输出集合对象
  19. // key为主键不可冲副,新的kv键值对会把旧的kv替换掉
  20. System.out.println(map);
  21. }
  22. }

测试记录:

  1. {NBA001=库里, NBA002=杜兰特}

1.2 Map集合的成员方法

格式:

  1. //a.添加元素
  2. V put(K key,V value)
  3. //b.根据键删除键值对元素
  4. V remove(Object key)
  5. //c.移除所有的键值对元素
  6. void clear()
  7. //d.判断集合是否包含指定的键
  8. boolean containsKey(Object key)
  9. //e.判断集合是否包含指定的值
  10. boolean containsValue(Object value)
  11. //f.判断集合是否为空
  12. boolean isEmpty()
  13. //g.返回集合中的键值对的对数
  14. int size()

代码:

  1. package Java_study;
  2. import java.util.HashMap;
  3. /**
  4. *
  5. * @author 只是甲
  6. * @date 2021-07-13
  7. * @remark Map集合的成员方法
  8. *
  9. */
  10. public class map2 {
  11. public static void main(String[] args) {
  12. //创建集合对象
  13. HashMap<String, String> map = new HashMap<>();
  14. //a. map.put() 添加元素
  15. /* 如果主键(K)不存在,则直接存储元素,返回null
  16. 如果主键(K)已存在,则用新的KV替换旧的KV,并返回以前的值(V) */
  17. System.out.println("-----a. map.put()添加元素------");
  18. System.out.println("put: " + map.put("张无忌","周芷若"));
  19. System.out.println("put: " + map.put("张无忌", "赵敏"));
  20. System.out.println("put: " + map);//put: {张无忌=赵敏}
  21. //b. map.remove() 根据建删除键值对元素
  22. map.put("张无忌", "赵敏");
  23. map.put("郭靖", "黄蓉");
  24. map.put("杨过", "小龙女");
  25. System.out.println("-----b. map.remove() 根据建删除键值对元素-----");
  26. System.out.println("remove: " + map.remove("郭靖"));//remove: 黄蓉
  27. System.out.println("remove: " + map.remove("郭襄"));//remove: null
  28. System.out.println("remove: " + map);//remove: {杨过=小龙女, 张无忌=赵敏}
  29. //c. map.clear() 移除所有键值对元素
  30. System.out.println("-----c. map.clear() 移除所有键值对元素-----");
  31. map.clear();
  32. System.out.println("clear: " + map);//clear: {}
  33. //d. map.containsKey() 判断集合是否包含指定的建
  34. map.put("郭靖", "黄蓉");
  35. System.out.println("-----d. map.containsKey() 判断集合是否包含指定的建-----");
  36. System.out.println("containsKey: " + map.containsKey("郭靖"));//containsKey: true
  37. System.out.println("containsKey: " + map.containsKey("郭襄"));//containsKey: false
  38. System.out.println("containsKey: " + map);//containsKey: {郭靖=黄蓉}
  39. //f. map.isEmpty() 判断集合是否为空
  40. System.out.println("-----f. map.isEmpty() 判断集合是否为空-----");
  41. System.out.println("isEmpty: " + map.isEmpty());//isEmpty: false
  42. System.out.println("isEmpty: " + map);//isEmpty: {郭靖=黄蓉}
  43. //g. map.size() 返回集合中的键值对的对数
  44. System.out.println("-----g. map.size() 返回集合中的键值对的对数----");
  45. System.out.println("size: " + map.size());//size: 1
  46. System.out.println("size: " + map);//size: {郭靖=黄蓉}
  47. }
  48. }

测试记录:

  1. -----a. map.put()添加元素------
  2. put: null
  3. put: 周芷若
  4. put: {张无忌=赵敏}
  5. -----b. map.remove() 根据建删除键值对元素-----
  6. remove: 黄蓉
  7. remove: null
  8. remove: {杨过=小龙女, 张无忌=赵敏}
  9. -----c. map.clear() 移除所有键值对元素-----
  10. clear: {}
  11. -----d. map.containsKey() 判断集合是否包含指定的建-----
  12. containsKey: true
  13. containsKey: false
  14. containsKey: {郭靖=黄蓉}
  15. -----f. map.isEmpty() 判断集合是否为空-----
  16. isEmpty: false
  17. isEmpty: {郭靖=黄蓉}
  18. -----g. map.size() 返回集合中的键值对的对数----
  19. size: 1
  20. size: {郭靖=黄蓉}

1.3 Map集合的获取功能

格式:

  1. //根据键获取值
  2. V get(Object key)
  3. //获取所有键的集合
  4. Set<K> keySet()
  5. //获取所有值的集合
  6. Collection<V> values()

代码:

  1. package Java_study;
  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Set;
  6. /**
  7. *
  8. * @author 只是甲
  9. * @date 2021-07-13
  10. * @remark Map集合的获取功能
  11. *
  12. */
  13. public class map3 {
  14. public static void main(String[] args) {
  15. //创建集合对象
  16. Map<String, String> map = new HashMap<>();
  17. //添加元素
  18. map.put("郭靖", "黄蓉");
  19. map.put("杨过", "小龙女");
  20. map.put("张无忌", "赵敏");
  21. //a: V get(Object key):根据键获取值
  22. System.out.println("----a: V get(Object key):根据键获取值");
  23. System.out.println("get:" + map.get("张无忌"));//get:赵敏
  24. System.out.println("get:" + map.get("张三丰"));//get:null
  25. //b: Set<K> keySet():获取所有键的集合
  26. System.out.println("-----b: Set<K> keySet():获取所有键的集合-----");
  27. Set<String> set = map.keySet();
  28. for (String key : set) {
  29. System.out.println(key);
  30. }
  31. //c: Collection<V> values():获取所有值的集合
  32. System.out.println("-----c: Collection<V> values():获取所有值的集合-----");
  33. Collection<String> values = map.values();
  34. for (String value : values) {
  35. System.out.println(value);
  36. }
  37. }
  38. }

测试记录:

  1. ----a: V get(Object key):根据键获取值
  2. get:赵敏
  3. get:null
  4. -----b: Set<K> keySet():获取所有键的集合-----
  5. 杨过
  6. 郭靖
  7. 张无忌
  8. -----c: Collection<V> values():获取所有值的集合-----
  9. 小龙女
  10. 黄蓉
  11. 赵敏

二.Map集合遍历

2.1 Map集合的两种遍历方式图解

2.2 Map集合的遍历之键找值

Map集合遍历的方式1:
 思路
  Map看成是一个夫妻对的集合
  A: 把所有的丈夫给集中起来
  B: 遍历丈夫的集合,获取到每一个丈夫
  C: 根据丈夫去找对应的妻子
 转换
  A: 获取所有键的集合
  B: 遍历键的集合,获取到每一个键
  C: 根据键去找值

代码:

  1. package Java_study;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. /**
  6. *
  7. * @author 只是甲
  8. * @date 2021-07-13
  9. * @remark Map集合遍历键找值
  10. *
  11. */
  12. public class map4 {
  13. public static void main(String[] args) {
  14. //创建集合对象
  15. Map<String, String> map = new HashMap<>();
  16. //添加元素
  17. map.put("郭靖", "黄蓉");
  18. map.put("杨过", "小龙女");
  19. map.put("张无忌", "赵敏");
  20. //获取所有键的集合
  21. Set<String> set = map.keySet();
  22. //遍历键的集合,获取到每一个键
  23. for (String key : set) {
  24. //根据key找value
  25. String value = map.get(key);
  26. System.out.println("{ " + key + " = " + value + " } ");
  27. }
  28. }
  29. }

测试记录:

  1. { 杨过 = 小龙女 }
  2. { 郭靖 = 黄蓉 }
  3. { 张无忌 = 赵敏 }

2.3 Map集合的遍历之键值对对象找键和值

Map集合遍历的方式2:
 思路
  A:获取所有结婚证的集合
  B:遍历结婚证的集合,得到每一个结婚证
  C:根据结婚证获取丈夫和妻子
 转换
  A:获取所有键值对对象的集合
  B:遍历键值对对象的集合,得到每一个键值对对象
  C:根据键值对对象获取键和值

代码:

  1. package Java_study;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. /**
  6. *
  7. * @author 只是甲
  8. * @date 2021-07-13
  9. * @remark Map集合遍历键值对(k, v)对象找键(k)和值(v)
  10. *
  11. */
  12. public class map5 {
  13. public static void main(String[] args) {
  14. //创建集合对象
  15. Map<String, String> map = new HashMap<String, String>();
  16. //添加元素
  17. map.put("郭靖", "黄蓉");
  18. map.put("杨过", "小龙女");
  19. map.put("张无忌", "赵敏");
  20. //获取所有键值对(k,v)对象的集合
  21. Set<Map.Entry<String, String>> set = map.entrySet();
  22. //循环键值对对象的集合,得到每一个键值对对象
  23. for (Map.Entry<String, String> me : set) {
  24. // 根据键值对(k,v)对象获取键(k)和值(v)
  25. String key = me.getKey();
  26. String value = me.getValue();
  27. System.out.println("{ " + key + " = " + value + " }" );
  28. }
  29. }
  30. }

测试记录:

  1. { 杨过 = 小龙女 }
  2. { 郭靖 = 黄蓉 }
  3. { 张无忌 = 赵敏 }

三. HashMap集合案例

3.1 练习1 HashMap[String, Student]

练习1:两种方式遍历
HashMap<String,Student>
 键:String 学号
 值:Student 学生对象

代码:
map_student

  1. package Java_study;
  2. /**
  3. *
  4. * @author 只是甲
  5. * @date 2021-07-13
  6. * @remark 实体学生类 练习1.HashMap<String, Student>
  7. *
  8. */
  9. public class map_student {
  10. private String name;
  11. private int age;
  12. public map_student(String name, int age) {
  13. this.name = name;
  14. this.age = age;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public int getAge() {
  23. return age;
  24. }
  25. public void setAge(int age) {
  26. this.age = age;
  27. }
  28. @Override
  29. public String toString() {
  30. return "{name='" + name + '\'' + ",age = " + age + '}' ;
  31. }
  32. }

map_test1

  1. package Java_study;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. /**
  6. *
  7. * @author 只是甲
  8. * @date 2021-07-13
  9. * @remark 测试类 练习1.HashMap<String, Student>
  10. *
  11. */
  12. public class map_test1 {
  13. public static void main(String[] args) {
  14. //创建集合对象
  15. HashMap<String, map_student> hm = new HashMap<>();
  16. //添加集合元素
  17. hm.put("NBA001", new map_student("詹姆斯",37));
  18. hm.put("NBA002", new map_student("杜兰特",32));
  19. hm.put("NBA003", new map_student("库里",32));
  20. //遍历1 根据键(k)找值(v)
  21. System.out.println("----遍历1 根据键(k)");
  22. Set<String> ksSet = hm.keySet();
  23. for (String key : ksSet) {
  24. map_student value = hm.get(key);
  25. System.out.println(key + " = " + value.toString());
  26. }
  27. //遍历2 根据键值对(k,v)对象找键(k)找值(v)
  28. System.out.println("-----遍历2 根据键值对(k,v)对象找键(k)找值(v)-----");
  29. Set<Map.Entry<String, map_student>> esSet = hm.entrySet();
  30. for (Map.Entry<String, map_student> me: esSet) {
  31. String key = me.getKey();
  32. map_student value = me.getValue();
  33. System.out.println(key + " = " + value.toString());
  34. }
  35. }
  36. }

3.2 练习2 HashMap[Student,String]

练习2:任选一种方式遍历
HashMap<Student,String>
 键:Student 学生对象
 值:String 学生住址
要求
 如果学生对象的成员变量值相同,就说明是同一个键。
 注意重写Student类的hashCode();和equals();

代码:
map_student

  1. package Java_study;
  2. import java.util.Objects;
  3. /**
  4. *
  5. * @author 只是甲
  6. * @date 2021-07-13
  7. * @remark 实体学生类 练习1.HashMap<String, Student>
  8. *
  9. */
  10. public class map_student {
  11. private String name;
  12. private int age;
  13. public map_student(String name, int age) {
  14. this.name = name;
  15. this.age = age;
  16. }
  17. public String getName() {
  18. return name;
  19. }
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. @Override
  30. public String toString() {
  31. return "{name='" + name + '\'' + ",age = " + age + '}' ;
  32. }
  33. @Override
  34. public boolean equals(Object o) {
  35. if ( this == o ) return true;
  36. if ( o == null || getClass() != o.getClass()) return false;
  37. map_student that = (map_student) o;
  38. return age == that.age && name.equals(that.name);
  39. }
  40. @Override
  41. public int hashCode() {
  42. return Objects.hash(name, age);
  43. }
  44. }

map_test2

  1. package Java_study;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. /**
  6. *
  7. * @author 只是甲
  8. * @date 2021-07-13
  9. * @remark 测试类 练习2.HashMap<Student,String>
  10. *
  11. */
  12. public class map_test2 {
  13. public static void main(String[] args) {
  14. //创建集合对象
  15. HashMap<map_student, String> hm = new HashMap<>();
  16. //添加集合元素
  17. hm.put(new map_student("詹姆斯", 37), "NBA001");
  18. hm.put(new map_student("杜兰特", 32), "NBA002");
  19. hm.put(new map_student("库里", 32), "NBA003");
  20. //遍历1 根据键(k)找值(v)
  21. System.out.println("-----遍历1 根据键(k)找值(v)-----");
  22. Set<map_student> ksSet = hm.keySet();
  23. for (map_student key : ksSet) {
  24. String value = hm.get(key);
  25. System.out.println(key.toString() + " = " + value);
  26. }
  27. //遍历2 根据键值对(k,v)对象找键(k)找值(v)
  28. System.out.println("-----遍历2 根据键值对(k,v)对象找键(k)找值(v)-----");
  29. Set<Map.Entry<map_student, String>> esSet = hm.entrySet();
  30. for (Map.Entry<map_student, String> me : esSet) {
  31. map_student key = me.getKey();
  32. String value = me.getValue();
  33. System.out.println(key.toString() + " = " + value);
  34. }
  35. }
  36. }

3.3 练习3 ArrayList[HashMap[String,String]]

需求:
 ArrayList集合嵌套HashMap集合并遍历。
 定义一个ArrayList集合,它包含三个元素,每一个元素都是HashMap类型的。
 每一个HashMap集合的键和值都是String类型的,
键:
 String 丈夫的姓名
值:
 String 妻子的姓名

给出如下的字符串数据,请用代码实现需求:
 第一个HashMap集合的元素
  孙策  大乔
  周瑜  小乔
 第二个HashMap集合的元素
  郭靖  黄蓉
  杨过  小龙女
 第三个HashMap集合的元素
  令狐冲  任盈盈
  林平之  岳灵珊

代码:

  1. package Java_study;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. /**
  5. *
  6. * @author 只是甲
  7. * @date 2021-07-14
  8. * @remark 练习3.ArrayList<HashMap<String,String>>
  9. *
  10. */
  11. public class map6 {
  12. public static void main(String[] args) {
  13. ArrayList<HashMap<String, String>> arrayList = new ArrayList<>();
  14. //创建元素1
  15. HashMap<String, String> hm1 = new HashMap<String, String>();
  16. hm1.put("孙策","大乔");
  17. hm1.put("周瑜", "小乔");
  18. //创建元素2
  19. HashMap<String, String> hm2 = new HashMap<String, String>();
  20. hm2.put("郭靖","黄蓉");
  21. hm2.put("杨过", "小龙女");
  22. //创建元素3
  23. HashMap<String, String> hm3 = new HashMap<String, String>();
  24. hm3.put("令狐冲","任盈盈");
  25. hm3.put("林平之", "岳灵珊");
  26. //把元素添加到arrayList中
  27. arrayList.add(hm1);
  28. arrayList.add(hm2);
  29. arrayList.add(hm3);
  30. //遍历ArrayList集合 aList.for
  31. for (HashMap<String, String> hm : arrayList) {
  32. System.out.println(hm);
  33. }
  34. }
  35. }

测试记录:

  1. {孙策=大乔, 周瑜=小乔}
  2. {杨过=小龙女, 郭靖=黄蓉}
  3. {令狐冲=任盈盈, 林平之=岳灵珊}

3.4 练习4 HashMap[String, ArrayList]

需求:
 HashMap集合嵌套ArrayList集合并遍历。
 定义一个HashMap集合,它包含三个元素,每一个元素的键是String类型,值是ArrayList类型。
键:
 String 人物来自哪部电视剧
值:
 ArrayList 人物的名称
 每一个ArrayList集合的数据是String类型的
给出如下的字符串数据,请用代码实现需求:
 第一个ArrayList集合的元素:(三国演义)
  诸葛亮
  赵云
 第二个ArrayList集合的元素:(西游记)
  唐僧
  孙悟空
 第三个ArrayList集合的元素:(水浒传)
  武松
  鲁智深

代码:

  1. package Java_study;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Set;
  6. /**
  7. *
  8. * @author 只是甲
  9. * @date 2021-07-14
  10. * @remark 练习4.HashMap<String, ArrayList>
  11. *
  12. */
  13. public class map7 {
  14. public static void main(String[] args) {
  15. //创建集合对象
  16. HashMap<String, ArrayList> hm = new HashMap<>();
  17. //创建元素
  18. ArrayList<String> arrayList1 = new ArrayList<>();
  19. ArrayList<String> arrayList2 = new ArrayList<>();
  20. ArrayList<String> arrayList3 = new ArrayList<>();
  21. arrayList1.add("诸葛亮");
  22. arrayList1.add("赵云");
  23. arrayList2.add("唐僧");
  24. arrayList2.add("孙悟空");
  25. arrayList3.add("武松");
  26. arrayList3.add("鲁智深");
  27. //把元素添加到集合中
  28. hm.put("三国演义", arrayList1);
  29. hm.put("西游记", arrayList2);
  30. hm.put("水浒传", arrayList3 );
  31. //遍历集合
  32. Set<Map.Entry<String, ArrayList>> esSet = hm.entrySet();
  33. for (Map.Entry<String, ArrayList> me : esSet) {
  34. String key = me.getKey();
  35. ArrayList value = me.getValue();
  36. for (Object o : value) {
  37. System.out.print(key+" = ");
  38. System.out.println(o);
  39. }
  40. }
  41. }
  42. }

测试记录:

  1. 水浒传 = 武松
  2. 水浒传 = 鲁智深
  3. 三国演义 = 诸葛亮
  4. 三国演义 = 赵云
  5. 西游记 = 唐僧
  6. 西游记 = 孙悟空

四.Properties集合

java.util.Hashtable<K,V> 的子类
 - java.util.Properties

4.1 Properties概述

Properties:属性集合类,是一个可以和IO流相结合使用的集合类;
  Properties 可保存在流中或从流中加载。属性类表中每个键及其对应值都是一个字符串;
  Properties 没有<>,不是泛型类;
  Properties 是Hashtable的子类,说明是一个Map集合。

4.2 Properties作为Map集合的使用

代码:

  1. package Java_study;
  2. import java.util.Properties;
  3. import java.util.Set;
  4. /**
  5. *
  6. * @author 只是甲
  7. * @date 2021-07-14
  8. * @remark Properties作为Map集合的添加、遍历功能
  9. *
  10. */
  11. public class properties1 {
  12. public static void main(String[] args) {
  13. //作为Map集合使用
  14. Properties prop = new Properties();
  15. //添加元素
  16. prop.put("it001", "hello");
  17. prop.put("it002", "world");
  18. prop.put("it003", "java");
  19. System.out.println("prop:" + prop);
  20. Set<Object> set = prop.keySet();
  21. for (Object key : set){
  22. Object value = prop.get(key);
  23. System.out.println(value);
  24. }
  25. }
  26. }

测试记录:

  1. prop:{it003=java, it002=world, it001=hello}
  2. java
  3. world
  4. hello

4.3 Properties的特殊功能

Properties的特殊功能:

  1. //1.添加元素
  2. public Object setProperty(String key,String value)
  3. //2.获取元素
  4. public String getProperty(String key)
  5. //3.获取所有的键的集合
  6. public Set<String> stringPropertyNames()

代码:

  1. package Java_study;
  2. import java.util.Properties;
  3. import java.util.Set;
  4. /**
  5. *
  6. * @author 只是甲
  7. * @date 2021-07-14
  8. * @remark Properties特殊功能
  9. *
  10. */
  11. public class properties2 {
  12. public static void main(String[] args) {
  13. //创建集合对象
  14. Properties prop = new Properties();
  15. //1. 添加元素
  16. prop.setProperty("张三", "30");
  17. prop.setProperty("李四", "40");
  18. prop.setProperty("王五", "50");
  19. //3.获取所有键的集合
  20. Set<String> set = prop.stringPropertyNames();
  21. for (String key : set) {
  22. //获取元素
  23. String value = prop.getProperty(key);
  24. System.out.println(key + "---" + value);
  25. }
  26. }
  27. }

测试记录:

  1. 王五---50
  2. 张三---30
  3. 李四---40

4.4 Properties和IO流的结合使用

Properties和IO流的结合使用:

  1. //1.把文件中的数据读取到集合中(注意:这个文件的数据必须是键值对形式)
  2. public void load(Reader reader)
  3. //2.把集合中的数据存储到文件
  4. public void store(Writer writer,String comments)

代码:

  1. package Java_study;
  2. import java.io.*;
  3. import java.util.Properties;
  4. import java.util.Set;
  5. /**
  6. *
  7. * @author 只是甲
  8. * @date 2021-07-14
  9. * @remark Properties和IO流的结合使用
  10. *
  11. */
  12. public class properties3 {
  13. public static void main(String[] args) throws IOException{
  14. propLoad("E:\\prop.txt");
  15. propStore("E:\\prop2.txt");
  16. }
  17. //2.把集合中的数据存储到文件
  18. private static void propStore(String file) throws IOException{
  19. //创建集合
  20. Properties prop = new Properties();
  21. prop.setProperty("詹姆斯", "37" );
  22. prop.setProperty("杜兰特", "32" );
  23. prop.setProperty("库里", "32" );
  24. Writer w = new FileWriter(file);
  25. prop.store(w, "helloworld");
  26. w.close();
  27. }
  28. //1.把文件中的数据读取到集合中(注意:这个文件的数据必须是键值对形式)
  29. private static void propLoad(String file) throws IOException {
  30. Properties prop = new Properties();
  31. Reader r = new FileReader(file);
  32. prop.load(r);
  33. r.close();
  34. System.out.println("prop:" + prop);
  35. Set<String> set = prop.stringPropertyNames();
  36. for (String key : set) {
  37. String value = prop.getProperty(key);
  38. System.out.println(key + "---" + value);
  39. }
  40. }
  41. }

测试记录:

参考:

  1. https://blog.csdn.net/qq_43529621/article/details/116042907

相关文章