您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

你每天都在用的Java集合框架,您真的懂吗?

时间:2022-05-07 14:20:35  来源:  作者:蜡笔小贤

JAVA集合框架

一、集合框架概况类图

List、Set、Map的区别:

你每天都在用的Java集合框架,您真的懂吗?

 

  - List:存储的元素是有序的,可重复的。
  - Set:存储的元素是无序的,不可重复的。
  - Map:使用键值对(key-value)存储。key是无序、不可重复的,value是无序、可重复的。每个键最多映射一个值。

二、List集合

1.ArrayList和Vector的区别:

  - ArrayList是List的主要实现类,底层使用Object[](数组)存储,适用于频繁的查找工作,现成不安全。
  - Vector是List的古老实现类,底层使用Object[](数组)存储,线程安全。

2.ArrayList和LinkedList的区别:

  - (1)是否保证线程安全:两者都是线程不安全的。
  - (2)底层数据结构:ArrayList底层使用的是Object[]数组的数据结构;LinkedList底层使用的双向链表的数据结构(JDK1.6之前为循环链表,JDK1.7采用双向链表)。
  - (3)插入和删除是否受元素位置的影响:
      #ArrayList采用数组存储,所以插入和删除的时间复杂度受元素位置的影响。在执行add(E e)方法的时候,         ArrayList默认会将元素插入到数组的末尾,这种情况的时间复杂度是O(1)。但如果要指定位置i进行插入元素,时间     复杂度则是O(n-i)。
      #LinkedList采用链表存储,所以add(E e)插入和删除的时间复杂度不受元素位置影响,近似O(1)。而制定位置i进行     插入元素,时间复杂度近似为O(n)。
   - (4)是否支持快速随机访问:ArrayList支持,LinkedList不支持,这都是由底层数据结构决定。ArrayList实现了Randomacces的接口,而LinkedList 没有实现该接口,但这并不是真正决定它是否具有随机访问元素的能力,这只是一个标识而已。
   - (5)内存空间占用:ArrayList的空间占用体现在其初始化的时候就会先分配固定的内存空间,大部分情况下都会有剩余的空间没有被使用;LinedList的空间占用体现在每个Node(元素)的大小,因为每个Node既要存储相应的业务数据,还要存储链表的前驱和链表的后继。

3.ArrayList的扩容机制:

三、Set集合

  • HashSet:无序,唯一,基于HashMap实现的,底层采用HashMap来保存元素,线程不安全,可以存储null值.底层基于HashMap实现的,使用对象来计算hashcode值,因为hashcode可能相同,所以还需要equals()方法来判断对象的相等性。
  • LinkedHashSet:LinkedHashSet是HashSet的子类,其内部是基于LinkedHashMap来实现的,能够按照添加的顺序遍历。
  • TreeSet:有序,唯一,底层使用红黑树实现,能够按照添加元素的顺序进行遍历
  #HashSet如何检查重复
  - 当把对象加入到HashSet时,会先计算对象的hashCode值来判断对象加入的位置,同时也会与其他加入的对象的hashCode值进行比较,如果没有相同的,则视为没有重复。如果有相同的,则会调用equals()方法检查两个对象是否相同,如果相同,则视为重复,加入失败。 

四、Map集合

  • HashMap:JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(拉链法解决冲突)。JDK1.8之后在解决哈希冲突有了变化,当链表长度大于阈值(默认8)时,将会把链表转为红黑树,以减少搜索时间。将链表转为红黑树前会进行判断,如果当前数组的长度小于64,那么会选择进行数组扩容,而不是转为红黑树。线程不安全。其可以存储null的key和value。HashMap默认的大小为16,每次扩容后,容量会变为原来的2倍。如果创建时给定容量的初始值,其会将其扩充为2的幂次方大小(tableSizeFor()方法进行保证)。
  • LinkedHashMap:LinkedHashMap继承自HashMap,所以它的底层仍然是基于拉链式散列结构(数组+链表或红黑树)组成。另外,LinkedHashMap在上面的基础上增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
  • Hashtable:数组+链表组成。线程安全的,因为其内部的方法基本都经过synchronized修饰,性能不高。其不允许null为key或者value,否则会抛出NullPointException。Hashtable默认的大小为11,每次扩容后,容量会变为原来的2n+1。如果创建时给定容量的初始值,其会直接使用给定的大小。并且其没有将链表转为红黑树的机制。
  • TreeMap:红黑树。实现了NavigableMap和SortedMap接口。这让其具备对集合中的元素根据key进行排序的能力。默认是按key的升序排序,不过我们也可以指定排序的比较器。
  • ConcurrentHashMap:底层数据结构jdk1.7以前采用 分段数组+链表,jdk1.8以后使用数组+链表/红黑二叉树。在实现线程安全方面,jdk1.7以前使用分段锁对容器中一部分的数据加锁;jdk1.8以后使用synchronized和CAS来实现,只锁定当前链表或红黑二叉树的首结点,只要hash不冲突,就不会产生并发。

 

你每天都在用的Java集合框架,您真的懂吗?

 


 
你每天都在用的Java集合框架,您真的懂吗?

 

  #HashMap长度为什么是2的幂次方
  - 主要是为了尽可能的减少碰撞,为了减少碰撞,其使用的算法是<(n-1)& hash>,即对hash值用数组长度取模。

五、Collections工具类

void reverse(List list) ===========> 反转

void shuffle(List list) ============> 随机排序

void sort(List list) ===============> 按自然排序的升序排序

void sort(List list,Comparator c) ==> 定制排序,由Comparator控制排序逻辑

void swap(List list,int i,int j) ===> 交换两个索引位置的元素

void rotate(List list,int distance) => 旋转。当distance为正数时,将list后distance个元素整体移到前面。当为负数时,将list前disntance个元素整体移到后面

int binarySearch(List list,Object key) ==>对List进行二分查找,返回索引,注意List必须是有序的

int max(Collection coll) =============> 根据元素的自然顺序,返回最大的元素。类比int min(Collection coll)

int max(Collection coll,Comparator c) ===> 根据定制排序,返回最大元素

void fill(List list,Object obj) =========> 用指定的元素代替指定list中的所有元素。

int frequency(Collection c,Object o) =====> 统计元素出现次数

int indexOfSubList(List list,List target) ===>统计target在list中第一次出现的索引,找不到则返回-1

boolean replaceAll(List list,Object oldVaule,Object newValue) ===>用新元素替换旧元素



Tags:集合框架   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Java 集合框架超详细!
JCF是指一个数据集接口框架,它统称为 Collection 和 Map 接口。一组数据被定义为 Collection ,它扩展了 Iterable 接口。Iterable 实现了一个接口结构,允许访问属于集合的元素...【详细内容】
2023-10-09  Search: 集合框架  点击:(285)  评论:(0)  加入收藏
Java集合框架解析:选择正确数据结构提升性能
Java集合框架是Java编程中不可或缺的一部分,它提供了一组用于存储和操作数据的类和接口。在使用集合框架时,选择正确的数据结构非常重要,可以显著提升程序的性能和效率。下面将...【详细内容】
2023-09-05  Search: 集合框架  点击:(316)  评论:(0)  加入收藏
你每天都在用的Java集合框架,您真的懂吗?
Java集合框架一、集合框架概况类图List、Set、Map的区别: - List:存储的元素是有序的,可重复的。 - Set:存储的元素是无序的,不可重复的。 - Map:使用键值对(key-value)存储...【详细内容】
2022-05-07  Search: 集合框架  点击:(376)  评论:(0)  加入收藏
不得不学的java集合框架
一、Java集合框架概述集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。数组与集合的区别如下:1...【详细内容】
2019-11-06  Search: 集合框架  点击:(532)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(7)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(11)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(23)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(61)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(51)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(41)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(57)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(71)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(93)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(90)  评论:(0)  加入收藏
站内最新
站内热门
站内头条