Java的集合框架

简介: Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等

Map接口和Collection接口是所有集合框架的父接口:

Collection接口的子接口包括:Set接口和List接口

Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等

Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等

List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

List接口及其实现

ArrayList

基于动态数组实现

允许快速随机访问元素

插入和删除操作可能需要移动其他元素,因此在中间位置插入和删除的时间复杂度为O(n)

非同步,不是线程安全的,可以使用使用Collections.synchronizedList(new ArrayList<>()) 创建一个同步的 ArrayList。

LinkedList

基于双向链表实现

允许快速插入删除元素

不能快速随机访问,访问元素的时间复杂度为O(n)

非同步,不是线程安全的。可以使用 Collections.synchronizedList(new LinkedList<>()) 创建一个同步的 LinkedList。

可以用做队列或双向队列

依赖于两个节点(一个头节点一个尾节点)

常用方法

添加

add(E e):在链表后添加一个元素; 通用方法 addFirst(E e):在链表头部插入一个元素; 特有方法 addLast(E e):在链表尾部添加一个元素; 特有方法

删除

removeFirst(E e):删除头,获取元素并删除; 特有方法 removeLast(E e):删除尾; 特有方法

查看

getFirst():获取第一个元素; 特有方法 getLast():获取最后一个元素; 特有方法

Stack

基于Vector实现,代表了后进先出()

是同步的,是线程安全的

push入栈、peek查看栈顶元素、pop出栈、empty是否为空、size()获取数目

Vector

基于动态数组实现,类似于ArrayList

同步的,是线程安全的

是需要线程安全的动态数组是使用,但是通常使用ArrayList和Collections.syschronizedList来代替

Set接口及其实现类

set其实一直在用map那一套

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {

    private transient HashMap<E,Object> map;

    private static final Object PRESENT = new Object();


    public HashSet() {

        map = new HashMap<>();

    }


    public boolean add(E e) {

        return map.put(e, PRESENT) == null;

    }


    // Other methods delegate to the underlying map

}


HashSet

元素存储HashSet 将元素添加到底层的 HashMap 中,键是元素的哈希码,值是一个占位符对象。HashSet的实现是基于HashMap的,他使用HashMap来存储元素,在HashSet中,元素被当作HashMap的键,而HashMap的值则是一个固定的占位符,通常是 PRESENT 对象(一个静态内部类对象)。这样做是为了节省空间,因为 HashSet 只关心元素的唯一性,不需要存储额外的值。

去重:HashSet 使用了 HashMap 键的唯一性来确保 HashSet 中不会有重复的元素。

不保证集合的迭代顺序,顺序可能会随时间变化。

方法委派:HashSet 的许多方法(如 add、remove、contains 等)都是通过调用底层 HashMap 的对应方法来实现的。

性能:由于 HashSet 是基于 HashMap 实现的,所以其性能与 HashMap 类似,添加、删除和查找操作的平均时间复杂度为 O(1)。

允许存储null值。

LinkedHashSet

LinkedHashSet 是 HashSet 的一个子类,它继承了 HashSet 的特性,并且保持了元素的插入顺序。下面是关于 LinkedHashSet 的一些关键点:

继承自HashSet并且使用链表维护元素的插入顺序

保证迭代顺序与插入顺序一致

允许存储null值。

插入、删除、和查找操作的时间复杂度为O(1)。

实现细节

当你向 LinkedHashSet 添加元素时,它会使用 LinkedHashMap 来存储元素。

每个元素被当作 LinkedHashMap 的键,值则是一个固定的占位符对象。

LinkedHashSet 通过委派 LinkedHashMap 来实现其 add、remove 和 contains 等方法。

TreeSet

TreeSet 是 Java 中实现 SortedSet 接口的一个集合类,它基于 TreeMap 实现,并且元素是按照自然顺序(或通过提供的比较器)排序的。以下是 TreeSet 的一些关键点:

基于红黑树(自平衡二叉搜索树)实现

元素是有序的,元素按照自然顺序(或通过Comparator指定的顺序)排

不允许存储null值(会抛出NullPointerException)

插入、删除、和查找操作的时间复杂度为O(log n)。

相关文章
|
19小时前
|
运维 Java Apache
Java中的日志框架:Log4j与SLF4J详解
Java中的日志框架:Log4j与SLF4J详解
|
2天前
|
Cloud Native Java 开发者
新一代Java框架Quarkus的性能优化与应用
新一代Java框架Quarkus的性能优化与应用
|
14小时前
|
XML 测试技术 数据格式
《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)
【7月更文挑战第3天】TestNG教程展示了如何自定义日志记录。首先创建一个名为`TestLog`的测试类,包含3个测试方法,其中一个故意失败以展示日志。使用`Assert.assertTrue`和`Reporter.log`来记录信息。接着创建`CustomReporter`类,继承`TestListenerAdapter`,覆盖`onTestFailure`, `onTestSkipped`, 和 `onTestSuccess`,在这些方法中自定义日志输出。
17 6
|
15小时前
|
存储 算法 Java
Java中的集合框架:深度解析与应用
Java中的集合框架:深度解析与应用
|
19小时前
|
安全 Java
Java中的集合类性能比较与选择
Java中的集合类性能比较与选择
|
19小时前
|
负载均衡 Java
使用Java实现RPC框架
使用Java实现RPC框架
|
1天前
|
安全 算法 Java
实现Java中的线程安全集合类
实现Java中的线程安全集合类
|
1天前
|
存储 算法 Java
Java集合框架:使用场景及性能分析
Java集合框架:使用场景及性能分析
|
1天前
|
Java 测试技术 Android开发
《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程
【7月更文挑战第2天】TestNG是一个用于自动化测试的Java框架,提供日志记录功能。日志有两种模式:底层级详细记录每个步骤,高层级仅记录关键事件。示例代码展示了如何在测试方法中使用`Reporter.log()`记录信息,这些信息会显示在TestNG HTML报告中。文章还提及了日志显示时可能出现的编码问题及解决办法。
|
1天前
|
存储 算法 Java
Java集合框架:使用场景及性能分析
Java集合框架:使用场景及性能分析