Java进阶-Collection集合

news2024/11/25 16:37:31

1.Collection集合

1.1数组和集合的区别

  • 相同点

    都是容器,可以存储多个数据

  • 不同点

    • 数组的长度是不可变的,集合的长度是可变的

    • 数组可以存基本数据类型和引用数据类型

      集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类

1.2集合类体系结构

01_集合类体系结构图

1.3Collection 集合概述和使用

  • Collection集合概述

    • 是单列集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
    • JDK 不提供此接口的任何直接实现。它提供更具体的子接口(如Set和List)实现
  • 创建Collection集合的对象

    • 多态的方式
    • 具体的实现类ArrayList
  • Collection集合常用方法

    方法名说明
    boolean add(E e)添加元素
    boolean remove(Object o)从集合中移除指定的元素
    boolean removeIf(Object o)根据条件进行移除
    void clear()清空集合中的元素
    boolean contains(Object o)判断集合中是否存在指定的元素
    boolean isEmpty()判断集合是否为空
    int size()集合的长度,也就是集合中元素的个数

1.4Collection集合的遍历

迭代器介绍

  • 迭代器,集合的专用遍历方式
  • Iterator iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到

Iterator中的常用方法

  • boolean hasNext():判断当前位置是否有元素可以被取出
  • E next():获取当前位置的元素,将迭代器对象移向下一个索引位置

Collection集合的遍历

package com.iflytek.day19;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class _01_IteratorDemo {
    public static void main(String[] args) {
        //创建集合对象
        Collection<String> c = new ArrayList<>();

        //添加元素
        c.add("hello");
        c.add("world");
        c.add("java");
        c.add("javaee");

        //Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到
        Iterator<String> it = c.iterator();

        //用while循环改进元素的判断和获取
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
    }
}

迭代器中删除的方法

  • void remove():删除迭代器对象当前指向的元素
package com.iflytek.day19;

import java.util.ArrayList;
import java.util.Iterator;

public class _02_IteratorDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("d");

        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String s = it.next();
            if("b".equals(s)){
                //指向谁,那么此时就删除谁.
                it.remove();
            }
        }
        System.out.println(list);
    }
}

1.5增强for循环

介绍

  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
  • 实现Iterable接口的类才可以使用迭代器和增强for
  • 简化数组和Collection集合的遍历

格式

for(集合/数组中元素的数据类型 变量名 :  集合/数组名) {
	// 已经将当前遍历到的元素封装到变量中了,直接使用变量即可
}

代码

package com.iflytek.day19;

import java.util.ArrayList;

public class _03_CollectonDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");

        //1,数据类型一定是集合或者数组中元素的类型
        //2,str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素
        //3,list就是要遍历的集合或者数组
        for (String str : list) {
            System.out.println(str);
        }
    }
}

2.List集合

2.1List集合的概述和特点

List集合的概述

  • 有序集合,这里的有序指的是存取顺序
  • 用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
  • 与Set集合不同,列表通常允许重复的元素

List集合的特点

  • 存取有序
  • 可以重复
  • 有索引

2.2List集合的特有方法

方法名描述
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

3.数据结构

3.1数据结构之栈和队列

  • 栈结构

    ​ 先进后出

  • 队列结构

    ​ 先进先出

3.2数据结构之数组和链表

  • 数组结构

    ​ 查询快、增删慢

  • 链表结构

    ​ 查询慢、增删快

4.List集合的实现类

4.1List集合子类的特点

  • ArrayList集合

    ​ 底层是数组结构实现,查询快、增删慢

  • LinkedList集合

    ​ 底层是链表结构实现,查询慢、增删快

4.2 ArrayList集合的特有功能

4.2.1 ArrayList的构造方法和添加方法

public ArrayList()创建一个空的集合对象
public boolean add(E e)将指定的元素追加到此集合的末尾
public void add(int index,E element)在此集合中的指定位置插入指定的元素

ArrayList :

​ 可调整大小的数组实现

​ : 是一种特殊的数据类型,泛型。

怎么用呢 ?

​ 在出现E的地方我们使用引用数据类型替换即可

​ 举例:ArrayList, ArrayList

4.2.2 ArrayList类常用方法

**成员方法 : **

public boolean remove(Object o)删除指定的元素,返回删除是否成功
public E remove(int index)删除指定索引处的元素,返回被删除的元素
public E set(int index,E element)修改指定索引处的元素,返回被修改的元素
public E get(int index)返回指定索引处的元素
public int size()返回集合中的元素的个数

示例代码 :

package com.iflytek.day19.list;

import java.util.ArrayList;

public class ArrayListDemo01 {
    public static void main(String[] args) {
        //创建集合
        ArrayList<String> array = new ArrayList<String>();

        //添加元素
        array.add("hello");
        array.add("world");
        array.add("java");
        array.add("Spring");
        array.add("mybatis");
        array.add("hibernate");
        array.add("hadoop");
        array.add("hive");

        //public boolean remove(Object o):删除指定的元素,返回删除是否成功
        System.out.println(array.remove("world"));
        System.out.println(array.remove("javaee"));

        //public E remove(int index):删除指定索引处的元素,返回被删除的元素
        System.out.println(array.remove(1));

        //IndexOutOfBoundsException
        System.out.println(array.remove(3));

        //public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
        System.out.println(array.set(1, "javaee"));

        //IndexOutOfBoundsException
        System.out.println(array.set(20, "javaee"));

        //public E get(int index):返回指定索引处的元素
        System.out.println(array.get(0));
        System.out.println(array.get(1));x
        System.out.println(array.get(2));
        System.out.println(array.get(20)); //?????? 自己测试

        //public int size():返回集合中的元素的个数
        System.out.println(array.size());

        //输出集合
        System.out.println("array:" + array);
    }
}

4.2.3 ArrayList存储字符串并遍历

案例需求 :

​ 创建一个存储字符串的集合,存储3个字符串元素,使用程序实现在控制台遍历该集合

实现步骤 :

  1. 创建集合对象
  2. 往集合中添加字符串对象
  3. 遍历集合,首先要能够获取到集合中的每一个元素,这个通过get(int index)方法实现
  4. 遍历集合,其次要能够获取到集合的长度,这个通过size()方法实现
  5. 遍历集合的通用格式

代码实现 :

package com.iflytek.day19.list;

import java.util.ArrayList;

/*
    思路:
        1:创建集合对象
        2:往集合中添加字符串对象
        3:遍历集合,首先要能够获取到集合中的每一个元素,这个通过get(int index)方法实现
        4:遍历集合,其次要能够获取到集合的长度,这个通过size()方法实现
        5:遍历集合的通用格式
 */
public class ArrayListDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<String> array = new ArrayList<String>();

        //往集合中添加字符串对象
        array.add("刘正风");
        array.add("左冷禅");
        array.add("风清扬");

        //遍历集合,其次要能够获取到集合的长度,这个通过size()方法实现
//        System.out.println(array.size());

        //遍历集合的通用格式
        for(int i=0; i<array.size(); i++) {
            String s = array.get(i);
            System.out.println(s);
        }
    }
}

4.2.4 ArrayList存储学生对象并遍历

案例需求 :

​ 创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合

**实现步骤 : **

​ 1:定义学生类

​ 2:创建集合对象

​ 3:创建学生对象

​ 4:添加学生对象到集合中

​ 5:遍历集合,采用通用遍历格式实现

代码实现 :

package com.iflytek.day19.list;

import java.util.ArrayList;

/*
    思路:
        1:定义学生类
        2:创建集合对象
        3:创建学生对象
        4:添加学生对象到集合中
        5:遍历集合,采用通用遍历格式实现
 */
public class ArrayListDemo03 {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<Student> array = new ArrayList<>();

        //创建学生对象
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("风清扬", 33);
        Student s3 = new Student("张曼玉", 18);

        //添加学生对象到集合中
        array.add(s1);
        array.add(s2);
        array.add(s3);

        //遍历集合,采用通用遍历格式实现
        for (int i = 0; i < array.size(); i++) {
            Student s = array.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}

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;
    }
}

4.2.5 键盘录入学生信息到集合

案例需求 :

  • 创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合
  • 学生的姓名和年龄来自于键盘录入

实现步骤 :

  1. 定义学生类,为了键盘录入数据方便,把学生类中的成员变量都定义为String类型

  2. 创建集合对象

  3. 键盘录入学生对象所需要的数据

  4. 创建学生对象,把键盘录入的数据赋值给学生对象的成员变量

  5. 往集合中添加学生对象

  6. 遍历集合,采用通用遍历格式实现

代码实现 :

package com.iflytek.day19.list;

import java.util.ArrayList;
import java.util.Scanner;

/*
    思路:
        1:定义学生类,为了键盘录入数据方便,把学生类中的成员变量都定义为String类型
        2:创建集合对象
        3:键盘录入学生对象所需要的数据
        4:创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
        5:往集合中添加学生对象
        6:遍历集合,采用通用遍历格式实现
 */
public class ArrayListDemo04 {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<Student> array = new ArrayList<Student>();

        //为了提高代码的复用性,我们用方法来改进程序
        addStudent(array);
        addStudent(array);
        addStudent(array);

        //遍历集合,采用通用遍历格式实现
        for (int i = 0; i < array.size(); i++) {
            Student s = array.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
    }

    /*
        两个明确:
            返回值类型:void
            参数:ArrayList<Student> array
     */
    public static void addStudent(ArrayList<Student> array) {
        //键盘录入学生对象所需要的数据
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入学生姓名:");
        String name = sc.nextLine();

        System.out.println("请输入学生年龄:");
        int age = sc.nextInt();

        //创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
        Student s = new Student();
        s.setName(name);
        s.setAge(age);

        //往集合中添加学生对象
        array.add(s);
    }
}

4.3LinkedList集合的特有功能

特有方法

方法名说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

5.泛型

5.1泛型概述

泛型的介绍

​ 泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

泛型的好处

  1. 把运行时期的问题提前到了编译期间
  2. 避免了强制类型转换

泛型的定义格式

  • <类型>:指定一种类型的格式。尖括号里面可以任意书写,一般只写一个字母。例如:
  • <类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。例如:<E,T> <K,V>

5.2泛型类

定义格式

修饰符 class 类名<类型> {  }

示例代码

  • 泛型类

    package com.iflytek.day19.generic;
    
    public class Generic<T> {
        private T t;
    
        public T getT() {
            return t;
        }
    
        public void setT(T t) {
            this.t = t;
        }
    }
    
  • 测试类

    package com.iflytek.day19.generic;
    
    public class GenericDemo01 {
        public static void main(String[] args) {
            Generic<String> g1 = new Generic<String>();
            g1.setT("杨幂");
            System.out.println(g1.getT());
    
            Generic<Integer> g2 = new Generic<Integer>();
            g2.setT(30);
            System.out.println(g2.getT());
    
            Generic<Boolean> g3 = new Generic<Boolean>();
            g3.setT(true);
            System.out.println(g3.getT());
        }
    }
    

5.3泛型方法

定义格式

修饰符 <类型> 返回值类型 方法名(类型 变量名) {  }

示例代码

  • 带有泛型方法的类

    public class Generic02 {
        public <T> void show(T t) {
            System.out.println(t);
        }
    }
    
  • 测试类

    package test;
    
    public class GenericDemo02 {
        public static void main(String[] args) {
            Generic02 g = new Generic02();
            g.show("柳岩");
            g.show(30);
            g.show(true);
            g.show(12.34);
        }
    }
    

5.4泛型接口

定义格式

修饰符 interface 接口名<类型> {  }

示例代码

  • 泛型接口

    public interface Generic03<T> {
        void show(T t);
    }
    
  • 泛型接口实现类1

    ​ 定义实现类时,定义和接口相同泛型,创建实现类对象时明确泛型的具体类型

    public class GenericImpl01<T> implements Generic03<T> {
        @Override
        public void show(T t) {
            System.out.println(t);
        }
    }
    
  • 泛型接口实现类2

    ​ 定义实现类时,直接明确泛型的具体类型

    public class GenericImpl02 implements Generic03<Integer>{
         @Override
         public void show(Integer t) {
              System.out.println(t);
         }
    }
    
  • 测试类

    public class GenericDemo03 {
        public static void main(String[] args) {
            GenericImpl01<String> g1 = new GenericImpl<String>();
            g1.show("林青霞");
            GenericImpl01<Integer> g2 = new GenericImpl<Integer>();
            g2.show(30);
          
            GenericImpl02 g3 = new GenericImpl02();
          	g3.show(10);
        }
    }
    
    

5.5类型通配符

  • 类型通配符:<?>

    • ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
    • 但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型
  • 类型通配符上限:<? extends 类型>

    • ArrayListList <? extends Number>:它表示的类型是Number或者其子类型
  • 类型通配符下限:<? super 类型>

    • ArrayListList <? super Number>:它表示的类型是Number或者其父类型
  • 泛型通配符的使用

    package com.iflytek.day19.generic;
    
    import java.util.ArrayList;
    
    public class GenericDemo04 {
        public static void main(String[] args) {
            ArrayList<Integer> list1 = new ArrayList<>();
            ArrayList<String> list2 = new ArrayList<>();
            ArrayList<Number> list3 = new ArrayList<>();
            ArrayList<Object> list4 = new ArrayList<>();
    
            method(list1);
            method(list2);
            method(list3);
            method(list4);
    
            getElement1(list1);
    //        getElement1(list2);//报错
            getElement1(list3);
    //        getElement1(list4);//报错
    
    //        getElement2(list1);//报错
    //        getElement2(list2);//报错
            getElement2(list3);
            getElement2(list4);
        }
      
        // 泛型通配符:此时的泛型?,可以是任意类型
        public static void method(ArrayList<?> list){}
        // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
        public static void getElement1(ArrayList<? extends Number> list){}
        // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
        public static void getElement2(ArrayList<? super Number> list){}
    
    }
    

6.Set集合

6.1Set集合概述和特点

  • 不可以存储重复元素
  • 没有索引,不能使用普通for循环遍历

7.HashSet集合

7.1HashSet集合概述和特点

  • 底层数据结构是哈希表
  • 存取无序
  • 不可以存储重复元素
  • 没有索引,不能使用普通for循环遍历

7.2HashSet集合的基本应用

存储字符串并遍历

package com.iflytek.day19.set;

import java.util.HashSet;

public class HashSetDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        HashSet<String> set = new HashSet<String>();

        //添加元素
        set.add("hello");
        set.add("world");
        set.add("java");
        //不包含重复元素的集合
        set.add("world");

        //遍历
        for(String s : set) {
            System.out.println(s);
        }
    }
}

7.3HashSet集合存储学生对象并遍历

案例需求

  • 创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
  • 要求:学生对象的成员变量值相同,我们就认为是同一个对象

代码实现

  • 学生类
package com.iflytek.day19.set;

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 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;
    }
}
  • 测试类
package com.iflytek.day19.set;

import java.util.HashSet;

public class HashSetDemo02 {
    public static void main(String[] args) {
        //创建HashSet集合对象
        HashSet<Student> hs = new HashSet<Student>();

        //创建学生对象
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("张曼玉", 35);
        Student s3 = new Student("王祖贤", 33);

        Student s4 = new Student("王祖贤", 33);

        //把学生添加到集合
        hs.add(s1);
        hs.add(s2);
        hs.add(s3);
        hs.add(s4);

        //遍历集合(增强for)
        for (Student s : hs) {
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}
  • 总结

    ​ HashSet集合存储自定义类型元素,要想实现元素的唯一,要求必须重写hashCode方法和equals方法

8.Map集合

8.1Map集合概述和特点

Map集合概述

interface Map<K,V>  K:键的类型;V:值的类型

Map集合的特点

  • 双列集合,一个键对应一个值
  • 键不可以重复,值可以重复

Map集合的基本使用

package com.iflytek.day19.map;

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

public class MapDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();

        //V put(K key, V value) 将指定的值与该映射中的指定键相关联
        map.put("sias001", "林青霞");
        map.put("sias002", "张曼玉");
        map.put("sias003", "王祖贤");
        map.put("sias003", "柳岩");

        //输出集合对象
        System.out.println(map);
    }
}

8.2Map集合的基本功能

方法介绍

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数

示例代码

package com.iflytek.day19.map;

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

public class MapDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();

        //V put(K key,V value):添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");
        map.put("耶律齐", "郭芙");

        //V remove(Object key):根据键删除键值对元素
        System.out.println(map.remove("郭靖"));
        System.out.println(map.remove("郭襄"));

        //void clear():移除所有的键值对元素
//        map.clear();

        //boolean containsKey(Object key):判断集合是否包含指定的键
        System.out.println(map.containsKey("张无忌"));
        System.out.println(map.containsKey("郭襄"));

        //boolean isEmpty():判断集合是否为空
        System.out.println(map.isEmpty());

        //int size():集合的长度,也就是集合中键值对的个数
        System.out.println(map.size());

        //输出集合对象
        System.out.println(map);
    }
}

8.3Map集合的获取功能

方法介绍

方法名说明
V get(Object key)根据键获取值
Set keySet()获取所有键的集合
Collection values()获取所有值的集合
Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合

示例代码

package com.iflytek.day19.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class MapDemo03 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();

        //添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");

        //V get(Object key):根据键获取值
//        System.out.println(map.get("张无忌"));
//        System.out.println(map.get("张三丰"));

        //Set<K> keySet():获取所有键的集合
//        Set<String> keySet = map.keySet();
//        for(String key : keySet) {
//            System.out.println(key);
//        }

        //Collection<V> values():获取所有值的集合
        Collection<String> values = map.values();
        for (String value : values) {
            System.out.println(value);
        }
    }
}

8.4Map集合的遍历(方式1)

遍历思路

  • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
    • 把所有的丈夫给集中起来
    • 遍历丈夫的集合,获取到每一个丈夫
    • 根据丈夫去找对应的妻子

步骤分析

  • 获取所有键的集合。用keySet()方法实现
  • 遍历键的集合,获取到每一个键。用增强for实现
  • 根据键去找值。用get(Object key)方法实现

代码实现

package com.iflytek.day19.map;

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

public class MapDemo04 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();

        //添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");

        //获取所有键的集合。用keySet()方法实现
        Set<String> keySet = map.keySet();
        //遍历键的集合,获取到每一个键。用增强for实现
        for (String key : keySet) {
            //根据键去找值。用get(Object key)方法实现
            String value = map.get(key);
            System.out.println(key + "," + value);
        }
    }
}

8.5Map集合的遍历(方式2)

遍历思路

  • 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合
    • 获取所有结婚证的集合
    • 遍历结婚证的集合,得到每一个结婚证
    • 根据结婚证获取丈夫和妻子

步骤分析

  • 获取所有键值对对象的集合
    • Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合
  • 遍历键值对对象的集合,得到每一个键值对对象
    • 用增强for实现,得到每一个Map.Entry
  • 根据键值对对象获取键和值
    • 用getKey()得到键
    • 用getValue()得到值

代码实现

package com.iflytek.day19.map;

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

public class MapDemo05 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();

        //添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");

        //获取所有键值对对象的集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        //遍历键值对对象的集合,得到每一个键值对对象
        for (Map.Entry<String, String> me : entrySet) {
            //根据键值对对象获取键和值
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + "," + value);
        }
    }
}

9.HashMap集合

9.1HashMap集合概述和特点

  • HashMap底层是哈希表结构的
  • 依赖hashCode方法和equals方法保证键的唯一
  • 如果键要存储的是自定义对象,需要重写hashCode和equals方法

9.2HashMap集合应用案例

案例需求

  • 创建一个HashMap集合,键是学生对象(Student),值是居住地 (String)。存储多个元素,并遍历。
  • 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象

代码实现

学生类

package com.iflytek.day19.map;

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 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);
    }
}

测试类

package com.iflytek.day19.map;

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

public class HashMapDemo {
    public static void main(String[] args) {
        //创建HashMap集合对象
        HashMap<Student, String> hm = new HashMap<Student, String>();

        //创建学生对象
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("张曼玉", 35);
        Student s3 = new Student("王祖贤", 33);
        Student s4 = new Student("王祖贤", 33);

        //把学生添加到集合
        hm.put(s1, "西安");
        hm.put(s2, "武汉");
        hm.put(s3, "郑州");
        hm.put(s4, "北京");

        //遍历集合
        Set<Student> keySet = hm.keySet();
        for (Student key : keySet) {
            String value = hm.get(key);
            System.out.println(key.getName() + "," + key.getAge() + "," + value);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04开机界面黑屏,只有一个光标闪烁

接下来我就把我的解决方法完整的发出来&#xff0c;因为我也是非常的绝望&#xff0c;终于在不断尝试中解决了问题 首先开机界面就是这个东西&#xff0c;一直卡在这不动了&#xff0c;原因就是&#xff0c;内存被用完了&#xff0c;无法加载出图形化界面 解决方法&#xff1…

springboot基于vue的MOBA类游戏攻略分享平台

系统分析 系统可行性分析 1、经济可行性 由于本系统本身存在一些技术层面的缺陷&#xff0c;并不能直接用于商业用途&#xff0c;只想要通过该系统的开发提高自身学术水平&#xff0c;不需要特定服务器等额外花费。所有创造及工作过程仅需在个人电脑上就能实现&#xff0c;使…

Redis学习--下载与安装

Redis下载与安装 Redis安装包分为windows版和Linux版&#xff1a; Windows版下载地址&#xff1a;https://github.com/microsoftarchive/redis/releases Linux版下载地址&#xff1a;https:/download.redis.io/releases 在Linux系统安装Redis步骤&#xff1a; 1.将Redis安装…

JENKINS部署-学习踩坑日记

1、JENKINS情况介绍 使用docker安装JENKINS&#xff0c;教程可以在网上搜到&#xff0c;步骤执行&#xff1b; 2、服务器情况介绍 JENKINS部署在A服务器上面&#xff0c;要把项目从gitlab上面拉取下来&#xff0c;然后编译推送jar到B服务器&#xff0c;然后通过docker-compose…

Linux:文本三剑客之sed编辑器

Linux&#xff1a;sed编辑器 一、sed1.1 sed编辑器1.2 sed编辑器的工作流程1.3 命令格式1.4常用选项1.5 常用操作1.6 实际应用 一、sed 1.1 sed编辑器 sed是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器可以根据命…

理解JVM

认识JVM Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 字节码的虚拟机。 什么是字节码&#xff1f; 字节码就是jvm能理解的代码。即扩展名为 .class 的文件。 我们日常的java文件先编译成.class 文件 然后在jvm上运行。 个人觉得 内存区域是理解JVM相关的基石。所以彻…

微服务简介,SpringCloud Alibaba Nacos的安装部署与使用,Nacos集成springboot

目录 一.认识微服务 1.0.学习目标 1.1.单体架构 单体架构的优缺点如下&#xff1a; 1.2.分布式架构 分布式架构的优缺点&#xff1a; 1.3.微服务 微服务的架构特征&#xff1a; 1.4.SpringCloud 1.5Nacos注册中心 1.6.总结 二、Nacos基本使用 &#xff08;一&…

【C++】深入剖析C++11新特性

目录 一、C11简介 二、统一的列表初始化 1.&#xff5b;&#xff5d;初始化 2.std::initializer_list 三、声明 1.auto 2.decltype 3.nullptr 四、范围for 五、final和oberride 六、STL中一些变化 1.array 2.forward_list 3.unordered_map和unordered_set 七、右…

RabbitMQ养成记 (2. java操作MQ快速入门,日志监控,消息追踪)

快速入门 刚开始我们就一步一步来&#xff0c; 先搞什么spring集成。 先使用原始的java代码来操作一下MQ。 这里给新手兄弟的建议&#xff0c;这种技术性的学习 一定要先动手&#xff0c;从简单的地方动手&#xff0c;一步一步来&#xff0c;不然上来就搞理论或者复杂的应用很…

JDBC API

注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); 所谓的注册驱动&#xff0c;就是让JDBC程序加载mysql驱动程序&#xff0c;并管理驱动 驱动程序实现了JDBC API定义的接口以及和数据库服务器交互的功能&#xff0c;加载驱动是为了方便使用这些功能。 获…

Spring IOC相关注解运用——下篇

目录 一、Configuration 二、ComponentScan 1. 说明 2. 测试方法 3. 运行结果 三、PropertySource 1. 说明 2. 测试方法 3. 测试结果 四、Bean 1. 说明 2. 添加驱动依赖 3. 将Connection对象放入Spring容器 3. 测试 五、Import 1. 说明 2. 测试方法 3. 运行结…

从一道go逆向出发,讨论类tea的逆算法

tea代码很短&#xff0c;经常被直接复制为源码&#xff08;而不是像标准算法那样调库&#xff09;。在ctf逆向中也算比较常见&#xff0c;复杂度适中。 例题是一道go逆向&#xff0c;经go parser处理后&#xff0c;核心代码如下图。 panic算是go的专有名词&#xff0c;类似异常…

吃透 Spring AOP (1.理解概念)

理解 什么是AOP AOP&#xff0c;全称面向切面编程。 它可以说是对面向对象OOP的思想升华。从总的理解来讲&#xff0c;AOP是横向对不同程序的抽象。这个思想要不断实践动手之后&#xff0c;才会有很深刻的理解 理解 代理模式 在理解AOP之前&#xff0c;我们首先要单独说一个…

FFMPEG录屏(16)--- MAG(Magnification)捕获桌面

最近增加了对Magnification API捕获桌面的支持&#xff0c;记录一下过程和其中遇到的问题。 参考资料 Magnification API overview Magnification API sample webrtc screen_capturer_win_magnifier.cc Structured Exception Handling (C/C) 前言 我又不得不吐槽一下了&a…

【JavaWeb】-- HTTP、Tomcat、Servlet

文章目录 HTTP1.简介2.请求数据格式2.2.1 格式介绍 3.响应数据格式3.1 格式介绍3.2 响应状态码 Tomcat1.简介1.1 什么是Web服务器 2.基本使用2.1 安装2.2 启动2.3 关闭 3.Maven创建Web项目4.IDEA使用Tomcat4.1集成本地Tomcat4.2 Tomcat Maven插件 Servlet1.简介2.快速入门3.执行…

okhttp篇3:RealCall

Call Call一般代表一个已经准备好的Request&#xff0c;Request的包装类&#xff0c;可执行&#xff0c;它一般有两个主要的方法&#xff1a; execute(立即执行&#xff0c;并阻塞线程&#xff0c;直到Response返回)enqueue(将Request放入队列&#xff0c;等待线程池调度执行…

spring源码学习_01 本地环境搭建

参考网上各种资源&#xff0c;终于把spring源码运行起来了&#xff1b;步骤总结如下&#xff1a; spring版本&#xff1a; 5.2.x 本地系统mac idea 2019.3.2 下载地址&#xff1a;https://www.jetbrains.com/idea/download/other.html jdk 11 下载地址&#xff1a;https://repo…

【设计模式二十三剑】✨编写更高质量代码的秘诀✨

文章目录 ✨✨简述&#x1f386;【万能之门】简单工厂模式&#xff08;Simple Factory&#xff09;&#x1f387;【制造之剑】工厂方法模式&#xff08;Factory Method&#xff09;&#x1f387;【生产之剑】抽象工厂模式&#xff08;Abstract Factory&#xff09;&#x1f387…

C语言基础知识:函数的调用

函数的定义 一般来说&#xff0c;执行源程序就是执行主函数main&#xff0c;其他函数只能被主函数所调用&#xff0c;而其他函数之间也可以相互调用。 1.标准库函数&#xff1a; 分为&#xff1a;I/O函数&#xff0c;字符串&#xff0c;字符处理函数&#xff0c;数学函数&am…

Go语言的函数和defer用法

目录 函数的基本用法 函数中的变长参数 递归函数(recursion) 函数是“一等公民” 函数中defer的用法 defer的底层原理 使用 defer 跟踪函数的执行过程 defer的注意事项 &#xff08;1&#xff09;Go语言内置的函数中哪些可以作为deferred 函数 &#xff08;2&#xf…