| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 给自己总结 集合框架的一些问题 -> 正文阅读 |
|
[数据结构与算法]给自己总结 集合框架的一些问题 |
什么是集合框架集合框架是 存储数据的容器 集合框架就是为了表示和操作集合的一种标准体系结构,包含三大部分 对外的接口,接口的具体实现和算法。 接口即抽象出来的一组集合行为规范,实现则是具体的实现,是重用性很高的数据结构。 算法就是对数据进行操作,比如集合的排序,查找,增添等等算法。? 集合与数组的区别? ?集合是可变长的,数组是定长的,集合存放对象类型,数组可以存放对象类型或者基本类型。 集合可以存放不同数据类型的对象,一个数组只能存储一个数据类型 常用集合类??? ? ? ? ?Collection子接口的List,Set,Queue。和Map子接口 ?List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点?? ? ? ? List是列表,存储的数据是有序,可重复的。使用add,get方法存取 ? ? ? ? set是集合,存储的数据是无序且唯一的。使用add,get方法存取 ? ? ? ? map是图,存储的是键值对数据,key值唯一但无序,value可以多个,也可以无序。使用put,get方法? list,set继承collection接口,map并不。? 集合框架底层数据结构(数据结构:就是容器中存储数据的方式)?List:实现主要是ArrayList,LinkedList,和Queue ①Arraylist底层是数组的方式存储数据,初始化容量是10,当使用add方法向其中添加数据,则首先会判断size+1是否溢出,若没有则直接加入,若有则会调用grow方法扩容,A扩容一般是1.5倍,调用copyof的方法复制原有数组,再在尾部添加进该元素。get,set方法则,先判断index有无越界,没有则直接添加。remove方法则是在删除元素下标后一位开始复制,使用arraycopy的方法,就是使删除元素后边所有元素向前挪一位。 ①.2? Vector是使用Synchtronized关键字修饰方法的线程安全的A,因此效率没有A高,他继承A,扩容大小默认为2倍。 ①.3? Stack则继承Vector ②LinkedList底层使用双向链表存储数据,默认为0;首尾都能增删元素,add方法是采用addLast,尾插法。remove方法通过unlink方法将节点现有链接删去,然后使用link新建链接完成删除节点的操作。set,get方法则通过index与链表长度进行比较,大的话从尾部开始遍历,小则从头部开始。 ③Queue 是队列方式存储数据,一般采用先进先出的方式,队列有阻塞队列和非阻塞队列,阻塞队列中ArrayBlockingQueue和LinkedBlockingQueue以及SynchtronizedQueue比较重要。 ABQ是底层使用数组来实现队列功能的,初始化要写长度,是线程安全的阻塞队列,可以选择采用公平锁,但是默认采用不公平锁,公平锁即依据线程申请锁资源的顺序来获得锁,其他线程取不到锁被阻塞进入阻塞队列也是队首的线程,下一次最先有机会获得锁。但是ABQ在消费者生产者模式中,生产者和消费者实际上使用的是同一把锁,因此生产和消费操作实际上是不能并行的。 LBQ则底层使用双向链表来实现队列功能,也是线程安全的,不初始容量的话,默认为Integer_MAX_Value,默认是不公平锁,生产者和消费者独立拥有锁,所以消费者和生产者操作是可以并行的,但是当生产速度远远大于消费速度时,会产生大量资源,可能使得内存溢出,并且因为使用的链表方式,每次进行生产或消费时新建或销毁一个node对象,这对于gc来说影响较大。 SQ则是线程安全的无容量的队列,即容量为一,只能生产一个,就消费一个,take方法使用lock锁,是线程安全的。 Set:hashSet,LinkedHashSet,TreeSet ①hashset底层采用hashmap底层采用散列表存取键值对的方式,使用add方法时,通过散列函数将对象的哈希值与数组大小-1进行按位与操作,得到存储位置下标,如果该位置已经有数据,则采用hashcode以及equals方法进行比较是否为同一元素,是的话则不添加,这就实现了set集合元素唯一的保证。get则通过下标取得元素,remove则采用equals方法找到元素删除。 ②LinkedHashSet 底层是LinkedHashMap 采用双向链表维护元素顺序,顺序为插入顺序或者最近最少使用顺序,继承hashmap。 ③TreeSet底层采用红黑树,也是有序的。 Map:hashmap,LinkedHashMap,Treemap,hashTable,currentHashMap ①hashmap1.8之后底层使用的是哈希表存储键值对来存储数据,以数组+链表+红黑树的方式,默认大小为16,扩容因子为0.75,hashmap数组长度只能是2的次方,当使用put方法添加数据的时候 get方法通过key值进行equals比较获取value的值。remove则一样。 红黑树是什么?底层怎么实现? 红黑树是一种不完美的平衡二叉树,底层是基于2,3,4树概念的实现。它相对平衡二叉树,严格要求左右子树高度差不大于一不同,而只是要求一种弱平衡,只要最长路径比最短路径不超过两倍既可,而且在进行插入,删除时对树平衡的维护也比平衡二叉树Asl好,他做到了在不超过3次旋转就能达到一定平衡,时间复杂度控制在对数级。 红黑树要求有五点必须做到才是红黑树: 1,节点是黑色或者红色 2,根结点是黑色 3,不会出现两个连续的红节点 4,叶子结点的nil节点一定是黑色(nil节点是空对象节点) 5,任意节点到其叶子结点的路径上的黑色结点数目相同 LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。 TreeMap 底层是红黑树,实现的接口继承sortedmap接口,可以对key进行自然排序,也可以在构造方法传递Comparator实现map排序。 HashTable 与hashmap相似,底层是数组加链表,链表主要为了解决哈希冲突存在,扩容为2倍+1,默认容量11,是线程安全的,不允许空key空value hashmap怎么实现扩容的? ①采用resize方法,把当前桶节点的hash值与就容量与,重新分配hash值,当超出数组阀值或者初始化的时候会调用进行扩容 ②扩容后元素在原位置或者偏移量为两倍的位置
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 4:34:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |