Java的集合学习

本文深入解析Java集合框架,包括Collection、Set、List、Map接口及其具体实现类如HashSet、TreeSet、ArrayList、HashMap等,阐述各集合的特点、构造方法及常用操作。

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

介绍

集合的基本框架组成中,首先是4个接口,分别是Collection、Set、List和Map接口,其中Set和List继承了Collection接口,而Map接口则是单独的,和其他三个没有任何关系。然后有一些具体的类分别实现这些接口,构成了整个集合的框架。

 

接口及其实现类(基本)
接口类的实现
SetHashSetTreeSet
ListArrayListVector
LinkedListStack
MapHashMapHashtable
TreeMap 

加上具体的实现类(转别人的图): 

                                                  


Set集合

Set集合继承Collection,最大的特点是Set中不允许有重复的元素,也就是说,当插入一个元素的时候,Set会判断元素是否已经存在,再确定是否执行添加操作。

HashSet 

HashSet的存储流程分为这几步:1.通过add()方法向Set集合中添加元素   2.调用hashCode()方法获取对象的哈希值  3.根据哈希值计算对象的存储位置  4.判断该位置是否有对象  5.如果有,调用equals()方法比较对象是否相等。HashSet允许保存null,但是注意,此实现不同步,即如果多个线程并发访问哈希集,并且至少有一个线程修改该集合,那么它必须在外部进行同步。

[构造方法]

    • HashSet()

      构造一个新的空集合; 背景HashMap实例具有默认初始容量(16)和负载因子(0.75)。

      HashSet(Collection<? extends E> c)

      构造一个包含指定集合中的元素的新集合。

      HashSet(int initialCapacity)

      构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。

      HashSet(int initialCapacity, float loadFactor)

      构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。

[其他方法]

    • booleanadd(E e)

      将指定的元素添加到此集合(如果尚未存在)。

      voidclear()

      从此集合中删除所有元素。

      booleancontains(Object o)

      如果此集合包含指定的元素,则返回 true 。

      booleanisEmpty()

      如果此集合不包含元素,则返回 true 。

      Iterator<E>iterator()

      返回此集合中元素的迭代器。

      booleanremove(Object o)

      如果存在,则从该集合中删除指定的元素。

      intsize()

      返回此集合中的元素数(其基数)。

 TreeSet

TreeSet类实现了Set接口,还实现了java.util.sortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,或者可以自定义排序规则进行排序。此类同样,不同步,也不允许重复值,相比于HashSet,还不能保存null。

[构造方法]

    • TreeSet()

      构造一个新的,空的树组,根据其元素的自然排序进行排序。

      TreeSet(Collection<? extends E> c)

      构造一个包含指定集合中的元素的新树集,根据其元素的 自然排序进行排序

      TreeSet(Comparator<? super E> comparator)

      构造一个新的,空的树集,根据指定的比较器进行排序。

      TreeSet(SortedSet<E> s)

      构造一个包含相同元素的新树,并使用与指定排序集相同的顺序。

[新增方法]

    • Comparator<? super E>comparator()

      返回用于对该集合中的元素进行排序的比较器,或null,如果此集合使用其元素的natural ordering

      Efirst()

      返回此集合中当前的第一个(最低)元素。

      SortedSet<E>headSet(E toElement)

      返回此集合的部分的视图,其元素严格小于 toElement 。

      NavigableSet<E>headSet(E toElement, boolean inclusive)

      返回该集合的部分的视图,其元素小于(或等于,如果 inclusive为真) toElement

      Elast()

      返回此集合中当前的最后(最高)元素。

      SortedSet<E>subSet(E fromElement, E toElement)

      返回此集合的部分的视图,其元素的范围从 fromElement (含)到 toElement ,排他。

      SortedSet<E>tailSet(E fromElement)

      返回此组件的元素大于或等于 fromElement的部分的视图。

 


List列表

列表是指一个有序的对象集合,也称为一个对象序列。通过列表接口,可以利用整数索引对列表中的每个元素准确控制,与Set集合最大的不同是,列表中容许出现重复的元素。

ArrayList

ArrayList类是通过数组方实现,优点是实现了可变的数组,允许保存所有元素,包括null,并且可以根据索引位置对集合进行快速的随机访问;缺点是向制定的索引位置插入或删除对象的速度比较慢。

[构造方法]

    • ArrayList()

      构造一个初始容量为十的空列表。

      ArrayList(Collection<? extends E> c)

      构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。

      ArrayList(int initialCapacity)

      构造具有指定初始容量的空列表。

[其他方法] 

    • booleanadd(E e)

      将指定的元素追加到此列表的末尾。

      voidadd(int index, E element)

      在此列表中的指定位置插入指定的元素。

      booleanaddAll(Collection<? extends E> c)

      按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。

      booleanaddAll(int index, Collection<? extends E> c)

      将指定集合中的所有元素插入到此列表中,从指定的位置开始。

      voidclear()

      从列表中删除所有元素。

      booleancontains(Object o)

      如果此列表包含指定的元素,则返回 true 。

      voidensureCapacity(int minCapacity)

      如果需要,增加此 ArrayList实例的容量,以确保它可以至少保存最小容量参数指定的元素数。

      Eget(int index)

      返回此列表中指定位置的元素。

      intindexOf(Object o)

      返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。

      booleanisEmpty()

      如果此列表不包含元素,则返回 true 。

      Iterator<E>iterator()

      以正确的顺序返回该列表中的元素的迭代器。

      intlastIndexOf(Object o)

      返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。

      Eremove(int index)

      删除该列表中指定位置的元素。

      booleanremove(Object o)

      从列表中删除指定元素的第一个出现(如果存在)。

      booleanremoveAll(Collection<?> c)

      从此列表中删除指定集合中包含的所有元素。

      booleanremoveIf(Predicate<? super E> filter)

      删除满足给定谓词的此集合的所有元素。

      protected voidremoveRange(int fromIndex, int toIndex)

      从这个列表中删除所有索引在 fromIndex (含)和 toIndex之间的元素。

      voidreplaceAll(UnaryOperator<E> operator)

      将该列表的每个元素替换为将该运算符应用于该元素的结果。

      booleanretainAll(Collection<?> c)

      仅保留此列表中包含在指定集合中的元素。

      Eset(int index, E element)

      用指定的元素替换此列表中指定位置的元素。

      intsize()

      返回此列表中的元素数。

      voidsort(Comparator<? super E> c)

      使用提供的 Comparator对此列表进行排序以比较元素。

      Object[]toArray()

      以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。

      <T> T[]toArray(T[] a)

      以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

      voidtrimToSize()

      修改这个 ArrayList实例的容量是列表的当前大小。

LinkedList

LinkedList类采用链表结构实现,优点是便于像集合中插入和删除元素,但是对于随机访问集合中的对象,效率很低。通常,LinkedList用来实现堆栈(stack)、队列(queue)。

[构造方法]

    • LinkedList()

      构造一个空列表。

      LinkedList(Collection<? extends E> c)

      构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。

 [新增方法]

    • voidaddFirst(E e)

      在该列表开头插入指定的元素。

      voidaddLast(E e)

      将指定的元素追加到此列表的末尾。

      EgetFirst()

      返回此列表中的第一个元素。

      EgetLast()

      返回此列表中的最后一个元素。

      EremoveFirst()

      从此列表中删除并返回第一个元素。

      EremoveLast()

      从此列表中删除并返回最后一个元素。


Map映射

Map接口描述了不重复的键到值的映射 ,一个映射对象不能包含重复的键,并且每个键只能映射到一盒值,在映射中“键-值”对所表述的对象称为条目Entry。简单来说,映射存储的是一对对象,通过键来获取值。

HashMap+TreeMap

[构造方法]

    • HashMap()

      构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。

      HashMap(int initialCapacity)

      构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。

      HashMap(int initialCapacity, float loadFactor)

      构造一个空的 HashMap具有指定的初始容量和负载因子。

      HashMap(Map<? extends K,? extends V> m)

      构造一个新的 HashMap与指定的相同的映射 Map 。

    • TreeMap()

      使用其键的自然排序构造一个新的空树状图。

      TreeMap(Comparator<? super K> comparator)

      构造一个新的,空的树图,按照给定的比较器排序。

      TreeMap(Map<? extends K,? extends V> m)

      构造一个新的树状图,其中包含与给定地图相同的映射,根据其键的 自然顺序进行排序

      TreeMap(SortedMap<K,? extends V> m)

      构造一个包含相同映射并使用与指定排序映射相同顺序的新树映射。

[其他方法]

    • voidclear()

      从这张地图中删除所有的映射。

      Objectclone()

      返回此 HashMap实例的浅拷贝:键和值本身不被克隆。

      booleancontainsKey(Object key)

      如果此映射包含指定键的映射,则返回 true 。

      booleancontainsValue(Object value)

      如果此地图将一个或多个键映射到指定值,则返回 true 。

      Set<Map.Entry<K,V>>entrySet()

      返回此地图中包含的映射的Set视图。

      Vget(Object key)

      返回到指定键所映射的值,或 null如果此映射包含该键的映射。

      booleanisEmpty()

      如果此地图不包含键值映射,则返回 true 。

      Set<K>keySet()

      返回此地图中包含的键的Set视图。

      Vput(K key, V value)

      将指定的值与此映射中的指定键相关联。

      voidputAll(Map<? extends K,? extends V> m)

      将指定地图的所有映射复制到此地图。

      Vremove(Object key)

      从该地图中删除指定键的映射(如果存在)。

      booleanremove(Object key, Object value)

      仅当指定的密钥当前映射到指定的值时删除该条目。

      Vreplace(K key, V value)

      只有当目标映射到某个值时,才能替换指定键的条目。

      booleanreplace(K key, V oldValue, V newValue)

      仅当当前映射到指定的值时,才能替换指定键的条目。

      voidreplaceAll(BiFunction<? super K,? super V,? extends V> function)

      将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。

      intsize()

      返回此地图中键值映射的数量。

      Collection<V>values()

      返回此地图中包含的值的Collection视图。

 HashMap和TreeMap都是Map接口的实现类,如果要进行插入、删除和定位元素,用HashMap最合适;如果要按顺序遍历键,则选择TreeMap,TreeMap的对象的插入删除是通过红-黑树算法实现的,并将整个映射图维持为一个平衡树结构,并且TreeMap是有顺序的。


Arrays类和Collections类

这两个类里面都是静态方法,因为这两个类是对数组对象、集合对象的操作类,直接通过类名调用,然后对相应的数组对象、集合对象进行操作。其中主要的还是排序等操作,详情参考jdk,里面的方法太多了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值