Java集合

  • Java集合框架概述
  • Collection接口方法
  • Iterator迭代器接口
  • JDK5.0后用foreach遍历集合和数组
  • Collection子接口1:List
  • 第一种实现方法ArrayList
  • 第二种实现类LinkedList
  • 第三种Vector
  • 三种实现类之间的异同
  • Collection子接口2:Set
  • 第一种实现类HashSet
  • 第二种实现类LinkedHashSet
  • 第三种实现类TreeSet
  • Map接口
  • 第一种实现类HashMap
  • JDK7 HashMap底层实现原理
  • JDK8 HashMap底层实现原理
  • HashMap的扩容
  • HashMap面试题
  • 第二种实现类之LinkedHashMap
  • 第三种实现类TreeMap
  • 第四种实现类Hashtable
  • 第五种实现类Properties
  • Collections工具类


Java集合框架概述

java MVEL 高级用法 java高级内容_开发语言


数组不方便就用链表,链表是Java集合的一部分,数组中元素可以重复,但是集合里面不能重复,所以用Set来存放。相当于C++中的STL。有Map,List,Set这些标准数据结构以及其方法。

java MVEL 高级用法 java高级内容_链表_02


java MVEL 高级用法 java高级内容_java_03


java MVEL 高级用法 java高级内容_开发语言_04

Collection接口方法

Collection中有一些集合的基本操作,像增删改查之类的都实现了。可以自行查阅

java MVEL 高级用法 java高级内容_java_05


java MVEL 高级用法 java高级内容_开发语言_06


java MVEL 高级用法 java高级内容_开发语言_07

Iterator迭代器接口

和C++中一样,需要建立一个Iterator的对象来遍历集合,用于读取集合中的元素。取代了for i=0; i<N;i++变为 iterator=List.begin():iterator<List.end()+1;iterator.next()

java MVEL 高级用法 java高级内容_链表_08


java MVEL 高级用法 java高级内容_List_09


java MVEL 高级用法 java高级内容_java_10

JDK5.0后用foreach遍历集合和数组

java MVEL 高级用法 java高级内容_开发语言_11

Collection子接口1:List

java MVEL 高级用法 java高级内容_java MVEL 高级用法_12


常用类有可变的数组,可变的链表,可变向量。List可以动态的增加数组长度。

java MVEL 高级用法 java高级内容_链表_13

第一种实现方法ArrayList

java MVEL 高级用法 java高级内容_java_14


ArrayList底层代码讲解视频

第二种实现类LinkedList

java MVEL 高级用法 java高级内容_java MVEL 高级用法_15


java MVEL 高级用法 java高级内容_List_16


LinkedList底层代码讲解视频

第三种Vector

java MVEL 高级用法 java高级内容_开发语言_17

Vector底层代码讲解视频

三种实现类之间的异同

三者之间的异同:

同:三个类都实现了List接口,存储数据都是有序的可重复的。

不同:

ArrayList:作为List接口的主要实现类,线程不安全的,执行效率高。底层用Object[] elementData存储

Vector:作为List接口实现的古老的实现类,在List接口之前出来,List出来之后被归并到List的实现类中,线程安全的。Object[] elementData存储

LinkedList:底层用双向链表存储。对于频繁的增删效率高

java MVEL 高级用法 java高级内容_开发语言_18

Collection子接口2:Set

java MVEL 高级用法 java高级内容_链表_19


java MVEL 高级用法 java高级内容_java MVEL 高级用法_20

第一种实现类HashSet

主要Set实现接口,线程不安全的,可以存储null值

java MVEL 高级用法 java高级内容_List_21


java MVEL 高级用法 java高级内容_开发语言_22


java MVEL 高级用法 java高级内容_链表_23


java MVEL 高级用法 java高级内容_链表_24


java MVEL 高级用法 java高级内容_java_25


Set不可重复性要重写equals和hashcode方法。

package com.packtest.java;/*
@author LiRui
@create 2021-10-29 20:18
*/

import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
import java.util.Set;

class User{
    private int age;
    private  String name;

    public  User(int age,String name){ //快速插入get set方法 alt+insert
        this.age=age;
        this.name=name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

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

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

public class ListTest {
    public static void main(String[] args) {
        Set hashSet = new HashSet();
        hashSet.add(456);
        hashSet.add("AA");
        hashSet.add("CC");
        hashSet.add("DD");
        hashSet.add(new User(12, "Tom"));
        hashSet.add(new User(12, "Tom"));
        Iterator iterator = hashSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

第二种实现类LinkedHashSet

作为HashSet的子类:遍历内部数据时,可以按照添加的顺序遍历。为什么能顺序遍历,因为添加的数据都存放在了双向链表中,可以顺序存储。

java MVEL 高级用法 java高级内容_链表_26


java MVEL 高级用法 java高级内容_java_27

第三种实现类TreeSet

要求放入同一个类型的对象,可以实现添加对象的属性排序。

java MVEL 高级用法 java高级内容_开发语言_28


java MVEL 高级用法 java高级内容_List_29


java MVEL 高级用法 java高级内容_List_30


java MVEL 高级用法 java高级内容_java MVEL 高级用法_31


java MVEL 高级用法 java高级内容_java_32


java MVEL 高级用法 java高级内容_java MVEL 高级用法_33

Map接口

java MVEL 高级用法 java高级内容_java_34


java MVEL 高级用法 java高级内容_java_35

Map map = new HashMap();
//map.put(..,..)省略
System.out.println("map的所有key:");
Set keys = map.keySet();// HashSet
for (Object key : keys) {
	System.out.println(key + "->" + map.get(key));
}
System.out.println("map的所有的value:");
Collection values = map.values();
Iterator iter = values.iterator();
while (iter.hasNext()) {
	System.out.println(iter.next());
}
System.out.println("map所有的映射关系:");
// 映射关系的类型是Map.Entry类型,它是Map接口的内部接口
Set mappings = map.entrySet();
for (Object mapping : mappings) {
	Map.Entry entry = (Map.Entry) mapping;
	System.out.println("key是:" + entry.getKey() + ",value是:" + entry.getValue());
}

第一种实现类HashMap

线程不安全的效率高。可以存储null的key和value。

java MVEL 高级用法 java高级内容_java_36

JDK7 HashMap底层实现原理

底层创建了一个长度为16的数组 Entry[] table.

下一步map.put(k1,v1);

首先计算k1所在类的hashCode方法计算哈希值,得到Entry数组中的存放位置。如果位置上没有数据,则k1v1添加成功。如果次位置上的数据不为空(有多个数据,以链表形式存在),比较k1和已存在的多个数据值不相同。则成功添加。如果存在一个和k1相同的结果。则继续比较k1所在类的equals方法,如果返回flase则成功,如果返回true则使用value1替换相同k1的value值,具有修改和覆盖功能。

java MVEL 高级用法 java高级内容_java MVEL 高级用法_37

JDK8 HashMap底层实现原理

new HashMap:底层没有创建一个长度为16的数组,jdk8底层是Node[]而非Entry[]。首次调用put()方法时,底层创建长度为16的数组。jdk8的底层结构:数组+链表+红黑树。当某个索引位置上以链表形式存在的个数大于8,且当前数组长度大于64时,此时此索引位置上的所有索引数据改为红黑树。

java MVEL 高级用法 java高级内容_java_38


java MVEL 高级用法 java高级内容_链表_39


java MVEL 高级用法 java高级内容_java MVEL 高级用法_40

HashMap的扩容

java MVEL 高级用法 java高级内容_开发语言_41


java MVEL 高级用法 java高级内容_链表_42


java MVEL 高级用法 java高级内容_java MVEL 高级用法_43


java MVEL 高级用法 java高级内容_List_44

HashMap面试题

java MVEL 高级用法 java高级内容_链表_45


java MVEL 高级用法 java高级内容_List_46

第二种实现类之LinkedHashMap

频繁遍历的效率高于HashMap

java MVEL 高级用法 java高级内容_java_47


继承了Hashmap里的node并加入了两个指针来记录前一个和后一个节点。

java MVEL 高级用法 java高级内容_链表_48

第三种实现类TreeMap

java MVEL 高级用法 java高级内容_java MVEL 高级用法_49

第四种实现类Hashtable

java MVEL 高级用法 java高级内容_开发语言_50

第五种实现类Properties

java MVEL 高级用法 java高级内容_开发语言_51

Collections工具类

java MVEL 高级用法 java高级内容_java MVEL 高级用法_52


java MVEL 高级用法 java高级内容_链表_53

java MVEL 高级用法 java高级内容_开发语言_54


java MVEL 高级用法 java高级内容_List_55