Java入门Conllection,初识List、Set、Map 以及 各常用实现类对比

java语言是由C++语言改造而来的,当年响当当的数组,在操作的时候多有不便,因为数组初始容量不够的问题,可能在编程的过程中总会遇到,这个数组不够了怎么办,然后我们就要手动去写一个方法来解决这个问题。久而久之,java提供了一种自动帮你解决各种数组问题的强大工具,它就是List。【java的强大和让多数人的喜爱以及低难度的入门,多数来源于他强大的API(Application Programming Interface,应用程序编程接口),这种感觉就是,想要什么功能,点儿一下就可以了】

 

List:两大常用实现类-->ArrayList / LinkedList,顾名思义,一个数组,一个链表。

    数组的优点在于随机查找,你想要第N个数据,只要get(N)就可以了。但是不适合插入删除,因为每次插入和删除都会移动大量的元素。比如你在原本第二个元素的位置插入,那么你要把第2-N个元素整体往后移变成3至N+1,然后插入新的元素。浪费大量的移动时间,效率低下。

    链表的优点在于增删元素不需要移动元素,但是不利于随机查找,因为查找的时候需要从头元素开始遍历。

那么问题来了:ArrayList增删元素 真的比LinkedList慢吗??

    LinkedList的底层数据结构为循环双向链表,所以在队首或者队尾插入删除速度最快,因为不需要查找遍历插入位置,所以LinkedList适用于队列场景操作。在LinkedList表中间位置时插入删除元素最慢,因为要浪费大量的时间去遍历链表,此时ArrayList只需要移动一半的元素即可插入。在实际的测试中,表中间插入元素,ArrayList的效率高于LinkedList。

    在大部分使用场景中,随机增删查并存,然而查的次数要远远高于增删,所以大部分情况下使用ArrayList。

    List比数组的好处那简直是无法形容的,就是你想用数组做到的各种事情,都已经被List封装好了,比如直接返回数组长度,比如自动扩容,比如.....,所以在企业级开发中是看不到数组的身影的。

 

Set:List是有序插入的,实际插入过程中会有大量重复的元素,比如失误操作,比如系统错误,总之有些使用场景是希望一个数据在表中只出现一次。如果使用List,在每次插入时,需要手动遍历,然后逐个对比是否已存在,不存在则不add。set底层则实现了这些功能,在你add的时候,自动帮你判断,元素是否已存在。所以在保证元素唯一性的时候,可以选择set。

两大常用实现类-->TreeSet / HashSet。TreeSet在插入的过程中自动排序,HashSet由于使用了hash算法,插入和查找不需要遍历所有元素,时间复杂度低,查询速度快,因此是set的首选实现类。且由于使用了哈希算法,使得元素分布与插入顺序无关,换言之HashSet是无序的,所以不能通过get(N)的方式得到元素。HashSet是在HashMap的基础上实现的,有关HashMap的详细介绍,敬请期待。

 

Map:很多初学者,都不明白map到底怎么用?map到底是干嘛的?

这里我给个场景,有一天,你必须在你的程序里实现一个功能,可以你的名字和你的身份证号配对,意思就是,根据你的身份证号就可以找到你的名字。

你可能会想我存在List,奇数元素存身份证号,偶数元素存名字。那我如果有一天误删了一个怎么办?那么误删后面的元素会依次向前挪,奇数变名字,偶数变身份证号,实在乱套~~~

Map<key,value>,一个键值对,key存身份证号,value存姓名,同时key要求唯一(身份证号正好满足),因为要保证根据一个key拿到value,如果两个key相同,你怎么知道这个身份证是谁呢?但是value可以重复,因为可以重名啊,但是不妨碍他们身份证号不同。   value = map.get(key)。此时map中的身份证号以及姓名都成对出现,多么的赞!如果想得到所有的身份证号,则map.ketSet()。

两大常用实现类-->TreeMap / HashMap,同set,没有特殊情况 用HashMap,没有为什么 就是快!

 

相关连接:HashMap原理及部分底层源码分析:https://blog.csdn.net/qq_26012495/article/details/80109887

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值