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的区别

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决ModuleNotFoundError: No module named ‘pip‘问题

    解决ModuleNotFoundError: No module named ‘pip‘问题Python学习遇到小问题:ModuleNotFoundError:Nomodulenamed‘pip’今天想要装一下wxPython第三方库来写一下Python的GUI的时候发现cmd窗口下无法执行pip命令,想了想昨晚好像是pip命令行提示了我有新版本可以更新使用,更新之后也不成功,但昨晚没有怎么理会,以为没事,但今早起来一看发现pip命令都用不了了,出现了ModuleNotFoun…

    2022年6月12日
    31
  • C语言strstr函数实现

    C语言strstr函数实现自己实现C语言中的strstr函数,用的是朴素的模式匹配算法,还有可以优化的地方,下次想好了再写。/*strstr实现*/char*mystrstr(constchar*dest,constchar*src){ char*tdest=dest; char*tsrc=src; while(*tdest) { char*flag=tdest

    2022年6月25日
    30
  • Java语言实现自动关机程序

    Java语言实现自动关机程序@Java实现自动关机系统Java语言实现自动关机程序该项目实现了以下任务:1、提示用户,欢迎使用某某关机程序2、提示用户,输入倒计时关机的秒数3、根据用户输入的秒数,进行自动关机4、开始自动关机时,提示用户xxx秒后关机项目具体代码我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown将代码片显示选择的

    2022年7月22日
    10
  • python中的while循环语句_python while循环语句用法

    python中的while循环语句_python while循环语句用法文|天罡君while和for都可以使程序重复执行某一段代码(又称作循环体),区别是for循环用于针对集合中的每一个元素都一个代码块,而while循环在表达式为True的情况下会不断地执行,直到指定条件不满足为止。今天我们一起来学习下while关键字的使用。1.while循环简介while在英语中的解释是:当…时候。在Python中的语法是:while表达式:循环体…

    2022年8月12日
    5
  • java .gml格式_GML格式错误

    java .gml格式_GML格式错误可能我理解有些错误哈 有 GML 文档说明地址吗 我通过 postgis 与 gdal 转换出来结果如下 85332 7 084941 6 087757 1 090995 7 16022

    2025年7月18日
    3
  • PhpSpreadsheet_php file_put_contents

    PhpSpreadsheet_php file_put_contentsSpreadsheet支持excel函数公式使用<?php namespaceapp #给类文件的命名空间起个别名 usePhpOffice\PhpSpreadsheet\Spreadsheet; #Xlsx类将电子表格保存到文件 usePhpOffice\PhpSpreadsheet\Writer\Xlsx; #实例化Spreadsheet对象 $spreadsheet=newSpreadsheet(); #获取活动工作薄 $sheet=$

    2025年12月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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