ArrayList与LinkedList、Vector的区别 && HashMap与HashTable、HashSet的区别

ArrayList与LinkedList、Vector的区别 && HashMap与HashTable、HashSet的区别

一、ArrayList 和 LinkedList区别:

(1)两者都是线程不安全,都实现了Collection接口。

(2)数据结构:ArrayList是基于动态数组的数据结构,LinkedList是基于双向链表的数据结构。

(3)性能:ArrayList支持随机访问,查询快,增删慢,查询的时间复杂度为O(1),插入和删除的时间复杂度为O(n),因为对插入和删除位置后面的元素进行移动位置,以保证内存的连续性

LinkedList不支持随机访问,查询慢,增删快,查询的时间复杂度为O(n),插入和删除的时间复杂度为O(1)

ArrayList:

  • get() 直接读取第几个下标,复杂度 O(1);
  • add(E) 添加元素,直接在后面添加,复杂度O(1);
  • add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n);
  • remove()删除元素,后面的元素需要逐个移动,复杂度O(n)。

LinkedList:

  • get() 获取第几个元素,依次遍历,复杂度O(n);
  • add(E) 添加到末尾,复杂度O(1);
  • add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n);
  • remove()删除元素,直接指针指向操作,复杂度O(1)。

(4)空间的消耗:ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。

 

二、ArrayList和Vector的区别:

(1)数据结构:ArrayList和Vector底层的数据结构都是数组。

(2)线程安全:Vector线程安全的,底层使用synchronize进行加锁,而ArrayList是线程不安全的。

(3)性能:由于Vector使用synchronize锁来确保线程的安全性,所以性能会稍逊于ArrayList。

(4)初始容量和扩容:ArrayList和Vector的默认初始容量都是10,但是扩容时,ArrayList容量会增长为原来的1.5倍,而Vector的容量会增长为原来的2倍。

(5)Vector实现的Enumeration接口,所以可以使用Enumeration进行遍历元素。

 

三、HashMap和Hashtable的区别:

(1)线程安全性:这是两者最主要的区别,Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些。

(2)计算hash值的方式:HashMap中元素的hash值是重新计算过的,以便获得更好的散列值,Hashtable直接使用Object的hashcode

(3)数据结构:在JDK1.8之前,HashMap和Hashtable的数据结构都可以看成“数组+链表”;在JDK1.8之后,HashMap的数组结构变成了“数组+链表+红黑树”

(4)两者均实现了Map接口,但是HashMap继承了AbstractMap,HashTable继承Dictionary抽象类

(5)HashMap允许null值和null键(只允许一个),HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key。

(6)HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。扩容时,HashMap的容量变成原来的2倍,Hashtable的容量变为2倍+1

(7)Hashtable实现了Enumeration接口,所以可以使用Enumeration进行遍历元素

(8)判断是否含有某个键 :HashMap去掉了Hashtable中的contains()方法

在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null 值时,既可以表示HashMap 中没有该键,也可以表示该键所对应的值为null。因此,在HashMap 中不能用get()方法来判断HashMap 中是否存在某个键,而应该用containsKey()方法来判断。

Hashtable 的键值都不能为null,所以可以用get()方法来判断是否含有某个键。

 

四、HashMap和HashSet的区别:

ArrayList与LinkedList、Vector的区别 && HashMap与HashTable、HashSet的区别

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114733.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • dnspod url转发_url解析

    dnspod url转发_url解析一些比较常用的域名软件有又url转发的功能,类似于花生壳,nat123,dnspod等都有转发url的功能没大会具体是怎么转发的方式是怎么样的呢?经过网上资料查找,查看了一些书籍,大概有了一些了解        首先了解一下,URL转发包括显性转发和隐性转发。显性转发:访问域名后,转跳到新的自定义URL地址,浏览器http地址是变化的。隐性转发:访问域名后,浏览器HTTP地址是不变的,但

    2022年10月19日
  • Ubuntu20.04上安装Edge「建议收藏」

    Ubuntu20.04上安装Edge「建议收藏」原文地址:HowtoInstallMicrosoftEdgeBrowseronUbuntu20.04|Linuxizehttps://linuxize.com/post/how-to-install-edge-browser-on-ubuntu-20-04/1.更新源sudoaptupdatesudoaptinstallsoftware-properties-commonapt-transport-httpswget2.导入MicrosoftGPGKey

  • Vue全家桶介绍_vue全家桶有什么好处

    Vue全家桶介绍_vue全家桶有什么好处全家桶:顾名思义。对于一个完整的中大型单页面应用项目所必须的插件和框架。一、vue-clivue-cli也叫脚手架,官方定义为Vue.js开发的标准工具!相比script标签引入1)、功能丰富对Babel、TypeScript、ESLint、PostCSS、PWA、单元测试和End-to-end测试提供开箱即用的支持。2)、易于扩展它的插件系统可以让社区根据常见需求构建和共享可复用的解决方案。3)、无需EjectVueCLI完全是可配置的,无需eject。这样你的项目就可以长

    2022年10月31日
  • android studio安装教程(包安装成功,不成功你找我)

    android studio安装教程(包安装成功,不成功你找我)百度搜索Androidstudio,或者直接输入http://www.android-studio.org进入这个页面根据这个下载相应的安装包或者压缩包。这里演示安装64位的androidstudio下载完成后直接双击安装包,就会出来下面这个界面点击Next点击Next点击Next点击i…

  • 可控制导航下拉方向的jQuery下拉菜单代码

    效果:http://hovertree.com/texiao/nav/1/代码如下:转自:http://hovertree.com/h/bjaf/kxl2s00m.htm特效:http://www

    2021年12月23日
  • 关闭默认共享-注册表-批处理[通俗易懂]

    批处理法:@echooffcolor2fecho花月痕echo删除默认共享netshareC$/dnetshareD$/dnetshareipc$/dnetshareadmin$/dnetshareE$/dnetshareF$/dnetshareG$/dnetshar…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号