List、Set、Map集合、Collections

本文深入讲解Java集合框架,包括List、Set、Map和Collections的主要特点、底层实现及常用方法,对比不同集合类的优劣,适合Java开发者进阶学习。

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

文章内容输出来源:拉勾教育大数据开发高薪训练营 

一、List集合

1. 基本概念:

    •  java.util.List集合是Collection集合的子集合,该集合中允许有重复的元素并且有先后放入次序。

    •  该集合的主要实现类有:ArrayList类、LinkedList类、Stack类、Vector类。

    •  ArrayList类的底层是采用动态数组进行数据管理的,支持下标访问增删元素不方便

    •  LinkedList类的底层是采用双向链表进行数据管理的,访问不方便增删元素方便

    •  Stack类的底层是采用动态数组进行数据管理的,该类主要用于描述一种具有后进先出特征的数据结构:栈。

    •  Vector类的底层是采用动态数组进行数据管理的,该类与ArrayList类相比属于线程安全的类,效率比较低。

2. List接口的特点:

    ☞  它是一个元素存取有序的集合。 例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序。

    ☞  它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素 。

    ☞  集合中可以有重复的元素。

3. 常用方法:

方法声明功能介绍
void add(int index, E element)
向集合中指定位置添加元素(无参的在末尾追加)
boolean addAll(int index, Collection<? extends E> c)
向集合中添加所有元素
E get(int index)
从集合中获取指定位置元素
int indexOf(Object o)
查找参数指定的对象
int lastIndexOf(Object o)
反向查找参数指定的对象
E set(int index, E element)
修改指定位置的元素
E remove(int index)
删除指定位置的元素
List subList(int fromIndex, int toIndex)
用于获取子List

4. ArrayList

是List的实现类,List中的基本操作ArrayList基本都能使用;元素增删慢,查找快 ,多用于查询数据、遍历数据 ;

5. LinkedList:

底层使用双向链表,方便元素添加、删除,但是查询效率慢;LinkedList集合也可以作为堆栈,队列的结构使用;

常用方法(熟悉)
方法声明功能介绍
public void addFirst(E e)将指定元素插入此列表的开头
public void addLast(E e)将指定元素添加到此列表的结尾
public E getFirst(E e)返回此列表的第一个元素
public E getLast(E e)返回此列表的最后一个元素
public E removeFirst(E e)移除并返回此列表的第一个元素
public E removeLast(E e)移除并返回此列表的最后一个元素
public E pop()从此列表所表示的堆栈处弹出一个元素
public E push(E e)将元素推入此列表所表示的堆栈
public boolean isEmpty()如果列表不包含元素,则返回true

二、Set集合

1. 基本概念:

    •  java.util.Set集合是Collection集合的子集合,与List集合平级。

    •  该集合的主要实现类是:HashSet类 和 TreeSet类以及LinkedHashSet类。

    •  HashSet类的底层是采用哈希表进行数据管理的。

    •  TreeSet的底层是采用红黑树进行数据管理的。

    •  LinkedHashSet类与HashSet类的不同之处在于内部维护了一个双向链表,链表中记录了元素插入集合中的先后顺序,便于迭代。

2. Set集合的特点:

    ☞  集合中元素无序。(特别的LinkedHashSet,因为底层加了双向链表,因此可以是元素存取有序)

         Set集合存储元素不重复的前提是必须重写HashCode方法和equals方法

    ☞  集合中不允许有重复的元素。

3. 常用方法:

    参考Collection集合;

4. HashSet

    4.1 基本概念:

        •  HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。

        •  保证元素唯一性(不重复)的方式依赖于HashCode方法和equals方法。

初识哈希表的结构

JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。

JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

简单的来说,哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下图所示。

 

哈希表的存储流程:

具体流程:

 思考为什么要求重写equals方法后要重写hashCode方法?

 解析:当两个元素调用equals方法相等时证明这两个元素相同,重写hashCode方法后保证这两个元素得到的哈希码值相同,由同一个哈希算法生成的索引位置相同,此时只需要与该索引位置已有元素比较即可,从而提高效率并避免重复元素的出现。

5. TreeSet:

    5.1 基本概念:

        •  由于TreeSet集合的底层采用红黑树进行数据的管理,当有新元素插入到TreeSet集合时,需要使用新元素与集合中已有的元素依次比较来确定新元素的合理位置。

        •  比较元素大小的规则有两种方式:

           使用元素的自然排序规则进行比较并排序,让元素类型实现java.lang.Comparable接口;

           使用比较器规则进行比较并排序,构造TreeSet集合时传入java.util.Comparator接口;

        •  自然排序的规则比较单一,而比较器的规则比较多元化,而且比较器优先于自然排序;


三、Map集合

1. 概述:

       生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象 ,就是java.util.Map接口。

2. 基本概念:

    •  java.util.Map<K,V>集合中,参数如下:K - 此映射所维护的键(Key)的类型,相当于目录;V - 映射值(Value)的类型,相当于内容。

    •  该集合中key是不允许重复的,而且一个key只能对应一个value允许键值对为null

    •  该集合的主要实现类有:HashMap类、TreeMap类、LinkedHashMap类、Hashtable类、Properties类。

    •  HashMap类的底层是采用哈希表进行数据管理的。

    •  TreeMap类的底层是采用红黑树进行数据管理的。

    •  LinkedHashMap类与HashMap类的不同之处在于内部维护了一个双向链表,链表中记录了 元素插入集合中的先后顺序,便于迭代。

    •  Hashtable类是古老的Map实现类,与HashMap类相比属于线程安全的类,且不允许null作为key或者value的数值。

   Collection与Map的区别:

3. 常用方法:

方法声明功能介绍
V put(K key, V value)
Key-Value对存入Map,若集合中已经包含该Key,则替换该Key所对应的Value,返回值为该Key原来所对应的Value,若没有则返回null
V get(Object key)
返回与参数Key所对应的Value对象,如果不存在则返回null
boolean containsKey(Object key);
判断集合中是否包含指定的Key
boolean containsValue (Object value);
判断集合中是否包含指定的Value
V remove(Object key)  
根据参数指定的key进行删除
Set keySet()
返回此映射中包含的键的Set视图
Collection values()
返回此映射中包含的值的Set视图
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射的Set视图

4. Map集合遍历键找值方式:

    4.1 键找值方式:即通过元素中的键,获取键所对应的值

    4.2 分析步骤:

        a. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示:KeySet();

        b. 遍历键的Set集合,得到每一个键。

        c. 根据键,获取键所对应的值。方法提示:get(Key);

    4.3 代码演示:

public class MapDemo01 {
    public static void main(String[] args) {
        //创建Map集合对象 
        HashMap<Integer, String> map = new HashMap<Integer,String>();
        //添加元素到集合 
        map.put(110, "张三");
        map.put(114, "李四");
        map.put(120, "王五");

        //获取所有的键  获取键集
        Set<String> keys = map.keySet();
        // 遍历键集 得到 每一个键
        for (String key : keys) {
          	//key  就是键
            //获取对应值
            String value = map.get(key);
            System.out.println(key+"对应的是:"+value);
        }  
    }
}

    4.4 图解遍历:

5. Entry键值对对象:

    5.1 基本概念:

        我们已经知道,Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应 的键与对应的值。

    5.2 方法:

public K getKey():获取Entry对象中的键;

public V getValue():获取Entry对象中的值;

在Map集合中提供了获取所有Entry对象的方法:

    public Set<Map.Entry<K, V>> entrySet():获取到Map集合中所有的键值对对象的集合(Set集合)。

6. Map集合遍历键值对的方式:

    6.1 键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

    6.2 操作步骤与图解:

        a. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:entrySet()。

        b. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。

        c. 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:getKey(),getValue()。

    6.3 代码演示:

public class MapDemo01 {
    public static void main(String[] args) {
        //创建Map集合对象 
        HashMap<Integer, String> map = new HashMap<Integer,String>();
        //添加元素到集合 
        map.put(110, "张三");
        map.put(114, "李四");
        map.put(120, "王五");

        // 获取 所有的 entry对象  entrySet
        Set<Entry<String,String>> entrySet = map.entrySet();

        // 遍历得到每一个entry对象
        for (Entry<String, String> entry : entrySet) {
           	// 解析 
            String key = entry.getKey();
            String value = entry.getValue();  
            System.out.println(key+"对应的是:"+value);
        }
    }
}

 

    6.4 图解分析:

7. 相关常量: 

DEFAULT_INITIAL_CAPACITY
HashMap默认容量是16
DEFAULT_LOAD_FACTOR
HashMap默认加载因子是0.75
threshold
扩容的临界值,该数值为:容量*填充因子,也就是12
TREEIFY_THRESHOLD
Bucket中链表长度大于默认值8转化为红黑树存储
MIN_TREEIFY_CAPACITY
桶中的Node被树化时最小的hash表容量,该数值是64

四、Collections

1. 基本概念:

    java.util.Collections类主要提供了对集合操作或者返回集合的静态方法。

2. 相关方法:

方法声明功能介绍
static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
根据元素的自然顺序返回给定集合的最大元素
static T max(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器引发的顺序返回给定集合的最大元素
static <T extends Object & Comparable<?super T>> T min(Collection<? extends T> coll)
根据元素的自然顺序返回给定集合的最小元素
static T min(Collection<? extends T> coll, Comparator<? super T> comp)
根据指定比较器引发的顺序返回给定集合的最小元素
static void copy(List<? super T> dest, List<? extends T> src)
将一个列表中的所有元素复制到另一个列表中

 

方法声明功能介绍
static void reverse(List<?> list)
反转指定列表中元素的顺序
static void shufflfflffle(List<?> list)
使用默认的随机源随机置换指定的列表
static <T extends Comparable<? super T>> void sort(List list)
根据其元素的自然顺序将指定列表按升序排序
static void sort(List list, Comparator<? super T> c)
根据指定比较器指定的顺序对指定列表进行排序
static void swap(List<?> list, int i, int j)
将一个列表中的所有元素复制到另一个列表中

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值