前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术经验|Java基础之集合

技术经验|Java基础之集合

原创
作者头像
Aion
发布2023-11-10 00:28:32
1520
发布2023-11-10 00:28:32
举报
文章被收录于专栏:开发运维工程师

1 集合和数组的区别

学习了数组,那么我们也该学习下集合了。相对于数组而言,集合有以下几个特点:

👉I、数组声明了它容纳的元素的类型,而集合不声明。

👉II、数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

👉III、数组不论是效率还是类型检查都是最好的。

用一个表格简单整理下:

数组

集合

声明容纳大小

需要声明容纳大小

无需声明,但是可以声明大小

是否可变容量

静态,创建后无法改变

动态扩容

性能

相对集合弱一些

相对数组好一些

在Java中,集合同数组一样,主要是用于负责保存、盛放数据,因此这些Java对象还有另外一个名字——集合。

注意⚠️:当前实验环境JDK为1.8.0_202 ,实验使用的IDE为IDEA 2022.2。

代码语言:javascript
复制
$ java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

2 Java中集合的分类

在Java中,集合主要分为两个大类,分别是Collection 和 Map,他们都是接口类型,而且还都是根接口,这两个接口又分别包含一些子接口和一些实现类。Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。

2.1 Collection接口

方法名称

说明

boolean add(E e)

向集合中添加一个元素,如果集合对象被添加操作改变了,则返回 true。E 是元素的数据类型

boolean addAll(Collection c)

向集合中添加集合 c 中的所有元素,如果集合对象被添加操作改变了,则返回 true。

void clear()

清除集合中的所有元素,将集合长度变为 0。

boolean contains(Object o)

判断集合中是否存在指定元素

boolean containsAll(Collection c)

判断集合中是否包含集合 c 中的所有元素

boolean isEmpty()

判断集合是否为空

Iterator<E>iterator()

返回一个 Iterator 对象,用于遍历集合中的元素

Stream<E> parallelStream()

Java8新增,返回一个有序列的并行的数据流,作为数据的源头

boolean remove(Object o)

从集合中删除一个指定元素,当集合中包含了一个或多个元素 o 时,该方法只删除第一个符合条件的元素,该方法将返回 true。

boolean removeAll(Collection c)

从集合中删除所有在集合 c 中出现的元素(相当于把调用该方法的集合减去集合 c)。如果该操作改变了调用该方法的集合,则该方法返回 true。

boolean removeIf(Predicate<? super E> filter)

Java8新增,增加断言过滤删除。移除此集合中满足给定谓词的所有元素。迭代期间或谓词抛出的错误或运行时异常被中继到调用方。

boolean retainAll(Collection c)

从集合中删除集合 c 里不包含的元素(相当于把调用该方法的集合变成该集合和集合 c 的交集),如果该操作改变了调用该方法的集合,则该方法返回 true。

Stream<E> stream()

Java8新增,返回一个有序列的数据流,作为数据的源头

int size()

返回集合中元素的个数

Object[] toArray()

把集合转换为一个数组,所有的集合元素变成对应的数组元素。

2.2 Map接口

方法名称

说明

interface Entry<K,V>

Java8 中新增一些个比较器,该比较器按键的自然顺序比较、按键的给定顺序比较、按值的自然顺序比较和按值的给定顺序比较。

void clear()

删除该 Map 对象中的所有 key-value 对。

V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

Java8 中新增一些个比较器。

V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

Java8 中新增一些个比较器。

V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

Java8 中新增一些个比较器。

boolean containsKey(Object key)

查询 Map 中是否包含指定的 key,如果包含则返回 true。

boolean containsValue(Object value)

查询 Map 中是否包含一个或多个 value,如果包含则返回 true。

V get(Object key)

返回 Map 集合中指定键对象所对应的值。V 表示值的数据类型

V put(K key, V value)

向 Map 集合中添加键-值对,如果当前 Map 中已有一个与该 key 相等的 key-value 对,则新的 key-value 对会覆盖原来的 key-value 对。

void putAll(Map m)

将指定 Map 中的 key-value 对复制到本 Map 中。

V remove(Object key)

从 Map 集合中删除 key 对应的键-值对,返回 key 对应的 value,如果该 key 不存在,则返回 null

boolean remove(Object key, Object value)

Java8 新增,删除指定 key、value 所对应的 key-value 对。如果从该 Map 中成功地删除该 key-value 对,该方法返回 true,否则返回 false。

boolean replace(K key, V oldValue, V newValue)

Java8 新增,仅当指定键当前映射到某个值时,才替换该项。

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

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

Set entrySet()

返回 Map 集合中所有键-值对的 Set 集合,此 Set 集合中元素的数据类型为 Map.Entry

Set keySet()

返回 Map 集合中所有键对象的 Set 集合

boolean isEmpty()

查询该 Map 是否为空(即不包含任何 key-value 对),如果为空则返回 true。

int size()

返回该 Map 里 key-value 对的个数

Collection values()

返回该 Map 里所有 value 组成的 Collection

2.3 集合接口的子类和实现

  • 集合
    • Collection
      • List
        • ArrayList:基于动态数组实现,支持随机访问。
        • Vector:它和ArrayList类似,但它是线程安全的。
        • LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列
      • Queue
        • LinkedList:可以用它来实现双向队列。
        • PriorityQueue:基于堆结构实现,可以用它来实现优先队列。
      • Set
        • TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。
        • HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。
        • LinkedHashSet:具有 HashSet 的查找效率,且内部使用双向链表维护元素的插入顺序。
    • Map
      • TreeMap:基于红黑树实现。
      • HashMap:基于哈希表实现。
      • HashTable:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。
      • LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。

2.4 集合的优点

那么集合在使用过程中,有哪些优点呢?

  • 降低编程难度
  • 提高程序性能
  • 提高API间的互操作性
  • 降低学习难度
  • 降低设计和实现相关API的难度
  • 增加程序的重用性

总结

查看这个还不如去看下源码,这里整理的也比较随意。

参考

[1]https://pdai.tech/md/java/collection/java-collection-all.html

[2]http://c.biancheng.net/view/6824.html

好了,今天的分享就到了这里,下次再见!!!


我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 集合和数组的区别
  • 2 Java中集合的分类
    • 2.1 Collection接口
      • 2.2 Map接口
        • 2.3 集合接口的子类和实现
          • 2.4 集合的优点
          • 总结
          • 参考
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档