1.双列集合Map

Map:双列集合,每一个集合分为键和值两个部分组成,是一个键值对的关系—对应关系(映射关系)

  • 实际使用中利用键找到对应的值。
  • 最常用的Map集合是HashMap,键是唯一且无序
  • 键———key
  • 值———value
  • 键值对—key-value(entrySet)

  • 常用的方法:
  • put(key,value):添加元素—当key相同的时候,新值会覆盖旧值
  • value get(key):获取元素——key所对应的value
  • Set keySet()—返回的是所有键的集合
  • Collection values()—返回的是所有值的集合

  • 补充:Map是一个接口,是单独的一个接口,不属于Collection ```java package com.igeek_01;

/**

  • @author Lynn
  • @create 2020-12-09-9:27 */

import java.util.HashMap;

public class MapDemo { public static void main(String[] args) { //创建一个集合对象 //第一个String—key;第二个String—value HashMap map=new HashMap<>();

  1. //向集合中添加元素
  2. map.put("及时雨","宋江");
  3. map.put("玉麒麟","卢俊义");
  4. map.put("智多星","吴用");
  5. map.put("智多星","高俅");
  6. //打印map
  7. System.out.println(map);//{玉麒麟=卢俊义, 智多星=高俅, 及时雨=宋江}
  8. /*//获取元素--通过key获得value
  9. String value=map.get("技能:");
  10. System.out.println(value);
  11. //没有key
  12. String value1=map.get("剑法");
  13. System.out.println(value1);//null--找不到key,就返回一个value--null*/
  14. }

}

  1. ```java
  2. package com.igeek_02;
  3. /**
  4. * @author Lynn
  5. * @create 2020-12-09-9:27
  6. */
  7. import java.util.*;
  8. public class MapDemo {
  9. public static void main(String[] args) {
  10. //创建一个集合对象
  11. //第一个String--key;第二个String--value
  12. HashMap<String,String> map=new HashMap<>();
  13. //向集合中添加元素
  14. map.put("及时雨","宋江");
  15. map.put("玉麒麟","卢俊义");
  16. map.put("智多星","吴用");
  17. map.put("智多星","高俅");
  18. //返回所有的键的集合--无序且不可重复
  19. Set<String> ketset=map.keySet();
  20. System.out.println(ketset);//[玉麒麟, 智多星, 及时雨]
  21. System.out.println("------------------------");
  22. //返回所有的值得集合--在添加第二个智多星的时候把吴用覆盖了
  23. Collection<String> values=map.values();
  24. System.out.println(values);//[卢俊义, 高俅, 宋江]
  25. //遍历操作--迭代器处理
  26. //迭代所有的键的set,依次获取每一个键
  27. Iterator<String> iterator= ketset.iterator();
  28. //问取删
  29. while (iterator.hasNext()){
  30. String thisKey= iterator.next();
  31. //通过键找到相应的值,使用map集合
  32. String thisValue=map.get(thisKey);
  33. System.out.println(thisKey+"<--->"+thisValue);
  34. }
  35. }
  36. }

Map遍历的方式1:

  1. //遍历操作--迭代器处理
  2. //迭代所有的键的set,依次获取每一个键
  3. Iterator<String> iterator= ketset.iterator();
  4. //问取删
  5. while (iterator.hasNext()){
  6. String thisKey= iterator.next();
  7. //通过键找到相应的值,使用map集合
  8. String thisValue=map.get(thisKey);
  9. System.out.println(thisKey+"<--->"+thisValue);

Map遍历的方式2:

Map遍历的方式2:—相对于第一种遍历方式的优点是可以一次性遍历键值对

  • Set> entrySet()—-方法用于返回集合中所有的键值对对象

  • Entry将键值对的对应关系封装成了一个对象,可以从一个Entry对象中获取每一个键值对的键和值

  • Map.Entry说明Entry是属于Map的一个内部接口

  • Entry中的方法:
  • K getKey()—获取键
  • V getValue()—获取值 ```java package com.igeek_03;

/**

  • @author Lynn
  • @create 2020-12-09-10:20 */

import java.util.HashMap; import java.util.Map; import java.util.Set;

public class MapDemo2 { public static void main(String[] args) { //创建集合对象 HashMap map=new HashMap<>(); //添加元素 map.put(“黑旋风”,”李逵”); map.put(“金毛狮王”,”段景柱”); map.put(“母夜叉”,”孙二娘”);

  1. //获取集合中的所有的键值对对象的set集合
  2. Set<Map.Entry<String,String>> entrySet=map.entrySet();
  3. System.out.println(entrySet);
  4. System.out.println("----------------------");
  5. //迭代集合,获取,每一个键值对的对象--增强for循环--底层还是一个迭代器
  6. for (Map.Entry<String,String> thisEntry:entrySet){
  7. //通过键值对对象获取键
  8. String key=thisEntry.getKey();
  9. //通过键值对获取值
  10. String value=thisEntry.getValue();
  11. System.out.println(key+":"+value);
  12. }
  13. }

}

  1. <a name="MhnkH"></a>
  2. ### LinkedHashMap
  3. LinkedHashMap的作用和使用:
  4. - LinkedHashMap继承自HashMap并且实现了Map接口
  5. - 能够保证集合是有序且不重复的
  6. - 如果key重复,就遵循父类(HashMap)中的覆盖机制
  7. - <br />
  8. - LinkedHashMap作用:
  9. - 1.Linked链表结构可以保证元素有序
  10. - 2.Hash结构可以保证元素的唯一性
  11. - 3.**以上约束只仅仅对键有效**
  12. - <br />
  13. - 注意:底层的链式结构实现怎么存就怎么取--不用考虑,使用就行
  14. - 实际上LinkedHashMap的底层使用的是Node节点做的排序处理
  15. ```java
  16. package com.igeek_04;
  17. /**
  18. * @author Lynn
  19. * @create 2020-12-09-10:51
  20. */
  21. import java.util.LinkedHashMap;
  22. import java.util.LinkedHashSet;
  23. import java.util.Set;
  24. public class LinkedHashMapDemo {
  25. public static void main(String[] args) {
  26. //创建一个对象
  27. LinkedHashMap<String,String> map=new LinkedHashMap<>();
  28. //向集合中添加元素
  29. map.put("近平","丽媛");
  30. map.put("干将","莫邪");
  31. map.put("Lucy","Jack");
  32. map.put("Lucy","Lily");
  33. //打印
  34. System.out.println(map);//{近平=丽媛, 干将=莫邪, Lucy=Lily}
  35. //遍历集合
  36. Set<String> keyset=map.keySet();
  37. for (String thisKey:keyset){
  38. //通过map的键找到值
  39. String thisValue=map.get(thisKey);
  40. System.out.println(thisKey+"<----->"+thisValue);
  41. }
  42. }
  43. }

2.Collections

Collections是一个工具类

  • 这个类是一个静态类,也就是意味着可以直接通过类名.方法来调用—不需要实例化
  • 这个类中的方法都是静态方法—基本上都是为集合中服务的
  • public static void shuffle(List<?> list):打乱元素的顺序—其实打乱的是集合中元素的下标

  • 有顺序:每一个元素都是按照添加元素的时候生成的下标进行排序
  • 排序后:不管是第几个放的元素,只要是到了集合中,就会按照一定的顺序重新排列

  • Collections.shuffle(list);—-打乱顺序

    Collections.sort(list2)———排序(默认正序)

    binarySearch(查找的集合,在集合中查找的内容)

    ```java package com.igeek_05;

/**

  • @author Lynn
  • @create 2020-12-09-11:11 */

import java.util.ArrayList; import java.util.Collections; import java.util.List;

/**

  • Collections是一个工具类
  • 这个类是一个静态类,也就是意味着可以直接通过类名.方法来调用—不需要实例化
  • 这个类中的方法都是静态方法—基本上都是为集合中服务的
  • public static void shuffle(List<?> list):打乱元素的顺序—其实打乱的是集合中元素的下标 *
  • 有顺序:每一个元素都是按照添加元素的时候生成的下标进行排序
  • 排序后:不管是第几个放的元素,只要是到了集合中,就会按照一定的顺序重新排列 *
  • 演示其他的方法: / public class CollectionsDemo { public static void main(String[] args) {

    1. //创建有序的集合
    2. List<Integer> list=new ArrayList<>();//向上造型
    3. //添加数据
    4. list.add(2);
    5. list.add(7);
    6. list.add(6);
    7. list.add(9);
    8. list.add(10);
    9. list.add(1);
    10. /* //打乱前的顺序--按照存入的顺序
    11. System.out.println(list);
    12. //打乱后的顺序--每一次的顺序都不一样
    13. Collections.shuffle(list);
    14. System.out.println(list);*/
    15. //排序--默认的是正序排列
    16. Collections.sort(list);
    17. System.out.println(list);//[1, 2, 6, 7, 9, 10]
    18. System.out.println("----------------------------------------------");
    19. List<String> list2=new ArrayList<>();
    20. list2.add("a");
    21. list2.add("d");
    22. list2.add("b");
    23. list2.add("c");
    24. System.out.println(list2);//[a, d, b, c]
    25. //排序--默认的是正序排列--ASCII表
    26. Collections.sort(list2);
    27. System.out.println(list2);//[a, b, c, d]
    28. //还能处理对象
    29. //实例化对象
    30. Person p=new Person("Jack",18);
    31. Person p2=new Person("Rose",18);
    32. Person p3=new Person("Trump",18);
    33. List<Person> list3=new ArrayList<>();
    34. list3.add(p);
    35. list3.add(p2);
    36. list3.add(p3);
    37. System.out.println(list3);
    38. //排序
    39. //Collections.sort(list3);
    40. /**
    41. * 当Person对象类型进行排序的时候会报错,因为定义这个数据类型的对象没有比较顺序,
    42. * 不知道什么叫大和小,所以不能排序
    43. * 没有比较规则
    44. */

    } } java package com.igeek_05;

/**

  • @author Lynn
  • @create 2020-12-09-14:17 */

import java.util.ArrayList; import java.util.Collections; import java.util.List;

/**

  • 二分查找法:在一个集合中,如果找得到返回一个值,如果找不到就返回一个负数索引
  • 不管这个指定元素的下标是多少
  • 二分查找法必须要求集合中的元素排列好顺序 *
  • binarySearch(查找的集合,在集合中查找的内容) */ public class CollectionsDemo3 { public static void main(String[] args) {

    1. //创建有序的集合
    2. List<Integer> list=new ArrayList<>();//向上造型
    3. //添加数据
    4. list.add(2);
    5. list.add(7);
    6. list.add(6);
    7. list.add(9);
    8. list.add(10);
    9. list.add(1);
    10. System.out.println(list);//[2, 7, 6, 9, 10, 1]
    11. //直接进行二分查找--没有排序
    12. /* int i = Collections.binarySearch(list, 7);
    13. System.out.println(i);//-4*/
    14. //先排序,在进行二分查找
    15. Collections.sort(list);
    16. System.out.println(list);
    17. int i1 = Collections.binarySearch(list, 7);
    18. System.out.println(i1);

    } } ```

    可变参数

    ```java package com.igeek_06;

/**

  • @author Lynn
  • @create 2020-12-09-14:28 */

import java.util.ArrayList; import java.util.Collection; import java.util.Collections;

/**

  • 讲解方法的可变参数
  • 好处是:是的参数列表更加的灵活
  • 通常用于处理不清楚用户到底传入多少个参数的情况—例如:计算器程序 *
  • 可变参数:参数的数量可变 *
  • 注意:
  • 1.数据类型…代表可变参数,即可以传入任意个该类型的数据
  • 2.可变参数不能放在前面,只能放在后面
  • 3.参数的方法与数组的方法不能重载,因为可变参数就是一个数组 */ public class ArgsDemo { public static void main(String[] args) {

    1. //利用父类的接口创建对象
    2. Collection<String> c=new ArrayList<>();
    3. //添加数据--调用方法--一次添加多个数据
    4. Collections.addAll(c,"黄药师","段誉","虚竹");//jvm会自动将多个参数封装成一个数组
    5. System.out.println(c);
    6. System.out.println("--------------------------------");
    7. //自定义一个方法--可以灵活地处理参数列表
    8. int sum = add(10, 20, 88, 50);
    9. System.out.println(sum);
    10. System.out.println("--------------------------------");
    11. int[] arr={10,25,40,88};
    12. sum=add(arr);//表示可变参数的列表--其实就是一个数组
    13. System.out.println(sum);

    }

    //封装一个可变参数的方法 public static int add(int… a){

    1. //声明一个变量用来记录所有数字的和
    2. int sum=0;
    3. //遍历参数列表的数组
    4. for (int i = 0; i <a.length ; i++) {
    5. int j=a[i];
    6. System.out.println(j);
    7. //每遇到一个数组就累加
    8. sum+=j;
    9. }
    10. return sum;

    }

    /**

    • 可变参数其实就是一个数组
    • 这里int[]其实和int…是一样的,所以jvm判定为两个方法重名,并不是重载 / /public static int add(int[] a){ return 0; }*/

      /**

    • 什么是方法签名?
    • main(String[] args)—就是方法签名
    • 包含方法名和参数列表 */ } ```

      ArrayAsList—-数组转换为集合

      ```java package com.igeek_07;

/**

  • @author Lynn
  • @create 2020-12-09-15:16 */

import java.util.ArrayList; import java.util.Arrays; import java.util.List;

/**

  • java数组的特点:
  • 1.一旦声明不能修改长度
  • 2.存放的元素只能是当前声明的数据类型 *
  • java集合的特点:
  • 1.长度可以任意改变
  • 2.存放的元素可以是任意类型—包装类 *
  • 数组转成集合的方法:
  • public static List asList(T… a):将数组转换成集合 *
  • 注意:
  • 数组转换成集合以后,该集合就不支持添加或者是删除操作,否则会抛出异常 / public class ArrayAsListDemo { public static void main(String[] args) {

    1. //直接将一个数组转换为集合
    2. List<String> newList= Arrays.asList("Jack","Rose","Aobama");
    3. System.out.println(newList);//[Jack, Rose, Aobama]
    4. //当数组转换为集合之后,还是不能直接添加或者删除元素,因为数组的特点就是一旦声明长度不能改变
    5. newList.add("黄飞鸿");
    6. System.out.println(newList);//java.lang.UnsupportedOperationException

    } }

  1. <a name="ArrayListToArray"></a>
  2. ### ArrayListToArray---集合转换为数组
  3. ```java
  4. package com.igeek_07;
  5. /**
  6. * @author Lynn
  7. * @create 2020-12-09-15:30
  8. */
  9. import java.util.ArrayList;
  10. import java.util.Arrays;
  11. /**
  12. * 集合转换为数组:
  13. * public <T> T[] toArray(T[] a);
  14. * public Object[] toArray();--集合转换为数组
  15. *
  16. * 总结:
  17. * 1.当数组转换为集合的时候要注意:不能进行添加和删除的操作--遵循数组的结构规则
  18. * 2.当集合转换为数组的时候要注意:数据类型的强制转型或者泛型的使用
  19. * 3.数组转为集合--理解从小到大
  20. * 集合转为数组--理解从大到小
  21. */
  22. public class ArrayListToArrayDemo {
  23. public static void main(String[] args) {
  24. //声明一个集合
  25. ArrayList<Integer> list=new ArrayList<>();
  26. list.add(1);
  27. list.add(2);
  28. list.add(9);
  29. list.add(5);
  30. list.add(6);
  31. list.add(4);
  32. //调用方法--将集合转换为Object类型的数组
  33. Object[] obj= list.toArray();
  34. // System.out.println(obj);//地址值
  35. System.out.println(Arrays.toString(obj));//[1, 2, 9, 5, 6, 4]
  36. //向下转型
  37. Integer i=(Integer)obj[0];
  38. System.out.println(i.intValue());//1
  39. //调用方法,将集合转换为带类型的数组
  40. Integer[] intArr=new Integer[4];
  41. Integer[] returnArr=list.toArray(intArr);
  42. //如果给定的数组的长度不足以存放下集合中的元素,这个时候系统会再次自动创建一个能够存放集合
  43. //中元素的数组,原来声明好的数组就不再用了
  44. System.out.println(Arrays.toString(intArr));//[1, 2, 9, 5, 6, 4]
  45. System.out.println(Arrays.toString(returnArr));//[1, 2, 9, 5, 6, 4]
  46. //带泛型的-当前这个类型就直接是集合中元素的类型了,不需要强转
  47. Integer integer=returnArr[3];//下标是3
  48. System.out.println(integer.intValue());//5
  49. }
  50. }

斗地主洗牌案例

  1. package com.igeek_08;
  2. /**
  3. * @author Lynn
  4. * @create 2020-12-09-16:07
  5. */
  6. import java.util.ArrayList;
  7. import java.util.Collections;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. *
  12. */
  13. public class CardDemo {
  14. public static void main(String[] args) {
  15. //确定牌和数字的对应关系
  16. Map<Integer, String> map = new HashMap<>();
  17. //花色集合
  18. ArrayList<String> colors = new ArrayList<>();
  19. colors.add("♣");
  20. colors.add("♦");
  21. colors.add("♠");
  22. colors.add("♥");
  23. //数字集合
  24. ArrayList<String> numbers = new ArrayList<>();
  25. for (int i = 2; i <= 10; i++) {
  26. numbers.add(i + " ");
  27. }
  28. //添加其他
  29. Collections.addAll(numbers, "J", "Q", "K", "A");
  30. //设置对应关系
  31. int cardNum = 0;
  32. //遍历数字集合
  33. for (String thisNum : numbers) {
  34. //使用数字匹配花色
  35. for (String thisColor : colors) {
  36. String thisCard = thisColor + thisNum;
  37. //放入Map集合
  38. map.put(cardNum, thisCard);
  39. //对应成功一个就累计
  40. cardNum++;
  41. }
  42. }
  43. //添加大小王
  44. map.put(cardNum++, "大王");
  45. map.put(cardNum++, "小王");
  46. //测试
  47. // System.out.println(map);
  48. //准备牌
  49. ArrayList<Integer> poker = new ArrayList<>();
  50. for (int i = 0; i < 54; i++) {
  51. poker.add(i);
  52. }
  53. System.out.println(poker);
  54. // 制造下标,目的是为了打乱顺序
  55. // Collections.shuffle(poker);//打乱下标
  56. //发牌
  57. ArrayList<Integer> player1 = new ArrayList<>();
  58. ArrayList<Integer> player2 = new ArrayList<>();
  59. ArrayList<Integer> player3 = new ArrayList<>();
  60. ArrayList<Integer> dipai = new ArrayList<>();
  61. for (int index = 0; index < poker.size() - 3; index++) {
  62. //通过索引获取代表牌的数字
  63. Integer integerCard = poker.get(index);
  64. //对3取余
  65. if (index % 3 == 0) {
  66. player1.add(integerCard);
  67. } else if (index % 3 == 1) {
  68. player2.add(integerCard);
  69. } else {
  70. player3.add(integerCard);
  71. }
  72. }
  73. System.out.println(player1);
  74. System.out.println(player2);
  75. System.out.println(player3);
  76. //最后3张底牌
  77. for (int i = poker.size() - 3; i < poker.size(); i++) {
  78. Integer integerCard = poker.get(i);
  79. dipai.add(integerCard);
  80. }
  81. //看牌--排序
  82. /*Collections.sort(player1);
  83. Collections.sort(player2);
  84. Collections.sort(player3);
  85. Collections.sort(dipai);*/
  86. //从大到小进行排序
  87. for (int i = player1.size() - 1; i >= 0; i--) {
  88. Integer integer = player1.get(i);
  89. String realCard = map.get(integer);
  90. System.out.print(integer+" ");
  91. System.out.print(realCard + " ");
  92. }
  93. System.out.println();
  94. for (int i = player2.size() - 1; i >= 0; i--) {
  95. Integer integer = player2.get(i);
  96. String realCard = map.get(integer);
  97. System.out.print(integer+" ");
  98. System.out.print(realCard + " ");
  99. }
  100. System.out.println();
  101. for (int i = player3.size() - 1; i >= 0; i--) {
  102. Integer integer = player3.get(i);
  103. String realCard = map.get(integer);
  104. System.out.print(integer+" ");
  105. System.out.print(realCard + " ");
  106. }
  107. System.out.println();
  108. //增强for循环
  109. for (Integer integer : dipai) {
  110. String realCard = map.get(integer);
  111. System.out.print(realCard + " ");
  112. }
  113. }
  114. }