Java集合详解(Collection和Map接口以及实现)

Java集合框架

Java集合类库将interface接口和implements实现两者分离。整个集合框架就围绕一组标准接口而设计。我们可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外也可以通过这些接口实现自己的集合。
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。
在这里插入图片描述

Collection接口

Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素, Java不提供直接继承自Collection的类,只提供继承于的子接口(如List和set)。
Collection 接口存储一组不唯一,无序的对象。
Collection没有get方法过去某个元素,只能通过Iterator()遍历元素、

Collection主要方法:

  • boolean add(Object o)添加对象到集合 boolean remove(Object o)删除指定的对象
  • int size()返回当前集合中元素的数量 boolean contains(Object o)查找集合中是否有指定的对象
  • boolean isEmpty()判断集合是否为空 Iterator iterator()返回一个迭代器
  • boolean containsAll(Collection c)查找集合中是否有集合c中的元素
  • boolean addAll(Collection c)将集合c中所有的元素添加给该集合 void clear()删除集合中所有元素
  • void removeAll(Collection c)从集合中删除c集合中也有的元素 void retainAll(Collection c)从集合中删除集合c中不包含的元素

Collection 这个接口extends自 --java.lang.Iterable接口

  • List 接口
    • ArrayList 类
    • LinkedList 类
    • Vector 类 此类是实现同步的
  • Queue 接口
  • Set 接口
    • SortedSet 接口
      • TreeSet 类
    • HashSet类

Map接口

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。
Java 自带了各种 Map 类。这些 Map 类可归为三种类型:

  1. 通用Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现

HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap、ConcurrentHashMap

  1. 专用Map,通常我们不必亲自创建此类Map,而是通过某些其他类对其进行访问

java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults

  • 一个用于帮助我们实现自己的Map类的抽象类
    AbstractMap

Map主要方法

  • clear() 从 Map 中删除所有映射
  • remove(Object key) 从 Map 中删除键和关联的值
  • put(Object key, Object value) 将指定值与指定键相关联
  • putAll(Map t) 将指定 Map 中的所有映射复制到此
  • mapentrySet() 返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用
  • getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素
  • keySet() 返回Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值)
  • values() 返回 map中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值)
  • get(Object key) 返回与指定键关联的值
  • containsKey(Object key) 如果 Map包含指定键的映射,则返回 true
  • containsValue(Object value) 如果此 Map将一个或多个键映射到指定值,则返回 true
  • isEmpty() 如果 Map 不包含键-值映射,则返回 true
  • size() 返回 Map 中的键-值映射的数目

Map 接口

  • HashMap 类 (除了不同步和允许使用 null 键/值之外,与 Hashtable 大致相同.)
  • Hashtable 类 此类是实现同步的,不允许使用 null 键值
  • SortedMap 接口
    • TreeMap 类

Collection 和 Map 的区别

容器内每个为之所存储的元素个数不同。
Collection类型,每个位置只有一个元素。
Map类型,是Key-Value形式的,像个小型数据库。

List接口(继承自Collection接口)

List集合的特点:
List是一个有序集合。元素会增加到容器的特定位置。可以采用两种方法访问元素

  1. 使用迭代器访问,该访问方法必须顺序的访问元素
  2. 使用一个整数索引进行访问,即随机访问,可以按照任意顺序访问元素
    访问方法
  • void add(int index, E element)
  • void remove(int index)
  • E get(int index)
  • E set(int index, E element)

List集合接口最常用的两个实现类是ArrayList和LinkedList,这两个类的实现代表两种典型的数据结构,分别是线性表和链表。其中线性表是可以根据需要自动增长的。
ArrayList是一个动态数组,数组大小能够动态改变,并能动态增加和删除元素,但是ArrayList基于数组实现,因此可以通过下标索引直接查找到指定位置的元素,其查找效率非常高,但每次插入或删除元素时,需要移动大量元素,因此插入删除元素的效率较低。
LinkedList数据结构是链表。链表数据结构的特点是每个元素分配的空间不必连续、插入和删除元素时速度非常快、但访问元素的速度较慢。
LinkedList是一个双向链表, 当数据量很大或者操作很频繁的情况下,添加和删除元素时具有比ArrayList更好的性能。但在元素的查询和修改方面要弱于ArrayList。LinkedList类每个结点用内部类Node表示

Set接口(继承自Collection接口)

Set集合的特点:
Set接口比Collection有着更严谨的定义,Set在add方法中不能增加重复的元素。需要对Set定义适当的equals方法:只要两个集合包含相同的元素就认为是相等的,而不要求这些元素有同样的顺序。Set的底层实现是HashMap, 当我们在HashSet中添加一个新元素时, 其实这个值是存储在底层Map的key中,而众所周知,HashMap的key值是不能重复的, 所以这里就可以达到去重的目的了。
Set的实现有HashSet类还有接口实现SortedSet
HashSet源码解读
当我们new 一个HashSet实例时, 其实底层是新创建了一个HashMap实例。 放入HashSet中的集合元素实际上由HashMap的key来保存,而HashMap的value则存储了一个PRESENT,它是一个静态的Object对象。
SortedSet

  1. 所有通用排序集实现类应提供四个“标准”构造函数:

    1)一个无参的空构造函数,创建一个依赖于元素自身的自然排序的空排序集合。
    2)包含一个Comparator类型参数的构造器,由指定的Comparator方法来规定排序规则。
    3)包含一个指定的Collection集合的构造器,创建一个包含了指定集合中的元素,依赖元素自然
    排序的排序集合
    4)创建一个包含指定的SortedSet集合的构造器,排序规则与指定的SortedSet一致。**

  2. 排序集合中的元素必须实现Comparable接口,或者能够被指定的Comparator比较器接受。

  3. 元素都是按递增顺序排序的。
    SortedSet方法
    返回给定范围内的元素视图

  • SortedSet< E> subSet(E firstIncluded, E firstExcluded)
  • SortedSet< E> headSet(E firstExcluded)
  • SortedSet< E> tailSet(E firstIncluded)

HashMap(继承自Map接口)

HashMap简介

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射,它是通过“拉链法”解决哈希冲突的。
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。
还需要再补充说明的一点是影响HashMap性能的有两个参数:初始容量(initialCapacity) 和加载因子(loadFactor)。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

HashMap构造函数
// 默认构造函数。
HashMap()

// 指定“容量大小”的构造函数
HashMap(int capacity)

// 指定“容量大小”和“加载因子”的构造函数
HashMap(int capacity, float loadFactor)

// 包含“子Map”的构造函数
HashMap(Map<? extends K, ? extends V> map)

HashTable(继承自Map接口)

HashTable简介

和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射。
Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。

HashTable构造函数
// 默认构造函数。
public Hashtable() 

// 指定“容量大小”的构造函数
public Hashtable(int initialCapacity) 

// 指定“容量大小”和“加载因子”的构造函数
public Hashtable(int initialCapacity, float loadFactor) 

// 包含“子Map”的构造函数
public Hashtable(Map<? extends K, ? extends V> t)

TreeMap(继承自Map接口)

TreeMap简介

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆。
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。

TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。

TreeMap构造函数
// 默认构造函数。使用该构造函数,TreeMap中的元素按照自然排序进行排列。
TreeMap()

// 创建的TreeMap包含Map
TreeMap(Map<? extends K, ? extends V> copyFrom)

// 指定Tree的比较器
TreeMap(Comparator<? super K> comparator)

// 创建的TreeSet包含copyFrom
TreeMap(SortedMap<K, ? extends V> copyFrom)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Set和Map都是Java中常用的集合类型,它们的区别在于Set是一组唯一的无序元素的集合,而Map是一组键值对的集合。 下面是对Set和Map的详细解释和代码案例: 1. Set Set是一组唯一的无序元素的集合。它实现Collection接口,因此它继承了Collection接口中的所有方法。Set中的元素不能重复,而且没有顺序。 常用的Set实现类有HashSet和TreeSet。HashSet使用哈希表来存储元素,而TreeSet使用树来存储元素,并保证元素按照升序排列。 下面是一个HashSet的代码示例: ```java import java.util.HashSet; import java.util.Set; public class HashSetExample { public static void main(String[] args) { Set<String> set = new HashSet<>(); set.add("apple"); set.add("banana"); set.add("orange"); set.add("apple"); System.out.println(set); // 输出结果为 [banana, orange, apple] } } ``` 2. Map Map是一组键值对的集合。它提供了一种将键映射到值的方式,可以通过键来访问对应的值。Map中的键不能重复,而值可以重复。 常用的Map实现类有HashMap和TreeMap。HashMap使用哈希表来存储键值对,而TreeMap使用树来存储键值对,并保证键按照升序排列。 下面是一个HashMap的代码示例: ```java import java.util.HashMap; import java.util.Map; public class HashMapExample { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("banana", 2); map.put("orange", 3); map.put("apple", 4); System.out.println(map); // 输出结果为 {banana=2, orange=3, apple=4} } } ``` 以上就是对Set和Map的详细解释和代码案例,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值