java 学习 7.19Map集合 HashMap和Hashtable的区别 Collections(集合工具类) 集合练习 模拟斗地主(洗牌,发牌,看牌)

本文深入讲解Java中的Map集合,包括HashMap、LinkedHashMap、TreeMap等不同实现的特点与使用场景,同时提供丰富的示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

18.01_集合框架(Map集合概述和特点)

A: 需求:	根据学号获取学生姓名
import java.util.ArrayList;
import java.util.HashMap;

public class text1 {
    public static void main(String[] args) {
        HashMap<Student,String>hashMap=new HashMap<>();
        hashMap.put(new Student("张三",16),"s001");
        hashMap.put(new Student("李四",18),"s002");
        hashMap.put(new Student("王五",13),"s003");
        System.out.println(hashMap);
    }
}
B:Map接口概述
	查看API可以知道:
	将键映射到值的对象
	一个映射不能包含重复的键
	每个键最多只能映射到一个值
C:Map接口和Collection接口的不同
	Map是双列的,Collection是单列的
	Map的键唯一,Collection的子体系Set是唯一的
	Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

18.02_集合框架(Map集合的功能概述)

A:Map集合的功能概述
	a:添加功能 
		V put(K key,V value):添加元素。这个其实还有另一个功能?替换
			如果键是第一次存储,就直接存储元素,返回null
			如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
	b:删除功能
		void clear():移除所有的键值对元素
		V remove(Object key):根据键删除键值对元素,并把值返回
	c:判断功能
		boolean containsKey(Object key):判断集合是否包含指定的键
		boolean containsValue(Object value):判断集合是否包含指定的值
		boolean isEmpty():判断集合是否为空
	d:获取功能
		Set<Map.Entry<K,V>> entrySet(): 返回一个键值对的Set集合
		V get(Object key):根据键获取值
		Set<K> keySet():获取集合中所有键的集合
		Collection<V> values():获取集合中所有值的集合
	e:长度功能
		int size():返回集合中的键值对的对数

18.03_集合框架(Map集合的基本功能测试)

A:案例演示
	Map集合的基本功能
	
	V put(K key,V value)//键相同 值覆盖  
	
import java.util.HashMap;

public class text5 {
    public static void main(String[] args) {
        HashMap<String,Integer>hashMap=new HashMap<>();
        hashMap.put("aaa",1);
        hashMap.put("bbb",2);
        hashMap.put("aaa",3);
        hashMap.put("bbb",4);
        System.out.println(hashMap);
    }
}
	V remove(Object key)
	
	void clear()
	boolean containsKey(Object key)
	boolean containsValue(Object value)
	boolean isEmpty()
	int size()
	
import java.util.HashMap;

public class text5 {
    public static void main(String[] args) {
        HashMap<String,Integer>hashMap=new HashMap<>();
        hashMap.put("aaa",1);
        hashMap.put("bbb",2);
        hashMap.put("ccc",3);
        hashMap.put("aaa",3);
        hashMap.put("bbb",4);
        System.out.println(hashMap);
        hashMap.remove("aaa");
        System.out.println(hashMap);
        boolean b=hashMap.containsKey("bbb");
        System.out.println(b);
        boolean a=hashMap.containsValue("3");
        System.out.println(a);
        boolean c=hashMap.isEmpty();
        System.out.println(c);
        hashMap.clear();
        c=hashMap.isEmpty();
        System.out.println(c);
    }
}

18.04_集合框架(Map集合的获取功能测试)

A:案例演示
	V get(Object key)
	Set<K> keySet()
	Collection<V> values()
	
import java.util.Collection;
import java.util.HashMap;
import java.util.Set;

public class text6 {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("文章", "马伊琍");
        map.put("贾乃亮", "李小璐");
        map.put("陈思成", "佟丽娅");
        map.put("大郎", "金莲");
        //键找值
        String value=map.get("文章");
        //获取所有键的集合
        Set<String> keySet=map.keySet();
        for(String key:keySet)
        {
            System.out.println(key+"==="+map.get(key));
        }
        System.out.println("------------");
        //获取所有值得集合
        Collection<String>collection=map.values();
        System.out.println(collection);

    }
}

18.05_集合框架(Map集合的遍历之键找值)

A:键找值思路:
	获取所有键的集合
	遍历键的集合,获取到每一个键
	根据键找值
B:案例演示
	Map集合的遍历之键找值
	
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class text6 {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("文章", "马伊琍");
        map.put("贾乃亮", "李小璐");
        map.put("陈思成", "佟丽娅");
        map.put("大郎", "金莲");
        //键找值
        String value=map.get("文章");
        //获取所有键的集合
        Set<String> keySet=map.keySet();
        for(String key:keySet)
        {
            System.out.println(key+"==="+map.get(key));
        }
        System.out.println("------------");
        //获取所有值得集合
        Collection<String>collection=map.values();
        System.out.println(collection);
        Set<Map.Entry<String,String>>entries=map.entrySet();
        for(Map.Entry<String,String> k:entries)
        {
            String a=k.getKey();
            String b=k.getValue();
            System.out.println(a+"==="+b);
        }

    }
}
总结  :共两种方法
遍历方式1:
通过键值来遍历
Set<String> keySet=map.keySet()//keySet()获取到 map集合中的所有键值   
for(String  key:ketSet)
{
   System.out.println(key+"===="+map.get(key));//get()通过键找到  值
 }

18.08_集合框架(HashMap集合键是Stirng值是String的案例)

​ HashMap 允许插入null键 null值
​import java.util.HashMap;

public class text7 {
public static void main(String[] args) {
HashMap<String,Integer>hashMap=new HashMap<>();
hashMap.put(“abc”,100);
hashMap.put(null,200);
hashMap.put(“bbb”,null);
hashMap.put(null,null);
System.out.println(hashMap);
}
}
输出
{null=null, abc=100, bbb=null}

Hashtable和HashMap 的区别

    // HashMap 允许存储null键和null值 线程不安全效率高
    //Hashtable 不允许null键和null值 线程安全效率低
    Hashtable<String, String> hashtable = new Hashtable<>();
    //hashtable.put(null,"abc"); 报错,不允许null键和null值

18.09_集合框架(HashMap集合键是String值是Student的案例)

A:案例演示:	HashMap集合键是String值是Student的案例

###18.10_集合框架(HashMap集合键是Student值是String的案例)(掌握)
键唯一 注意重写hashCode方法 和 equals 方法
A:案例演示: HashMap集合键是Student值是String的案例
import java.util.Objects;

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 "Student{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age &&
            Objects.equals(name, student.name);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

}


public class text7 {
    public static void main(String[] args) {
        HashMap<Student,String>hashMap=new HashMap<>();
        hashMap.put(new Student("张三",18),"学生");
        hashMap.put(new Student("李四",26),"工人");
        hashMap.put(new Student("王五",56),"科学家");
        System.out.println(hashMap);

    }
}

18.11_集合框架(LinkedHashMap的概述和使用)(了解)

A:LinkedHashMap的概述:	Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序
B:LinkedHashMap的特点: 底层的数据结构是链表和哈希表 元素有序 并且唯一
			元素的有序性由链表数据结构保证 唯一性由 哈希表数据结构保证
			Map集合的数据结构只和键有关
			
C:案例演示:	LinkedHashMap的特点
import java.util.LinkedHashMap;


public class text8 {
    public static void main(String[] args) {
        LinkedHashMap<Integer,String> linkedHashMap=new LinkedHashMap<>();
        linkedHashMap.put(60, "abc");
        linkedHashMap.put(313, "abc");
        linkedHashMap.put(10,"abc");
        linkedHashMap.put(20, "abc");
        linkedHashMap.put(30, "abc");
        linkedHashMap.put(40, "abc");
        linkedHashMap.put(50, "abc");
        linkedHashMap.put(60, "abc");
        linkedHashMap.put(70, "abc");
        linkedHashMap.put(70, "abcdddd");
        System.out.println(linkedHashMap);

    }
}
输出
{60=abc, 313=abc, 10=abc, 20=abc, 30=abc, 40=abc, 50=abc, 70=abcdddd}

18.12_集合框架(TreeMap集合键是String值是String的案例)(掌握)

​ TreeMap 键不允许插入null

A: TreeMap: 键的数据结构是红黑树,可保证键的排序和唯一性  
	    排序分为自然排序和比较器排序 
	    线程是不安全的效率比较高

18.13_集合框架(TreeMap集合键是Student值是String的案例)(掌握)

A:案例演示:	TreeMap集合键是Student值是String的案例
		按照年龄大小进行排序 
		注意键要实现Comparable 接口
		import java.util.Objects;

public class Student implements Comparable<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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }




    @Override
    public int compareTo(Student o) {
        int i=this.age-o.age;
        int j=i==0?this.getName().compareTo(o.getName()):i;
        return j;
    }
}


主类
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class text9 {
    public static void main(String[] args) {
        TreeMap<Student,Integer>treeMap=new TreeMap<>();
        treeMap.put(new Student("aaa",16),1);
        treeMap.put(new Student("bbb",20),2);
        treeMap.put(new Student("ccc",21),3);
        treeMap.put(new Student("ddd",16),4);
        treeMap.put(new Student("eee",15),5);
        treeMap.put(new Student("eee",15),5);
        Set<Map.Entry<Student,Integer>> entries=treeMap.entrySet();
        for(Map.Entry<Student,Integer>  en:entries)
        {
            Student key=en.getKey();
            int a=en.getValue();
            System.out.println(key.getName()+"==="+key.getAge()+"===="+a);

        }
    }
}

18.14_集合框架(统计字符串中每个字符出现的次数)(理解)

A:案例演示:	需求:统计字符串中每个字符出现的次数
	"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
	import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class MyTest {
    public static void main(String[] args) {
        //A:
        //案例演示:
        //需求:统计字符串中每个字符出现的次数
        //"aababcabcdabcde", 获取字符串中每一个字母出现的次数要求结果:a(5) b(4) c(3) d(2) e(1)
        Scanner scanner = new Scanner(System.in);
        System.out.println("请随便输入一行字符");
        String line = scanner.nextLine();
       // "aababcabcdabcde"
       // a(5) b(4) c(3)d(2) e(1)
        //思路:
        /*
        *  a-----5
        *  b------4
        * c------3
        * d------2
        * e------1
        * 通过观察,发现这个数据是键值对的数据,那我就会想到用Map 集合来存储这个数据
        *
        * 难点,在于我们要把用户输入的数据,存到集合中,还要统计一下个数
        *
        *
        * */


        HashMap<Character, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < line.length(); i++) {
            //截取字符,作为键,存到集合中
            //"aaababcabcdabcde"
            char ch = line.charAt(i);
            if(!hashMap.containsKey(ch)){
                hashMap.put(ch,1);
            }else{
                Integer integer = hashMap.get(ch);
                integer++;
                hashMap.put(ch,integer); //键相同,值覆盖
            }
        }

       // System.out.println(hashMap);

        //当这些数据存进去后,遍历集合,拼串拼成我想要的形状
       // a(5) b(4) c(3) d(2) e(1)
        StringBuilder sb = new StringBuilder();
        Set<Character> keySet = hashMap.keySet();
        for (Character key : keySet) {
            sb.append(key).append("(").append(hashMap.get(key)).append(")");
        }

        String s = sb.toString();
        System.out.println(s);
    }
}

18.19_集合框架(Collections工具类的概述和常见方法讲解)(掌握)

A:Collections类概述:	针对集合操作 的工具类
B:Collections成员方法
	public static <T> void sort(List<T> list):					排序,默认按照自然顺序
	public static <T> int binarySearch(List<?> list,T key):		二分查找
	public static <T> T max(Collection<?> coll):				获取最大值
	public static void reverse(List<?> list):					反转
	public static void shuffle(List<?> list):						随机置换
C:案例演示:	Collections工具类的常见方法讲解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值