1. Map存储数据的特点是什么?
将键映射到值对象,一个映射不能包含重复的键;每个键最多只能映射到一个值。
2. 描述HashMap的底层实现原理(jdk 8版)?
数组+链表+红黑树
3. Map中常用实现类有哪些?各自有什么特点?
①HashMap的特点:无序,根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。
②TreeMap的特点:有序,并不是存储有序,能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器。TreeMap不允许key的值为null。非同步的。;
4. 如何遍历Map中的key-value对,代码实现(至少2种)
方式一:通过键值获取值;
Set keySet = hashMap.keySet();
for(String key ; keySet){
String value = hashMap.get(key);
System.out.println(key + value);
}
方式二:通过键值对获取键和值
Set<Map.entry> entrySet = hashMap.entrySet();
for(String me : entrySet){
String key = me.getKey();
String value = me.getValue();
System.out.println(key + value);
}
5. Collection和Collections的区别?
Collection是List和Set的接口,Collections是集合操作的工具类;
6. Map接口中的常用方法有哪些 ?
V put(K key,V value):添加键值对
V remove(Object key):通过键删除值
void clear():清空Map集合
boolean isEmpty():判空
V get(Object key):通过键获取值
Set keySet():获取所有键集合,返回键值对Set集合
Collection.value():获取所有值
Set entrySet():获取所有键值对集合,返回键值对Set集合
7. (Map)已知某学校的教学课程内容安排如下:
前者是老师,后者是老师所教的课程:
(“Tom”, “CoreJava”);
(“John”, “Oracle”);
(“Susan”, “Oracle”);
(“Jerry”, “JDBC”);
(“Jim”, “Unix”);
(“Kevin”, “JSP”);
(“Lucy”, “JSP”);
完成下列要求:
1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
2) 增加了一位新老师Allen 教JDBC
3) Lucy 改为教CoreJava
4) 遍历Map,输出所有的老师及老师教授的课程(用Set<Map.Entry<String,String>>、Set get(key)都可)
5) 利用Map,输出所有教JSP 的老师。
public class Work7_Map_0_7 {
public static void main(String[] args) {
//创建Map集合
Map<String, String> map = new HashMap<String, String>();
//1)使用一个Map,以老师的名字作为键,以老师教授的课程名作为值
map.put("Tom", "CoreJava");
map.put("John", "Oracle");
map.put("Susan", "Oracle");
map.put("Jerry", "JDBC");
map.put("Jim", "Unix");
map.put("Kevin", "JSP");
map.put("Lucy", "JSP");
//2)增加了一位新老师Allen 教JDBC
map.put("Allen","JDBC");
//3)Lucy 改为教CoreJava
map.put("Lucy","CoreJava");
//4) 遍历Map,输出所有的老师及老师教授的课程(用Set<Map.Entry<String,String>>、Set<String> get(key)都可)
Set<String> keySet = map.keySet();
for (String key : keySet){
String value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("--------------------");
//5) 利用Map,输出所有教JSP 的老师。
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> me : entrySet){
if (me.getValue().equals("JSP")){
String key = me.getKey();
String value = me.getValue();
System.out.println(key + ":" + value);
}
}
}
}
输出结果:
Kevin:JSP
Tom:CoreJava
Susan:Oracle
John:Oracle
Lucy:CoreJava
Jerry:JDBC
Allen:JDBC
Jim:Unix
Kevin:JSP
8. `学生属性:姓名,年龄
注意:姓名和年龄相同的学生视为一个学生。
保证学生的唯一性。
1、描述学生
2、定义map容器,将学生作为键,地址作为值存入
3、获取map集合中的元素
学生类:
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
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 String toString() {
return "姓名:" + name +
", 年龄:" + age ;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
测试类:
public class Work7_Map_0_8 {
public static void main(String[] args) {
//定义map容器
Map<Student,String> map = new HashMap<Student,String>();
//将学生作为键,地址作为值存入
map.put(new Student("Rock",20),"广东");
map.put(new Student("Lara",22),"上海");
map.put(new Student("Elence",30),"深圳");
map.put(new Student("Rock",20),"深圳");
//获取map集合中的元素
Set<Student> studentSet = map.keySet();
for (Student key : studentSet){
String value = map.get(key);
System.out.println(key + ":" + value);
}
}
}
输出结果:
姓名:Elence, 年龄:30:深圳
姓名:Rock, 年龄:20:深圳
姓名:Lara, 年龄:22:上海
9. 模拟斗地主洗牌发牌(争取根据自己的思路再写一遍)
1、分析:首先应准备牌:完成数字与纸牌的映射关系:使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系。
洗牌:通过数字完成洗牌发牌(借助工具类)
发牌:将每个人以及底牌设计,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌给3个玩家。存放的过程中要求数字大小与斗地主规则的大小对应排序。将代表不同纸牌的数字分配给不同的玩家与底牌。
看牌:通过Map集合找到对应字符展示。通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。
public class Work7_Map_0_9 {
public static void main(String[] args) {
//创建一个map集合键为牌的编号,值为牌
HashMap<Integer, String> hashMap = new HashMap<Integer, String>();
//创建一个集合装键
ArrayList<Integer> keyArray = new ArrayList<Integer>();
//创建花色数组和点数数组
String[] colors = {"♦", "♥", "♠", "♣"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
int index = 0;
//给hashMap中的键和值赋值
for (String number : numbers) {
for (String color : colors) {
hashMap.put(index, color + number);
keyArray.add(index);
index++;
}
}
hashMap.put(index, "大王");
keyArray.add(index);
index++;
hashMap.put(index, "小王");
keyArray.add(index);
//洗牌,也就是洗编号
Collections.shuffle(keyArray);
//创建玩家 保证排序使用TreeSet默认编号的升序
TreeSet<Integer> pamela = new TreeSet<Integer>();
TreeSet<Integer> sour = new TreeSet<Integer>();
TreeSet<Integer> lee = new TreeSet<Integer>();
TreeSet<Integer> dp = new TreeSet<Integer>();
//发牌,通过键编号值找到牌值
for (int i = 0; i < keyArray.size(); i++) {
//三位玩家获取牌的编号
int x = keyArray.get(i);
if (i >= keyArray.size()-3) {
dp.add(x);
}else if (i % 3 == 0) {
pamela.add(x);
} else if (i % 3 == 1) {
sour.add(x);
} else if (i % 3 == 2) {
lee.add(x);
}
}
//看牌
lookPoker("pamela",pamela,hashMap);
lookPoker("sour",sour,hashMap);
lookPoker("lee",lee,hashMap);
lookPoker("底牌",dp,hashMap);
}
//通过玩家集合中的键获取牌 打印输出
public static void lookPoker(String name,TreeSet<Integer> treeSet,HashMap<Integer,String> hashMap){
System.out.print(name+"的牌是:");
//通过键值获取对象
for (Integer key : treeSet){
String value = hashMap.get(key);
System.out.print(value + " ");
}
System.out.println();
}
}
输出结果:
pamela的牌是:♦3 ♥3 ♣3 ♥4 ♠4 ♥6 ♣6 ♠7 ♥8 ♠8 ♣8 ♦9 ♠J ♦Q ♥Q ♠K ♦A
sour的牌是:♠3 ♦4 ♦5 ♣5 ♦6 ♠6 ♦7 ♣9 ♦10 ♥10 ♣10 ♠Q ♣Q ♦K ♣K ♥A ♠2
lee的牌是:♣4 ♥5 ♠5 ♥7 ♣7 ♦8 ♠9 ♠10 ♥J ♣J ♥K ♠A ♣A ♦2 ♥2 大王 小王
底牌的牌是:♥9 ♦J ♣2
本文概述了Map数据结构在Java中的应用,包括HashMap的底层原理、常见实现类及其特点,如无序的HashMap和有序的TreeMap。还展示了如何遍历Map并操作学生数据结构,以及模拟斗地主洗牌发牌的过程。

822

被折叠的 条评论
为什么被折叠?



