Java集合框架比较

一、List、Set和Map的比较

        

集合类型特点实例
List有序集合,允许重复元素ArrayList, LinkedList, Vector
Set无序集合,不允许重复元素HashSet, TreeSet, LinkedHashSet
Map存储键值对,键唯一,值可以重复HashMap, Hashtable, TreeMap, LinkedHashMap
  1. 有序性
    • List是有序的,可以通过索引来访问元素。
    • Set和Map是无序的(但LinkedHashSet和LinkedHashMap保持了插入顺序)。
  2. 元素重复性
    • List和Map的值部分允许重复元素。
    • Set不允许重复元素,但可以通过实现equals()hashCode()方法来定义“重复”的标准。
  3. 实现类的比较
    • ArrayListLinkedList:ArrayList基于动态数组实现,支持快速随机访问,但在中间位置添加或删除元素时效率较低;LinkedList基于双向链表实现,支持在列表两端快速添加和删除元素,但随机访问效率较低。
    • HashSetTreeSet:HashSet基于哈希表实现,不保证元素的顺序;TreeSet基于红黑树实现,对元素进行自然排序或根据提供的Comparator进行排序。
    • HashMapHashtable:HashMap是非同步的,支持null键和null值(但键只能有一个null);Hashtable是同步的,不支持null键和null值。

二、集合内部实现类的比较 

        List实现类比较

实现类底层数据结构线程安全性访问效率插入/删除效率
ArrayList动态数组非线程安全高(随机访问)低(中间位置)
LinkedList双向链表非线程安全低(需要遍历)高(两端操作)
Vector动态数组线程安全高(随机访问)低(中间位置)
Stack(继承Vector)动态数组线程安全高(随机访问)

        Set实现类比较 

实现类底层数据结构线程安全性元素排序
HashSet哈希表非线程安全无序
TreeSet红黑树非线程安全自然排序或自定义排序
LinkedHashSet哈希表+双向链表非线程安全插入顺序

        Map实现类比较 

实现类底层数据结构线程安全性键和值的null支持排序
HashMap哈希表+链表/红黑树非线程安全允许一个null键和多个null值无序
Hashtable哈希表+链表线程安全不允许null键和null值无序
TreeMap红黑树非线程安全不允许null键,允许null值自然排序或自定义排序
LinkedHashMap哈希表+双向链表非线程安全允许一个null键和多个null值插入顺序或访问顺序

三、集合比较方法

在Java中,对集合进行比较时,可以使用以下几种方法:

  1. 遍历比较:通过迭代集合中的元素,逐一比较每个元素的值。
  2. 使用equals方法:对于List和Set等集合类,可以直接使用equals方法进行比较。但需要注意的是,equals方法的实现依赖于元素的equals方法和hashCode方法。
  3. 使用containsAll方法:判断一个集合是否包含另一个集合的所有元素。
  4. 使用retainAll方法:返回两个集合的交集,即同时存在于两个集合中的元素。
  5. 使用compareTo方法(对于实现了Comparable接口的集合元素):比较元素的大小。

 四、Collection和CollectionsCollection

Collectioncollections
定义Collection是Java集合框架中的一个接口,是集合类的根接口,它定义了集合的基本操作和行为,如添加、删除、遍历等。它是List、Set和Queue等子接口的父接口。Collections是Java集合框架中的一个工具类,位于java.util包中。它提供了一系列静态方法,用于对集合进行操作,如排序、查找、同步等。
性质它是一个接口,不能直接实例化,需要通过其实现类(如ArrayList、LinkedList、HashSet等)来创建集合对象。它是一个工具类,包含静态方法,不能直接实例化。它提供的方法用于操作实现了Collection接口的集合对象。
功能定义了集合的基本操作和行为,如添加(add)、删除(remove)、遍历(通过迭代器Iterator)等。它是所有集合类的父接口,提供了统一的操作规范。提供了一系列静态方法,用于对集合进行高级操作,如排序(sort)、查找(如maxmin)、同步(synchronizedListsynchronizedSet等)、不可修改视图(unmodifiableListunmodifiableSet等)。
使用场景当需要创建一个集合对象,并对其进行基本操作(如添加、删除、遍历)时,应该使用Collection接口的实现类(如ArrayList、LinkedList等)。当需要对集合进行排序、查找、同步等高级操作时,应该使用Collections类提供的静态方法。

五、Comparable和Comparator

ComparableComparator
定义是Java中的一个接口,位于java.lang.Comparable包中。也是Java中的一个接口,位于java.util.Comparator包中。
性质它要求实现该接口的类具有自身比较的能力,即类的实例之间可以进行比较。它是一个外部比较器,允许用户定义两个类实例之间的比较逻辑,而不需要修改类的源代码。
使用场景当一个类的实例之间需要按照某种自然顺序进行排序时,该类应该实现Comparable接口,并重写compareTo方法。例如,String类就实现了Comparable接口,因此可以直接使用Collections.sort或Arrays.sort对字符串数组或集合进行排序。当需要按照自定义的顺序对某个类的实例进行排序,而该类没有实现Comparable接口,或者虽然实现了但提供的排序方式不符合需求时,可以创建一个实现了Comparator接口的类来定义排序逻辑。然后,将这个Comparator对象作为参数传递给排序方法(如Collections.sort或TreeSet的构造函数)。

  Comparable和Comparator区别:

  1. 定义和实现方式
    • Comparable是内比较器,要求实现该接口的类具有自身比较的能力,即类的实例之间可以直接进行比较。这通过实现compareTo方法来实现。
    • Comparator是外比较器,它是一个独立的类,用于定义两个类实例之间的比较逻辑。这通过实现compare方法来实现。
  2. 排序的灵活性
    • 使用Comparable接口进行排序时,排序逻辑是固定的,与类的实例紧密绑定。如果需要改变排序逻辑,必须修改类的源代码。
    • 使用Comparator接口进行排序时,排序逻辑是灵活的,可以根据需要定义不同的Comparator类来实现不同的排序逻辑。这样,可以在不修改类源代码的情况下改变排序方式。
  3. 同时使用时的优先级
    • 如果一个类同时实现了Comparable接口和提供了Comparator对象进行排序,那么Comparator对象的排序逻辑将优先于Comparable接口的排序逻辑。
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值