2024年C C++最新Java-集合框架(刨析源码,深层讲解)_ggbond代码,字节跳动面试必问

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

2.3 清空集合
方法
void clear()
2.4 判断是否是空集合
方法
boolean isEmpty()
2.5 判断是否包含某个元素
方法一方法二
boolean contains(Object obj)boolean containsAll(Collection c)

通过调用元素的equals方法来(挨个)比较判断是否是同一个对象

2.6 删除
方法一方法二
boolean remove(Object obj)boolean removeAll(Collection coll)

通过调用元素的equals方法来判断是否是要删除的某个元素,只会删除找到的第一个元素/删除当前集合里的指定某个子集合,即取当前集合的差集

2.7 取两个集合的交集
方法
boolean retainAll(Collection c)

把交集的结果存在当前集合中

2.8 判断集合是否相等
方法
boolean equals(Object obj)
2.9 转成对象数组
方法
Object[] toArray()
2.10 获取集合对象的哈希值
方法
hashCode()
2.11 遍历
方法
iterator()

返回迭代器对象,用于集合遍历

2.12 代码演示
@Test
public void test1(){
        Collection coll = new ArrayList();

        //add(Object e):将元素e添加到集合coll中
        coll.add("AA");
        coll.add("BB");
        coll.add(123);//自动装箱
        coll.add(new Date());

        //size():获取添加的元素的个数
        System.out.println(coll.size());//4

        //addAll(Collection coll1):将coll1集合中的元素添加到当前的集合中
        Collection coll1 = new ArrayList();
        coll1.add(456);
        coll1.add("CC");
        coll.addAll(coll1);

        System.out.println(coll.size());//6
        System.out.println(coll);//[AA, BB, 123, Tue Apr 19 22:51:41 CST 2022, 456, CC]

        //clear():清空集合元素
        coll.clear();

        //isEmpty():判断当前集合是否为空
        System.out.println(coll.isEmpty());//true
    }

@Test
   public void test2(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
// Person p = new Person("Jerry",20);
// coll.add(p);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        //1.contains(Object obj):判断当前集合中是否包含obj
        //我们在判断时会调用obj对象所在类的equals()。
        boolean contains = coll.contains(123);
        System.out.println(contains);//true
        System.out.println(coll.contains(new String("Tom")));//true
// System.out.println(coll.contains(p));//true
        System.out.println(coll.contains(new Person("Jerry",20)));//false 

        //2.containsAll(Collection coll1):判断形参coll1中的所有元素是否都存在于当前集合中。
        Collection coll1 = Arrays.asList(123,4567);
        System.out.println(coll.containsAll(coll1));//false
    }


@Test
    public void test3(){
        //3.remove(Object obj):从当前集合中移除obj元素。
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        coll.remove(1234);
        System.out.println(coll);//[123, 456, Person@621be5d1, Tom, false]

        coll.remove(new Person("Jerry",20));
        System.out.println(coll);//[123, 456, Person@621be5d1, Tom, false]

        //4. removeAll(Collection coll1):差集:从当前集合中移除coll1中所有的元素。
        Collection coll1 = Arrays.asList(123,456);
        coll.removeAll(coll1);
        System.out.println(coll);//[Person@621be5d1, Tom, false]
    }

    @Test
    public void test4(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        //5.retainAll(Collection coll1):交集:获取当前集合和coll1集合的交集,并返回给当前集合
       Collection coll1 = Arrays.asList(123,456,789);
       coll.retainAll(coll1);
       System.out.println(coll);//[123, 456]

        //6.equals(Object obj):要想返回true,需要当前集合和形参集合的元素都相同。
        Collection coll2 = new ArrayList();
        coll2.add(456);
        coll2.add(123);
        coll2.add(new Person("Jerry",20));
        coll2.add(new String("Tom"));
        coll2.add(false);
        System.out.println(coll.equals(coll2));//false
    }

   @Test
    public void test5() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry", 20));
        coll.add(new String("Tom"));
        coll.add(false);

        //7.hashCode():返回当前对象的哈希值
        System.out.println(coll.hashCode());//1412105286

        //8.集合 --->数组:toArray()
        Object[] arr = coll.toArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        //123
        //456
        //Person@621be5d1
        //Tom
        //false

        //拓展:数组 --->集合:调用Arrays类的静态方法asList()
        List<String> list = Arrays.asList(new String[]{"AA", "BB", "CC"});
        System.out.println(list);//[AA, BB, CC]

        List arr1 = Arrays.asList(new int[]{123, 456});
        System.out.println(arr1.size());//1

        List arr2 = Arrays.asList(new Integer[]{123, 456});
        System.out.println(arr2.size());//2
    }
}

3. Collection子接口之一:List接口
3.1 概述

(1)鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组。

(2)List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引,即“动态”数组,替换原有的数组。

(3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

(4)JDK APIList接口的实现类常用的有:ArrayListLinkedListVector

3.2 方法

List除了从Collection集合继承的方法外,List 集合里还添加了一些根据索引来操作集合元素的方法。

方法描述
void add(int index, Object ele)index位置插入ele元素
boolean addAll(int index, Collection eles)index位置开始将集合eles中的所有元素添加进来
Object get(int index)获取指定index位置的元素
int indexOf(Object obj)返回obj在集合中首次出现的位置
int lastIndexOf(Object obj)返回obj在当前集合中末次出现的位置
Object remove(int index)移除指定index位置的元素,并返回此元素
Object set(int index, Object ele)设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex)返回从fromIndextoIndex位置的子集合

常用方法总结:

作用方法
add(Object obj)
remove(int index) / remove(Object obj)
set(int index, Object ele)
get(int index)
add(int index, Object ele)
长度size()
遍历Iterator迭代器方式 ② 增强for循环 ③ 普通的循环
3.2.1 代码演示
@Test
        public void test1(){
            ArrayList list = new ArrayList();
            list.add(123);
            list.add(456);
            list.add("AA");
            list.add(new Person("Tom",12));
            list.add(456);
    
            System.out.println(list);//[123, 456, AA, Person@621be5d1, 456]
    
            //void add(int index, Object ele):在index位置插入ele元素
            list.add(1,"BB");
            System.out.println(list);//[123, BB, 456, AA, Person@621be5d1, 456]
            
            //boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
            List list1 = Arrays.asList(1, 2, 3);
            list.addAll(list1);
    // list.add(list1);
            System.out.println(list.size());//9
    
            //Object get(int index):获取指定index位置的元素
            System.out.println(list.get(0));//123
    
        }


  @Test
    public void test2(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom",12));
        list.add(456);
        //int indexOf(Object obj):返回obj在集合中首次出现的位置。如果不存在,返回-1.
        int index = list.indexOf(4567);
        System.out.println(index);//-1

        //int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置。如果不存在,返回-1.
        System.out.println(list.lastIndexOf(456));//4

        //Object remove(int index):移除指定index位置的元素,并返回此元素
        Object obj = list.remove(0);
        System.out.println(obj);//123
        System.out.println(list);//[456, AA, Person@621be5d1, 456]

        //Object set(int index, Object ele):设置指定index位置的元素为ele
        list.set(1,"CC");
        System.out.println(list);//[456, CC, Person@621be5d1, 456]

        //List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的左闭右开区间的子集合
        List subList = list.subList(2, 4);
        System.out.println(subList);//[Person@621be5d1, 456]
        System.out.println(list);//[456, CC, Person@621be5d1, 456]
    }

 @Test
    public void test3(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");

        //方式一:Iterator迭代器方式
        Iterator iterator = list.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //123
        //456
        //AA
        

        //方式二:增强for循环
        for(Object obj : list){
            System.out.println(obj);
        }
        //123
        //456
        //AA



        //方式三:普通for循环
        for(int i = 0;i < list.size();i++){
            System.out.println(list.get(i));
        }
        //123
        //456
        //AA
    }

3.3 List实现类之一:ArrayList
3.3.1 概述

⭕ 作为List接口的主要实现类;

⭕ 线程不安全的,效率高;

⭕ 底层使用Object[] elementData存储。

3.3.2 源码分析

jdk 7:

🔺空参的构造器中,底层默认创建了长度是10的Object[]数组elementData

 ArrayList list = new ArrayList();
 list.add(123);//elementData[0] = new Integer(123);

🔺如果此次的添加导致底层elementData数组容量不够,则扩容。
默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。

🔺建议开发中使用带参的构造器:默认创建指定长度的数组 。

ArrayList list = new ArrayList(int capacity)//默认创建指定长度的数组

jdk 8:

🔺底层Object[] elementData初始化为{},并没有创建长度为10的数组

ArrayList list = new ArrayList();

🔺第一次调用add()时,底层才创建了长度10的数组,并将数据123添加elementData[0]

list.add(123);

🔺后续的添加和扩容操作与jdk7相同。

结论:jdk7中的ArrayList的对象的创建类似于单例的饿汉式,而jdk8中的ArrayList的对象的创建类似于单例的懒汉式,延迟了数组的创建,节省内存。

3.4 List实现类之二:LinkedList

在这里插入图片描述

3.4.1 概述

⭕ 对于频繁的插入、删除操作,使用此类效率比ArrayList高;

⭕ 底层使用双向链表存储。

LinkedList:双向链表,内部没有声明数组,而是定义了Node类型的firstlast
用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。

Node除了保存数据,还定义了两个变量:
prev变量记录前一个元素的位置
next变量记录下一个元素的位置

在这里插入图片描述

3.4.2 源码分析
LinkedList list = new LinkedList(); //内部声明了Node类型的first和last属性,默认值为null

list.add(123);//将123封装到Node中,创建了Node对象。 

//Node定义为:(体现了LinkedList的双向链表的说法)
private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
          this.item = element;
          this.next = next;
          this.prev = prev;
        }
}

3.5 List实现类之三:Vector
3.5.1 概述

⭕ 作为List接口的古老实现类。

⭕ 线程安全的,效率低。

⭕ 底层使用Object[] elementData存储。

⭕在各种list中,最好把ArrayList作为缺省选择。当插入、删除频繁时,使用LinkedListVector总是比ArrayList慢,所以尽量避免使用。

⭕新增方法:

方法
void addElement(Object obj)
void insertElementAt(Object obj,int index)
void setElementAt(Object obj,int index)
void removeElement(Object obj)
void removeAllElements()
3.5.2 源码分析

jdk7jdk8中通过Vector()构造器创建对象时,底层都创建了长度为10的数组。 在扩容方面,默认扩容为原来的数组长度的2倍。

3.6 ArrayList、LinkedList、Vector三者的异同?

⭕ 同:
① 三个类都是实现了List接口。
② 存储数据的特点相同:存储有序的、可重复的数据。

⭕ 不同:见上

4. Collection子接口之二:Set接口
4.1 概述

Set接口是Collection的子接口,set接口没有提供额外的方法。

⭕ 存储无序的、不可重复的数据。Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。

Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法

⭕ 要求:
Set(主要指:HashSetLinkedHashSet)中添加的数据,其所在的类一定要重写hashCode()equals(),且重写的hashCode()equals()尽可能保持一致性:相等的对象必须具有相等的散列码。
重写两个方法的小技巧:对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值。

⭕ 重写 hashCode() 方法的基本原则

  • 在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值。
  • 当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode()方法的返回值也应相等。
  • 对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值。

⭕ 重写 equals() 方法的基本原则

以自定义的Customer类为例,何时需要重写equals()

当一个类有自己特有的“逻辑相等”概念,当改写equals()的时候,总是要改写hashCode(),根据一个类的equals()方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode()方法, 它们仅仅是两个对象。
因此,违反了“相等的对象必须具有相等的散列码”。

结论:重写equals方法的时候一般都需要同时复写hashCode方法。通常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。

4.2 Set实现类之一:HashSet
4.2.1 概述

存储无序的、不可重复的数据。

  • 无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
  • 不可重复性:保证添加的元素按照equals()判断时,不能返回true.即:相同的元素只能添加一个。
4.2.2 添加元素的过程

我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:

  1. 如果此位置上没有其他元素,则元素a添加成功。 —>情况1
  2. 如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素bhash值:
    2.1 如果hash值不相同,则元素a添加成功。—>情况2
    2.2 如果hash值相同,进而需要调用元素a所在类的equals()方法:
    equals()返回true,元素a添加失败
    equals()返回false,则元素a添加成功。—>情况3

对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。
jdk 7 :元素a放到数组中,指向原来的元素。
jdk 8 :原来的元素在数组中,指向元素a
口诀:七上八下

在这里插入图片描述

4.2.3 代码演示
   @Test
    public void test(){
        Set set = new HashSet();
        set.add(456);
        set.add(123);
        set.add(123);
        set.add("AA");
        set.add("CC");
        set.add(new User("Tom",12));
        set.add(new User("Tom",12));
        set.add(129);

        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //AA
        //CC
        //129
        //456
        //User@621be5d1
        //User@573fd745
        //123
    }

4.3 Set实现类之二:LinkedHashSet
4.3.1 概述

LinkedHashSetHashSet 的子类。

LinkedHashSet 根据元素的hashCode值来决定元素的存储位置,但它同时使用双向链表维护元素的次序,这使得元素看起来是以插入顺序保存的。在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据。

LinkedHashSet插入性能略低于 HashSet,但在迭代访问Set里的全部元素时有很好的性能。对于频繁的遍历操作,LinkedHashSet效率高于HashSet

LinkedHashSet 不允许集合元素重复。

4.3.2 代码演示
    @Test
    public void test(){
        Set set = new LinkedHashSet();
        set.add(456);
        set.add(123);
        set.add(123);
        set.add("AA");
        set.add("CC");
        set.add(new User("Tom",12));
        set.add(new User("Tom",12));
        set.add(129);

        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //456
        //123
        //AA
        //CC
        //User@621be5d1
        //User@573fd745
        //129
        //
        //Process finished with exit code 0
    }

在这里插入图片描述

4.4 Set实现类之三:TreeSet
4.4.1 概述

TreeSetSortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。

TreeSet底层使用红黑树结构存储数据。

⭕ 向TreeSet中添加的数据,要求是相同类的对象。

TreeSet 两种排序方法:自然排序和定制排序。默认情况下,TreeSet采用自然排序。

  • 自然排序
    TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序(默认情况)排列
  • 定制排序
    比较两个对象是否相同的标准为:compare()返回0,不再是equals().

特点:有序,查询速度比List快

4.4.2 排序—自然排序

⭕ 如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口,实现 Comparable 的接口的类必须实现compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj) 方法的返回值来比较大小。

⭕ 向 TreeSet 中添加元素时,只有第一个元素无须比较compareTo()方法,后面添加的所有元素都会调用compareTo()方法进行比较。

⭕ 因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同 一个类的对象。

⭕ 对于 TreeSet 集合而言,它判断两个对象是否相等的唯一标准是:两个对象通过 compareTo(Object obj)方法比较返回值。

⭕ 当需要把一个对象放入 TreeSet 中,重写该对象对应的 equals() 方法时,应保证该方法与 compareTo(Object obj) 方法有一致的结果:如果两个对象通过 equals() 方法比较返回 true,则通过 compareTo(Object obj)方法比较应返回 0。否则,让人难以理解。

4.4.3 排序—定制排序

TreeSet的自然排序要求元素所属的类实现Comparable接口,如果元素所属的类没有实现Comparable接口,或不希望按照升序(默认情况)的方式排列元素或希望按照 其它属性大小进行排序,则考虑使用定制排序。

⭕ 定制排序,通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。

⭕ 利用int compare(T o1,T o2)方法,比较o1o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2

⭕ 要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构 造器。此时,仍然只能向TreeSet中添加类型相同的对象。否则发生ClassCastException异常。

⭕ 使用定制排序判断两个元素相等的标准是:通过Comparator比较两个元素返回了0。

4.4.4 代码演示
@Test
    public void test(){
        Comparator com = new Comparator() {
            //按照年龄从小到大排列
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof User && o2 instanceof User){
                    User u1 = (User)o1;
                    User u2 = (User)o2;
                    return Integer.compare(u1.getAge(),u2.getAge());
                }else{
                    throw new RuntimeException("输入的数据类型不匹配");
                }
            }
        };

        TreeSet set = new TreeSet(com);
        set.add(new User("Tom",12));
        set.add(new User("Jerry",32));
        set.add(new User("Jim",2));
        set.add(new User("Mike",65));
        set.add(new User("Mary",33));
        set.add(new User("Jack",33));
        set.add(new User("Jack",56));


        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //User@621be5d1
        //User@573fd745
        //User@15327b79
        //User@4f2410ac
        //User@722c41f4
        //User@5b80350b

    }

 @Test
    public void test1(){
        TreeSet set = new TreeSet();

        //失败:不能添加不同类的对象
// set.add(123);
// set.add(456);
// set.add("AA");
// set.add(new User("Tom",12));

            //举例一:
// set.add(34);
// set.add(-34);
// set.add(43);
// set.add(11);
// set.add(8);

        //举例二:
        set.add(new User("Tom",12));
        set.add(new User("Jerry",32));
        set.add(new User("Jim",2));
        set.add(new User("Mike",65));
        set.add(new User("Jack",33));
        set.add(new User("Jack",56));


        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }


四、Map接口

1. 概述

Map接口与Collection接口并列存在。用于保存具有映射关系的数据:key-value —类似于高中的函数:y = f(x)。

Map中的keyvalue都可以是任何引用类型的数据。

Map中的key:无序的、不可重复的,使用Set存储所有的key,常用String类作为Map的“键” —> key所在的类要重写equals()hashCode()(以HashMap为例)

Map中的value:无序的、可重复的,使用Collection存储所有的value —>value所在的类要重写equals()

⭕ 一个键值对:key-value构成了一个Entry对象。Map中的entry:无序的、不可重复的,使用Set存储所有的entry

keyvalue之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的 value

Map接口的常用实现类:HashMapTreeMapLinkedHashMapProperties。其中,HashMapMap接口使用频率最高的实现类。

2. Map中定义的方法

⭕ 添加、删除、修改操作:

方法描述
Object put(Object key,Object value)将指定key-value添加到(或修改)当前map对象中
void putAll(Map m)m中的所有key-value对存放到当前map
Object remove(Object key)移除指定keykey-value对,并返回value
void clear()清空当前map中的所有数据

⭕ 元素查询的操作:

方法描述
Object get(Object key)获取指定key对应的value
boolean containsKey(Object key)是否包含指定的key
boolean containsValue(Object value)是否包含指定的value
int size()返回mapkey-value对的个数
boolean isEmpty()判断当前map是否为空
boolean equals(Object obj)判断当前map和参数对象obj是否相等
getOrDefault(Object key, V defaultValue)当Map集合中存在这个key时,就使用这个key对应的value值,否则就使用默认值defaultValue,意味着就算出现key to null这种键值对时,依然返回null而不是默认值

⭕ 元视图操作的方法:

方法描述
Set keySet()返回所有key构成的Set集合
Collection values()返回所有value构成的Collection集合
Set entrySet()返回所有key-value对构成的Set集合

⭕ 总结:常用方法:

作用方法
添加put(Object key,Object value)
删除remove(Object key)
修改put(Object key,Object value)
查询get(Object key)
长度size()
遍历keySet() / values() / entrySet()
2.1 代码演示
    @Test
    public void test1(){
        Map map = new HashMap();
// map = new Hashtable();
        map.put(null,123);

    }

    @Test
    public void test2(){
        Map map = new HashMap();
        map = new LinkedHashMap();
        map.put(123,"AA");
        map.put(345,"BB");
        map.put(12,"CC");

        System.out.println(map);//{123=AA, 345=BB, 12=CC}
    }


   /\*
 添加、删除、修改操作:
 Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
 void putAll(Map m):将m中的所有key-value对存放到当前map中
 Object remove(Object key):移除指定key的key-value对,并返回value
 void clear():清空当前map中的所有数据
 \*/
    @Test
    public void test3(){
        Map map = new HashMap();
        //添加
        map.put("AA",123);
        map.put(45,123);
        map.put("BB",56);
        //修改
        map.put("AA",87);

        System.out.println(map);//{AA=87, BB=56, 45=123}

        Map map1 = new HashMap();
        map1.put("CC",123);
        map1.put("DD",123);

        map.putAll(map1);

        System.out.println(map);//{AA=87, BB=56, CC=123, DD=123, 45=123}

        //remove(Object key)
        Object value = map.remove("CC");
        System.out.println(value);//123
        System.out.println(map);//{AA=87, BB=56, DD=123, 45=123}

        //clear()
        map.clear();//与map = null操作不同
        System.out.println(map.size());//0
        System.out.println(map);//{}
    }


   /\*
 元素查询的操作:
 Object get(Object key):获取指定key对应的value
 boolean containsKey(Object key):是否包含指定的key
 boolean containsValue(Object value):是否包含指定的value
 int size():返回map中key-value对的个数
 boolean isEmpty():判断当前map是否为空
 boolean equals(Object obj):判断当前map和参数对象obj是否相等
 \*/
    @Test
    public void test4(){
        Map map = new HashMap();
        map.put("AA",123);
        map.put(45,123);
        map.put("BB",56);
        // Object get(Object key)
        System.out.println(map.get(45));//123
        //containsKey(Object key)
        boolean isExist = map.containsKey("BB");
        System.out.println(isExist);//true

        isExist = map.containsValue(123);
        System.out.println(isExist);//true

        map.clear();

        System.out.println(map.isEmpty());//true

    }

 /\*
 元视图操作的方法:
 Set keySet():返回所有key构成的Set集合
 Collection values():返回所有value构成的Collection集合
 Set entrySet():返回所有key-value对构成的Set集合

 \*/


    @Test
    public void test5(){
        Map map = new HashMap();
        map.put("AA",123);
        map.put(45,1234);
        map.put("BB",56);

        //遍历所有的key集:keySet()
        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //AA
        //BB
        //45
        
        
        System.out.println();
        //遍历所有的value集:values()
        Collection values = map.values();
        for(Object obj : values){
            System.out.println(obj);
        }
        //123
        //56
        //1234
        
        
        System.out.println();
        //遍历所有的key-value
        //方式一:entrySet()
        Set entrySet = map.entrySet();
        Iterator iterator1 = entrySet.iterator();
        while (iterator1.hasNext()){
            Object obj = iterator1.next();
            //entrySet集合中的元素都是entry
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey() + "---->" + entry.getValue());
        }
        //AA---->123
        //BB---->56
        //45---->1234
        
        
        System.out.println();
        //方式二:
        Set keySet = map.keySet();
        Iterator iterator2 = keySet.iterator();
        while(iterator2.hasNext()){
            Object key = iterator2.next();
            Object value = map.get(key);
            System.out.println(key + "=====" + value);
        }
        //AA=====123
        //BB=====56
        //45=====1234

    }


3. Map实现类之一:HashMap
3.1 概述

HashMap作为Map的主要实现类,线程不安全的,效率高,可存储nullkeyvalue

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ln(obj);
}
//123
//56
//1234

    System.out.println();
    //遍历所有的key-value
    //方式一:entrySet()
    Set entrySet = map.entrySet();
    Iterator iterator1 = entrySet.iterator();
    while (iterator1.hasNext()){
        Object obj = iterator1.next();
        //entrySet集合中的元素都是entry
        Map.Entry entry = (Map.Entry) obj;
        System.out.println(entry.getKey() + "---->" + entry.getValue());
    }
    //AA---->123
    //BB---->56
    //45---->1234
    
    
    System.out.println();
    //方式二:
    Set keySet = map.keySet();
    Iterator iterator2 = keySet.iterator();
    while(iterator2.hasNext()){
        Object key = iterator2.next();
        Object value = map.get(key);
        System.out.println(key + "=====" + value);
    }
    //AA=====123
    //BB=====56
    //45=====1234

}
 #### 3. Map实现类之一:HashMap

 ##### 3.1 概述



> 
> ⭕ `HashMap`作为`Map`的主要实现类,线程不安全的,效率高,可存储`null`的`key`和`value`
> 


[外链图片转存中...(img-R1ie4BNM-1715551032499)]
[外链图片转存中...(img-oT0dDa4i-1715551032499)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 28
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值