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.put("及时雨","宋江");
map.put("玉麒麟","卢俊义");
map.put("智多星","吴用");
map.put("智多星","高俅");
//打印map
System.out.println(map);//{玉麒麟=卢俊义, 智多星=高俅, 及时雨=宋江}
/*//获取元素--通过key获得value
String value=map.get("技能:");
System.out.println(value);
//没有key
String value1=map.get("剑法");
System.out.println(value1);//null--找不到key,就返回一个value--null*/
}
}
```java
package com.igeek_02;
/**
* @author Lynn
* @create 2020-12-09-9:27
*/
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
//创建一个集合对象
//第一个String--key;第二个String--value
HashMap<String,String> map=new HashMap<>();
//向集合中添加元素
map.put("及时雨","宋江");
map.put("玉麒麟","卢俊义");
map.put("智多星","吴用");
map.put("智多星","高俅");
//返回所有的键的集合--无序且不可重复
Set<String> ketset=map.keySet();
System.out.println(ketset);//[玉麒麟, 智多星, 及时雨]
System.out.println("------------------------");
//返回所有的值得集合--在添加第二个智多星的时候把吴用覆盖了
Collection<String> values=map.values();
System.out.println(values);//[卢俊义, 高俅, 宋江]
//遍历操作--迭代器处理
//迭代所有的键的set,依次获取每一个键
Iterator<String> iterator= ketset.iterator();
//问取删
while (iterator.hasNext()){
String thisKey= iterator.next();
//通过键找到相应的值,使用map集合
String thisValue=map.get(thisKey);
System.out.println(thisKey+"<--->"+thisValue);
}
}
}
Map遍历的方式1:
//遍历操作--迭代器处理
//迭代所有的键的set,依次获取每一个键
Iterator<String> iterator= ketset.iterator();
//问取删
while (iterator.hasNext()){
String thisKey= iterator.next();
//通过键找到相应的值,使用map集合
String thisValue=map.get(thisKey);
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
//获取集合中的所有的键值对对象的set集合
Set<Map.Entry<String,String>> entrySet=map.entrySet();
System.out.println(entrySet);
System.out.println("----------------------");
//迭代集合,获取,每一个键值对的对象--增强for循环--底层还是一个迭代器
for (Map.Entry<String,String> thisEntry:entrySet){
//通过键值对对象获取键
String key=thisEntry.getKey();
//通过键值对获取值
String value=thisEntry.getValue();
System.out.println(key+":"+value);
}
}
}
<a name="MhnkH"></a>
### LinkedHashMap
LinkedHashMap的作用和使用:
- LinkedHashMap继承自HashMap并且实现了Map接口
- 能够保证集合是有序且不重复的
- 如果key重复,就遵循父类(HashMap)中的覆盖机制
- <br />
- LinkedHashMap作用:
- 1.Linked链表结构可以保证元素有序
- 2.Hash结构可以保证元素的唯一性
- 3.**以上约束只仅仅对键有效**
- <br />
- 注意:底层的链式结构实现怎么存就怎么取--不用考虑,使用就行
- 实际上LinkedHashMap的底层使用的是Node节点做的排序处理
```java
package com.igeek_04;
/**
* @author Lynn
* @create 2020-12-09-10:51
*/
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashMapDemo {
public static void main(String[] args) {
//创建一个对象
LinkedHashMap<String,String> map=new LinkedHashMap<>();
//向集合中添加元素
map.put("近平","丽媛");
map.put("干将","莫邪");
map.put("Lucy","Jack");
map.put("Lucy","Lily");
//打印
System.out.println(map);//{近平=丽媛, 干将=莫邪, Lucy=Lily}
//遍历集合
Set<String> keyset=map.keySet();
for (String thisKey:keyset){
//通过map的键找到值
String thisValue=map.get(thisKey);
System.out.println(thisKey+"<----->"+thisValue);
}
}
}
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) {
//创建有序的集合
List<Integer> list=new ArrayList<>();//向上造型
//添加数据
list.add(2);
list.add(7);
list.add(6);
list.add(9);
list.add(10);
list.add(1);
/* //打乱前的顺序--按照存入的顺序
System.out.println(list);
//打乱后的顺序--每一次的顺序都不一样
Collections.shuffle(list);
System.out.println(list);*/
//排序--默认的是正序排列
Collections.sort(list);
System.out.println(list);//[1, 2, 6, 7, 9, 10]
System.out.println("----------------------------------------------");
List<String> list2=new ArrayList<>();
list2.add("a");
list2.add("d");
list2.add("b");
list2.add("c");
System.out.println(list2);//[a, d, b, c]
//排序--默认的是正序排列--ASCII表
Collections.sort(list2);
System.out.println(list2);//[a, b, c, d]
//还能处理对象
//实例化对象
Person p=new Person("Jack",18);
Person p2=new Person("Rose",18);
Person p3=new Person("Trump",18);
List<Person> list3=new ArrayList<>();
list3.add(p);
list3.add(p2);
list3.add(p3);
System.out.println(list3);
//排序
//Collections.sort(list3);
/**
* 当Person对象类型进行排序的时候会报错,因为定义这个数据类型的对象没有比较顺序,
* 不知道什么叫大和小,所以不能排序
* 没有比较规则
*/
} }
/**
- @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) {
//创建有序的集合
List<Integer> list=new ArrayList<>();//向上造型
//添加数据
list.add(2);
list.add(7);
list.add(6);
list.add(9);
list.add(10);
list.add(1);
System.out.println(list);//[2, 7, 6, 9, 10, 1]
//直接进行二分查找--没有排序
/* int i = Collections.binarySearch(list, 7);
System.out.println(i);//-4*/
//先排序,在进行二分查找
Collections.sort(list);
System.out.println(list);
int i1 = Collections.binarySearch(list, 7);
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) {
//利用父类的接口创建对象
Collection<String> c=new ArrayList<>();
//添加数据--调用方法--一次添加多个数据
Collections.addAll(c,"黄药师","段誉","虚竹");//jvm会自动将多个参数封装成一个数组
System.out.println(c);
System.out.println("--------------------------------");
//自定义一个方法--可以灵活地处理参数列表
int sum = add(10, 20, 88, 50);
System.out.println(sum);
System.out.println("--------------------------------");
int[] arr={10,25,40,88};
sum=add(arr);//表示可变参数的列表--其实就是一个数组
System.out.println(sum);
}
//封装一个可变参数的方法 public static int add(int… a){
//声明一个变量用来记录所有数字的和
int sum=0;
//遍历参数列表的数组
for (int i = 0; i <a.length ; i++) {
int j=a[i];
System.out.println(j);
//每遇到一个数组就累加
sum+=j;
}
return sum;
}
/**
/**
- @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) {
//直接将一个数组转换为集合
List<String> newList= Arrays.asList("Jack","Rose","Aobama");
System.out.println(newList);//[Jack, Rose, Aobama]
//当数组转换为集合之后,还是不能直接添加或者删除元素,因为数组的特点就是一旦声明长度不能改变
newList.add("黄飞鸿");
System.out.println(newList);//java.lang.UnsupportedOperationException
} }
<a name="ArrayListToArray"></a>
### ArrayListToArray---集合转换为数组
```java
package com.igeek_07;
/**
* @author Lynn
* @create 2020-12-09-15:30
*/
import java.util.ArrayList;
import java.util.Arrays;
/**
* 集合转换为数组:
* public <T> T[] toArray(T[] a);
* public Object[] toArray();--集合转换为数组
*
* 总结:
* 1.当数组转换为集合的时候要注意:不能进行添加和删除的操作--遵循数组的结构规则
* 2.当集合转换为数组的时候要注意:数据类型的强制转型或者泛型的使用
* 3.数组转为集合--理解从小到大
* 集合转为数组--理解从大到小
*/
public class ArrayListToArrayDemo {
public static void main(String[] args) {
//声明一个集合
ArrayList<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(9);
list.add(5);
list.add(6);
list.add(4);
//调用方法--将集合转换为Object类型的数组
Object[] obj= list.toArray();
// System.out.println(obj);//地址值
System.out.println(Arrays.toString(obj));//[1, 2, 9, 5, 6, 4]
//向下转型
Integer i=(Integer)obj[0];
System.out.println(i.intValue());//1
//调用方法,将集合转换为带类型的数组
Integer[] intArr=new Integer[4];
Integer[] returnArr=list.toArray(intArr);
//如果给定的数组的长度不足以存放下集合中的元素,这个时候系统会再次自动创建一个能够存放集合
//中元素的数组,原来声明好的数组就不再用了
System.out.println(Arrays.toString(intArr));//[1, 2, 9, 5, 6, 4]
System.out.println(Arrays.toString(returnArr));//[1, 2, 9, 5, 6, 4]
//带泛型的-当前这个类型就直接是集合中元素的类型了,不需要强转
Integer integer=returnArr[3];//下标是3
System.out.println(integer.intValue());//5
}
}
斗地主洗牌案例
package com.igeek_08;
/**
* @author Lynn
* @create 2020-12-09-16:07
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
*
*/
public class CardDemo {
public static void main(String[] args) {
//确定牌和数字的对应关系
Map<Integer, String> map = new HashMap<>();
//花色集合
ArrayList<String> colors = new ArrayList<>();
colors.add("♣");
colors.add("♦");
colors.add("♠");
colors.add("♥");
//数字集合
ArrayList<String> numbers = new ArrayList<>();
for (int i = 2; i <= 10; i++) {
numbers.add(i + " ");
}
//添加其他
Collections.addAll(numbers, "J", "Q", "K", "A");
//设置对应关系
int cardNum = 0;
//遍历数字集合
for (String thisNum : numbers) {
//使用数字匹配花色
for (String thisColor : colors) {
String thisCard = thisColor + thisNum;
//放入Map集合
map.put(cardNum, thisCard);
//对应成功一个就累计
cardNum++;
}
}
//添加大小王
map.put(cardNum++, "大王");
map.put(cardNum++, "小王");
//测试
// System.out.println(map);
//准备牌
ArrayList<Integer> poker = new ArrayList<>();
for (int i = 0; i < 54; i++) {
poker.add(i);
}
System.out.println(poker);
// 制造下标,目的是为了打乱顺序
// Collections.shuffle(poker);//打乱下标
//发牌
ArrayList<Integer> player1 = new ArrayList<>();
ArrayList<Integer> player2 = new ArrayList<>();
ArrayList<Integer> player3 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
for (int index = 0; index < poker.size() - 3; index++) {
//通过索引获取代表牌的数字
Integer integerCard = poker.get(index);
//对3取余
if (index % 3 == 0) {
player1.add(integerCard);
} else if (index % 3 == 1) {
player2.add(integerCard);
} else {
player3.add(integerCard);
}
}
System.out.println(player1);
System.out.println(player2);
System.out.println(player3);
//最后3张底牌
for (int i = poker.size() - 3; i < poker.size(); i++) {
Integer integerCard = poker.get(i);
dipai.add(integerCard);
}
//看牌--排序
/*Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
Collections.sort(dipai);*/
//从大到小进行排序
for (int i = player1.size() - 1; i >= 0; i--) {
Integer integer = player1.get(i);
String realCard = map.get(integer);
System.out.print(integer+" ");
System.out.print(realCard + " ");
}
System.out.println();
for (int i = player2.size() - 1; i >= 0; i--) {
Integer integer = player2.get(i);
String realCard = map.get(integer);
System.out.print(integer+" ");
System.out.print(realCard + " ");
}
System.out.println();
for (int i = player3.size() - 1; i >= 0; i--) {
Integer integer = player3.get(i);
String realCard = map.get(integer);
System.out.print(integer+" ");
System.out.print(realCard + " ");
}
System.out.println();
//增强for循环
for (Integer integer : dipai) {
String realCard = map.get(integer);
System.out.print(realCard + " ");
}
}
}