Java 集合框架(Java Collections Framework,JCF)是 Java 语言中用于存储、操作和管理数据的标准库。它提供了一组通用的接口、类和方法,使开发者能够高效地操作不同类型的数据集合。
本文将结合 Java 集合框架类图,介绍集合框架的整体架构,并对各个集合类的特性、适用场景及优缺点进行详细分析。
1. Java 集合框架概览
Java 集合框架主要分为 Collection 和 Map 两大类。
-
Collection (集合):用于存储一组对象,继承自
Iterable
,包括List
、Set
等子接口。 -
-
Map (映射):用于存储键值对 (key-value),不属于
Collection
接口,但同样是集合框架的一部分,如HashMap
、TreeMap
等。 -
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)。
-
Hashtable :
HashMap
的线程安全版本,但效率较低(同步方法降低并发性能)。 -
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. 线程安全性
-
非线程安全 :
ArrayList
、LinkedList
、HashMap
、HashSet
-
线程安全 :
Vector
、Hashtable
、Properties
-
加锁实现线程安全 :
Collections.synchronizedList(new ArrayList<>())
6. 选择合适的数据结构

7. 结论
Java 集合框架提供了丰富的数据结构,以满足不同的开发需求。
-
List
适用于有序、允许重复的场景 ,如ArrayList
适合快速查找 ,LinkedList
适合频繁插入删除。 -
Set
适用于去重的场景 ,如HashSet
去重但无序 ,TreeSet
去重且有序。 -
Map
适用于键值对存储 ,HashMap
查询快但无序 ,TreeMap
查询稍慢但有序 ,LinkedHashMap
维护插入顺序。 -
线程安全的集合类 (如
Vector
、Hashtable
)在现代并发编程中较少使用,建议使用ConcurrentHashMap
等更优方案。