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