java linux HTML框架 centos7安装 LeetCode editor express unity3d parameters module count nuget jQuery Mobile Modernizr jq遍历元素 jquery循环 jquery绑定change事件 mysql默认密码 oracle查看数据库 pcie高速固态硬盘 java时间戳 java解析pdf mysql建表 python指数函数 python学习教程 python网页编程 java连数据库 java中class java创建文件 linux简介 linux目录系统 sql综合利用工具 真实女友补丁 黑白照片一键变彩色 源计划艾克 selinux关闭 存储过程写法 java获取时间戳 python爬虫代码 xapk安装器
当前位置: 首页 > 学习教程  > 编程语言

ArrayList,LinkedList,Vector区别?

2020/11/4 14:23:01 文章标签:

title : 每日深耕,勤练不缀之ArrayList,LinkedList,Vector的区别? ArrayList,LinkedList,Vector的区别? 高效的管理和操作数据 三者都是集合框架里的list,即所谓的有序集合。按照位置进行定位,添加和删除的操作都提供迭代器以遍历其内容 …


title : 每日深耕,勤练不缀之ArrayList,LinkedList,Vector的区别?

ArrayList,LinkedList,Vector的区别?
高效的管理和操作数据

  • 三者都是集合框架里的list,即所谓的有序集合。
  • 按照位置进行定位,添加和删除的操作
  • 都提供迭代器以遍历其内容

Vector是Java早期的线程安全动态数组,通过我们不断地积累学习(StringBuffer ,StringBuilder,String),都会知道线程安全有额外开销。
Vector内部是使用对象数组来保存数据,根据需要自动增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据

ArrayList是应用更广泛的动态数组实现,它本身不是线程安全的,性能相对好很多,也可以根据需要调整容量,不过Vector调整一倍,ArrayList增加50%

LinkedList 顾名思义,就是java提供的双向链表,他不需要调整容量,也不是线程安全的

考点分析
面试官会考察不同容器类型适合的场景?
Vector 和ArrayList作为动态数组,其内部元素以数组形式顺序存储的,所以非常适合随机访问,增删的话除非在尾部插入或者删除,其余性能很慢。
而LinkedList作为双向链表,虽然有顺序,但是随机访问性能却是很差,因为其一个数据节点中不仅得存现有节点的数据信息,还得存下一节点的位置信息。
但是增加或删除节点很快,因为不需将其余元素移位,只需将其相关联的位置信息修改就ok

所以在应用开发中,我们就得提前预估到,应用操作是偏向于访问操作,还是偏向于增删操作,可以有针对性的进行选择

关于java集合框架?
这方面如果展开问,有四个大问题:

  • java集合框架的设计结构,至少要有一个整体印象
  • java提供的只要容器(集合和Map)类型,了解或掌握对应的数据结构,算法,思考具体技术选择
  • 将问题扩展到性能、并发等领域
  • 集合框架的演进和发展

1.狭义的集合框架
在这里插入图片描述

大家可以看到cellection是集合的根,然后展开提供了三大类集合:

  • List ,也就是咱们今天学的有序集合,它提供了方便的访问,插入,删除等操作
  • set ,set是不允许重复元素且无序的,这是和List最明显的区别,我们日常开发中很多需要保证元素唯一性的场合都可以用set。在这里说一下,很多set的实现完全依赖于Map的实现,也就是相当于HashMap的马甲
  • Queue/Deque,则是java提供的标准队列结构的实现。除了集合的基本功能,它还支持先进先出,后进先出等行为。
    除了前面提到的,我们还是以现实为例,了解基本特征和典型使用场景
  • TreeSet支持自然顺序访问,但是添加、删除、包含等操作相对低效(log(n)时间)
  • HashSet则是利用哈希算法,如果哈希散列正常,可以提供常数时间级别的添加、删除、包含等操作,但它不保证有序。
  • LinkedHashSet,内部构建了一个记录插入顺序的双向链表,因此提供了按照插入顺序遍历的能力,与此同时,也保证了常数时间的添加、删除、包含等操作,这些操作略低于HashSet,需要维护链表的开销。
  • 在遍历元素时,HashSet性能受自身容量影响,所以初始化时,不要把初始容量设置太大。而LinkedHashSet遍历性能只和元素多少有关

2.典型排序算法:内部排序(归并排序,交换排序(冒泡,快排),选择排序,插入排序)
外部排序:掌握利用内存和外部存储处理超大数据集,至少要了解过程和思路

考察算法不一定如何简单,比如:哪些算法是不稳定的(快排,堆排),思考稳定意味着什么?
对不同数据集,各种排序的最好和最差情况?
从某个角度进一步优化(比如空间占用,假设业务场景需要最小辅助空间,这个角度堆排序就比归并排序优异)

我们今天介绍的都不是线程安全的,对于java.util.concurrent里面的线程安全容器,后面会介绍

并不代表这些集合不能支持并发编程的场景,在Collections工具类里,提供了一系列synchronized方法

static <T> List<T> synchronizedList(List<T> list);

我们完全可以利用类似方法实现基本的线程安全集合:

List list =collectins.synchronizedList(new ArrayList());

它的实现,基本上就是将每个基本方法,比如
get,set,add之类,都通过synchronized添加基本的同步支持。
注意:这些方法创建的线程安全集合,都符合迭代时fail-fast行为,当发生意外的并发修改时,尽早抛出ConcurrentModificationException异常,以避免不可预计的损失

Java集合默认的排序算法是什么?具体呢?能否解释一下排序方式和设计思路?

其实说出这句话的面试官都是大佬!!!
他想让你解释一下多种情况
因为你需要区分是Arrays.sort()还是Collections.sort()
(底层是调用Array.sort());具体什么数据类型;多大的数据集?(太小的数据集,复杂排序是没必要的,Java会直接进行二分插入排序)

  • 对于原始数据类型,目前使用的双轴快速排序,是一种改进快速排序
  • 对于对象数据类型,目前使用TimSort,思想上也是一种归并和二分插入排序结合的优化排序算法
  • 另外 java8直接引入了并行排序算法(parallelSort),为了充分利用现代多核处理器的计算能力,底层实现fork-join框架,当处理的数据集比较小的时候,差距不明显。但是,当数据增长到数万到百万以上,提升就是一个量级
  • 在 java9中,java标准类库提供一系列静态工厂方法,比如 list.of(),set.of(),大大简化了构建晓得容器实例的代码量,采用新的容器静态工厂方法
List<String> simpleList =list.of("Hello","world");

并且保证了不可变性

讨论一个问题?
今天你需要实现一个云计算任务调度系统,希望可以保证VIP客户的任务被优先处理,你可以利用那些数据结构或者标准的集合类型?

我首先会使用ArrayList来存储对象的姓名(自动开辟新内存),而后采用
HashMap来对接对象的任务及处理数据(可以接受NULL值),接下来如果他是VIP,我会考虑到优先级队列,还要额外考虑一下vip再分级,即同等级vip的平权问题,即优先级规则问题,还得考虑同等级多个客户互相不被单一客户大量任务阻塞的问题,调度数据放入redis里面


本文链接: http://www.dtmao.cc/news_show_350125.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?