Java 集合框架:从数据结构到性能优化,全面解析集合类

Java 集合框架(Java Collections Framework,JCF)是 Java 语言中用于存储、操作和管理数据的标准库。它提供了一组通用的接口、类和方法,使开发者能够高效地操作不同类型的数据集合。

本文将结合 Java 集合框架类图,介绍集合框架的整体架构,并对各个集合类的特性、适用场景及优缺点进行详细分析。

1. Java 集合框架概览

Java 集合框架主要分为 CollectionMap 两大类。

  • Collection (集合):用于存储一组对象,继承自 Iterable,包括 ListSet 等子接口。

  • Map (映射):用于存储键值对 (key-value),不属于 Collection 接口,但同样是集合框架的一部分,如 HashMapTreeMap 等。

2. Collection 体系

Collection 是 Java 集合框架的核心接口,它继承了 Iterable,允许集合中的元素进行迭代(如 for-each 循环)。

Collection 主要分为 List 和 Set 两大类:

Collection 是 Java 集合框架的核心接口,它继承了 Iterable,允许集合中的元素进行迭代(如 for-each 循环)。

Collection 主要分为 List 和 Set 两大类:

2.1 List(列表)

List 接口表示有序集合,允许元素重复,支持索引访问。

List 实现类特点

  • ArrayList:基于动态数组,查找快(O(1)),插入删除慢(O(n))。

  • LinkedList:基于双向链表,插入删除快(O(1)),查找慢(O(n))。

  • Vector :类似 ArrayList,但线程安全 (所有方法都使用 synchronized 进行同步)。

实例:

ArrayList

java 复制代码
package List_;

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

/**
 * @author lay
 * @version 1.0
 **/
public class List_exercise_ {
    @SuppressWarnings("all")
    public static void main(String[] args) {
        List arrayList = new ArrayList();
        for (int i = 0; i < 12; i++) {
            arrayList.add("小黄" + i);
        }
        //第二个位置插入元素"行书评教育",通过相应的方法,add()
        arrayList.add(2,"行书评教育");
        System.out.println("插入后数= "+arrayList);

        Object o = arrayList.get(5);
        System.out.println("获得的元素 = " +o +o.getClass());

        arrayList.remove(6);
        System.out.println("删除后的list:= "+ arrayList);

        arrayList.set(7,"小米");
        System.out.println("修改后的元素为:=" +arrayList);

        Iterator iterator = arrayList.iterator();

//        while (iterator.hasNext()) {
//            Object next =  iterator.next();
//            System.out.print(next);
//        }

//        for (int i = 0; i < arrayList.size(); i++) {
//            Object o1 = arrayList.get(i);
//            System.out.print(o1);
//        }
        //
        for (Object object :arrayList) {
                    System.out.println(object);
        }


    }
}

LinkedList:

java 复制代码
package Collection_;

import java.util.Iterator;
import java.util.LinkedList;

/**
 * @author lay
 * @version 1.0
 **/
public class LinkedList_CRUD {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.add(1);
        linkedList.add(2);
        System.out.println(linkedList);

        linkedList.remove();
        System.out.println(linkedList);

        Iterator iterator = linkedList.iterator();
        while (iterator.hasNext()) {
            Object o =  iterator.next();
            System.out.println(o);
        }
    }
}

Vector:

java 复制代码
package Collection_;

import java.util.List;
import java.util.Vector;

/**
 * @author lay
 * @version 1.0
 **/
public class Vector_Detail {
    public static void main(String[] args) {
        Vector vector = new Vector();
//        Vector vector = new Vector(8);
        for (int i = 0; i < 10; i++) {
            vector.add(i);
        }
        vector.add(100);
        System.out.println("vector=" + vector);
    }
}

2.2 Set(集合)

Set 接口表示无序集合,不允许重复元素。

Set 实现类特点

  • HashSet :基于 HashMap 实现,元素无序,插入、删除、查找时间复杂度均为 O(1)。

  • TreeSet :基于红黑树(TreeMap)实现,元素有序 (默认升序 ,可自定义 Comparator 规则),插入、删除、查找复杂度 O(log n)。

实例:

HashSet

java 复制代码
package Set_;

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

/**
 * @author lay
 * @version 1.0
 **/
public class Set_Methods_ {
    @SuppressWarnings("all")
    public static void main(String[] args) {
        Set set = new HashSet();//以Set接口的实现类hashset
        set.add("sdfa");
        set.add("john");
        set.add("lucy");
        set.add("john");//重复
        set.add("jack");
        set.add("hsp");
        set.add("mary");
        set.add(null);//
//        System.out.println(set);
//        for (int i = 0; i < 10; i++) {
//            System.out.println(set);
//        }


        //遍历
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object o =  iterator.next();
            System.out.println(o);
        }

        set.remove(null);
        for (Object o :set) {
            System.out.println(o);
        }
    }
}

TreeSet

java 复制代码
package Collection_;

import java.util.Comparator;
import java.util.TreeSet;

/**
 * @author lay
 * @version 1.0
 **/
@SuppressWarnings("all")
public class TreeSet_ {
    public static void main(String[] args) {

        TreeSet treeSet = new TreeSet();
        treeSet.add(145);
        treeSet.add(45);
        treeSet.add(5);
        treeSet.add(741);
        System.out.println(treeSet);//无参构造器无序

        //使用匿名内部类,
        TreeSet treeSet1 = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //向下转型
//                return ((String) o1).compareTo((String) o2);
                return ((String) o1).length()-((String) o2).length();
            }
        });


        treeSet1.add("Z");
        treeSet1.add("Dse");
        treeSet1.add("Sse");
        treeSet1.add("Wwefwa");
        treeSet1.add("Wasefefe");
        System.out.println(treeSet1);



    }
}

3. Map 体系

Map 接口用于存储键值对 (key-value),key 不能重复,但 value 可以重复。

Map 实现类特点

  • HashMap:基于哈希表,默认 key 无序,插入、删除、查找 O(1)。

  • LinkedHashMap :继承 HashMap,但维护 key 的插入顺序,遍历时按插入顺序输出。

  • TreeMap :基于红黑树,key 有序,查找 O(log n)。

  • HashtableHashMap线程安全版本,但效率较低(同步方法降低并发性能)。

  • Properties :继承自 Hashtable,专门用于配置文件key-value 均为字符串)。

实例用法:

TreeMap

java 复制代码
package Map_;

import java.util.Comparator;
import java.util.TreeMap;

/**
 * @author lay
 * @version 1.0
 **/
public class Tree_Map {
    public static void main(String[] args) {
//        TreeMap treeMap = new TreeMap();//默认构造器无序
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
//                return ((String) o1).compareTo((String) o2);//按字符顺序排序
                return ((String) o1).length() -((String) o2).length();//按字符顺序排序

            }
        });
        treeMap.put("ada","123");
        treeMap.put("eqr","3");
        treeMap.put("zrr","13");
        treeMap.put("rhth","1");

        System.out.println(treeMap);

    }
}

Hashtable

java 复制代码
package Map_;

import java.util.Hashtable;

/**
 * @author lay
 * @version 1.0
 **/
@SuppressWarnings("all")
public class Hashtable_ {
    public static void main(String[] args) {
        //1. Properties 继承 Hashtable
//2. 可以通过 k-v 存放数据,当然 key 和 value 不能为 null
//增加
        Hashtable properties = new Hashtable();
//properties.put(null, "abc");//抛出 空指针异常
//properties.put("abc", null); //抛出 空指针异常
        properties.put("john", 100);//k-v
        properties.put("lucy", 100);
        properties.put("lucsdfy", 100);
        properties.put("ludsfwerwcy", 100);
        properties.put("lerucy", 100);
        properties.put("luercy", 100);
        properties.put("lucwery", 100);
        properties.put("wr", 100);
        properties.put("lweic", 100);
        properties.put("lic", 88);//如果有相同的 key , value 被替换
        System.out.println("properties=" + properties);


    }
}

Properties

java 复制代码
package Map_;

import java.util.Properties;

/**
 * @author lay
 * @version 1.0
 **/
public class Properties_ {
    public static void main(String[] args) {
        Properties properties = new Properties();
//properties.put(null, "abc");//抛出 空指针异常
//properties.put("abc", null); //抛出 空指针异常
        properties.put("john", 100);//k-v
        properties.put("lucy", 100);
        properties.put("lic", 100);
        properties.put("lic", 88);//如果有相同的 key , value 被替换,也是修改
        System.out.println("properties=" + properties);
        System.out.println(properties.get("lic"));
        properties.remove("lic");
        System.out.println(properties);
    }
}

4. List、Set、Map 的对比总结

5. 线程安全性

  • 非线程安全ArrayListLinkedListHashMapHashSet

  • 线程安全VectorHashtableProperties

  • 加锁实现线程安全Collections.synchronizedList(new ArrayList<>())

6. 选择合适的数据结构

7. 结论

Java 集合框架提供了丰富的数据结构,以满足不同的开发需求。

  • List 适用于有序、允许重复的场景 ,如 ArrayList 适合快速查找LinkedList 适合频繁插入删除

  • Set 适用于去重的场景 ,如 HashSet 去重但无序TreeSet 去重且有序

  • Map 适用于键值对存储HashMap 查询快但无序TreeMap 查询稍慢但有序LinkedHashMap 维护插入顺序

  • 线程安全的集合类 (如 VectorHashtable)在现代并发编程中较少使用,建议使用 ConcurrentHashMap 等更优方案。

相关推荐
5967851546 分钟前
C#重写treeView控件
java·c#
小杨40423 分钟前
架构系列二十三(全面理解IO)
java·后端·架构
程序员鱼皮1 小时前
2025 年最全Java面试题 ,热门高频200 题+答案汇总!
java·后端·面试
爱笑的Sunday1 小时前
【LeetCode 题解】算法:15.三数之和
java·数据结构·算法·leetcode
爱编程的王小美1 小时前
srpingboot-后端登录注册功能的实现
java·数据库·sql
该怎么办呢1 小时前
原生android实现定位java实现
android·java·gitee
没差c1 小时前
处理json,将接口返回的数据转成list<T>,和几个时间处理方法的工具类
java·json·list
Hanson Huang1 小时前
23中设计模式-迭代器(Iterator)设计模式
java·设计模式·迭代器模式·行为型设计模式
天草二十六_简村人1 小时前
Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)
java·spring boot·分布式·后端·rabbitmq
低头不见2 小时前
Spring Boot 的启动流程
java·spring boot·后端