Java集合框架之容器间的区别

本文深入解析Java集合框架,包括List、Set、Map的主要实现类及其特性。对比ArrayList、LinkedList、Vector,探讨HashSet、TreeSet的元素存储方式,以及HashMap、TreeMap、Hashtable的工作原理和应用场景。

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

集合框架

概念:对象的容器为集合,不能直接存放8种基本数据类型,jdk1.5以上提供了自动装箱机制,集合可以直接将基本类型的值存放入容器中,但是容器会自动的将基本数据类型装箱为该基本数据类型对应的包装类型的对象。

比较ListSetMap
继承接口CollectionCollection
常见实现类AbstractList(常见继承子类有:ArrayList、LinkedList、Vector)AbstractSet(常见继承子类有:HashSet、LinkedHashset、TreeSet)HashMap、TreeMap、HashTable
常见方法add()、remove()、clear()、get()、contains()、size()add()、remove()、clear()、get()、contains()、size()put()、get()、 remove()、clear()、containsKey()、containsValue()、keySet()、values()、size()
元素可重复不可重复(用equals()判断)key不可重复
顺序有序无序(实际顺序由hashCode决定)
线程安全Vector线程安全Hashtble线程安全

常用方法

java.util.Collection<E>
java.util.Collection.size()
java.util.Collection.isEmpty()
java.util.Collection.contains(Object)
java.util.Collection.iterator()
java.util.Collection.toArray()
java.util.Collection.toArray(T[])
java.util.Collection.add(E)
java.util.Collection.remove(Object)
java.util.Collection.containsAll(Collection<?>)
java.util.Collection.addAll(Collection<? extends E>)
java.util.Collection.removeAll(Collection<?>)
java.util.Collection.removeIf(Predicate<? super E>)
java.util.Collection.retainAll(Collection<?>)
java.util.Collection.clear()
java.util.Collection.equals(Object)
java.util.Collection.hashCode()
java.util.Collection.spliterator()
java.util.Collection.stream()
java.util.Collection.parallelStream()

一、List

1、ArrayList

ArrayList父类是AbstractList,底层数据结构是数组,因此增加删除元素速度慢,查找元素速度快。

2、LinkedList

LinkedList的父类是AbstractSequentialList,底层数据结构是双向链表,因此增加、删除元素速度快,查找元素速度慢。

3、Vector

数据结构是数组,查询快、增删慢、线程安全、效率较低。

二、Set

1、HashSet

Hashset底层是由HashMap实现的。

Haset的值存放在HashMap的key上,HashMap的value都为常量PRESENT

2、TreeSet

基于排列顺序实现元素的不重复

实现了SortedSet接口,对于集合中的元素进行自动排序。

元素的对象类型可以通过implements(实现)Comparable接口,然后重写ComparTo方法指定排序规则。

三、Map

1、HashMap

V put(K key,V value):

/**put方法的返回值:如果是key是第一次put那么返回值就是null,map中如果已经有了*相同的key,那么返回值就是上一个key对应的value,并且当前value会替换上一个*value。
*注意*:返回为null的情况有两种,(1)第一次插入当前key(2)已经有当前key存在,但上一个key对应的value为null。**/

	HashMap<String,String> hm=new HashMap<>();

	hm.put("jack","杰克");//put返回null
	hm.put("jack","杰克2");//put返回杰克,hm中存入jack="杰克"

	hm.put(null,"杰克");//put返回null
	hm.put(null,null);//put返回"杰克",hm中存入null=null

Set<K> keySet():map对象的的keySet()得到该Map的键集。

Collection values():得到该map的值集。

Set<Map.Entry<K,V>> entrySet:返回此映射所包含的映射关系的Set视图。

int Size():返回此映射中的键值映射关系数。

V remove(Object key):如果存在key,则移除当前集合中的键值对映射关系。

2、TreeMap

Comparator<? super K> comparator():返回此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回null。

boolean containsKey(Object key):如果此映射包含指定键的映射关系,则返回true。

Map.Entry<K,V> higherEntry(K key):返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回null。

K higherKey(K key):返回严格大于给定键的最小键;如果不存在这样的键,则返回null。

Map.Entry<K,V> lastEntry():返回此映射中最大键关联的键值映射关系;如果映射为空,则返回null。

K lastKey():返回映射中当前最后一个(最高)键。

3、Hashtable
4、HashMap和Hashtable的区别
1、相同点:

​ 都实现了Map、Cloneable接口

​ 底层数据结构都是数组+链表。

​ 插入元素都不能保证有序。

​ Hash过程都是通过key进行哈希。

​ key都不能重复。

2、不同点:

​ null问题:HashMap的key和value可以为null,Hashtable不可以。

​ 初始容量:HashMap的初始容量为16,Hashtable为11。

​ 扩容机制:HashMap的扩容机制是length2,Hashtable是lenght2+1

​ hash值:HashMap的hash值要重新计算,Hashtable是直接使用对象的hash值。

​ 线程安全:HashMap是非线程安全的,Hashtable是线程安全的。

5、如何决定是使用HashMap还是TreeMap

​ 对于在 Map 中插入、删除和定位元素这类操作,HashMap 是最好的选择。 然而,假如你需要对一个有序的 key 集合进行遍历,TreeMap 是更好的选择。 基于你的 collection 的大小,也许向 HashMap 中添加元素会更快,将 map 换为 TreeMap 进行有序 key 的遍历。

6、HashMap底层实现原理

​ HashMap 是基于哈希表的 Map 接口的非同步实现。此实现提供所有可选的 映射操作,并允许使用 null 值和 null 键。此类不保证映射的顺序,特别是它 不保证该顺序恒久不变。
HashMap 的数据结构: 在 java 编程语言中,最基本的结构就是两种,一 个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基 本结构来构造的,HashMap 也不例外。HashMap 实际上是一个“链表散列”的数 据结构,即数组和链表的结合体。

7、HashSet底层实现原理

​ HashSet底层是由HashMap实现

​ HashSet的值存放在HashMap的key上,HashMap的value统一为PRESENT。

8、Collection和Collections的区别?

​ java.util.Collection是一个集合接口(集合类的顶层接口),它提供了对集合对象进行基本操作的通用接口方法。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List和Set。

​ Collections则是集合类的一个工具类,它提供了一系列的静态方法,用于对集合中的元素进行遍历、排序、线程安全话等操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值