我发现集合简直就是程序届的渣男,语言里的海王啊!而且一个个的还有自己的鱼塘,最重要的是这个鱼塘竟然还能动态扩容,简直是太可怕了。
集合包含的内容太多了,我就从List开始解释为什么他们一个个的都是海王吧
0x00 海王之ArrayList
ArrayList基于数组实现,所以查询快。每一个进到海王鱼塘的小姐姐,都有自己的名字,而名字就相当于数组的下标,那么海王只要记住每个人的名字就可以快速的知道她的所有信息。比如海王今天想找如花,只需要知道名字,就能知道如花的所有信息,啪的一下,很快啊。
一个合格的海王是不会随便停止往鱼塘注入漂亮的小姐姐的,但是鱼塘又必然有大小的限制的。
比如ArrayList默认的长度就是10,也就是说海王的鱼塘里最多只能有10条鱼,wtf?!那还怎么对的住海王的称号,不如直接改名叫塘主好了。怎么能让这么个小问题就阻挡住我登上海王宝座的道路哪?必须想办法解决,动态扩容就应运而生了。那么,ArrayList动态扩容机制是怎样的哪?先给大家看下最核心的一行代码:
计算扩容后的长度
每次增加当前容量的50%,也就是每次扩容1.5倍。那么,接下来就是尽情的向鱼塘中加入漂亮的小姐姐啦。
0x01 海王之LinkedList
但是随着鱼塘中鱼儿越来越多,ArrayList的增删慢的缺点就越来越明显了,每次想在首位增加一个靓女,需要把之后所有的人都移动一次,真是费时费力。
于是,LinkedList吸取了ArrayList的缺点,进行了一系列的骚操作,引入了链表,解决了增删慢和需要扩容的问题。每次增加小姐姐,只需要打断前后的连接,插入进去,就ok了,完美的避开了移动元素的问题,简直太省事了。
当然,世界上没有绝对的十全十美,LinkedList也不例外,增删虽然快了,查询也就相应慢了下来,就好比微信聊天记录,和小姐姐的对话框都是一个连一个的(对话框就好比内存地址),中间还会随机插入一个大老爷们,为了找到如花在哪里,就只能
0x03 海王之HashMap
就在海王队伍越发壮大的过程中,每个海王的鱼塘越来越大,小姐姐越来越多的时候,鱼塘的管理也越发的混乱,有时候为了找到如花的姐妹菜花,需要顺着链表一直找到最后,都没有找到,才发现原来她不在我的鱼塘,哭泣。
于是HashMap为了避免每次花费大量的时间去找菜花,就引用了key-value的形式存储数据。我们把所有小姐姐的姓存为key,接着把姓相同的名字存入到一个List中,然后将这个List放到HashMap的value,下次查找菜花的时候只需要找到key为"菜"的所有人就好了。是不是又节省了一大笔时间。
同时HashMap又有默认大小为16的限制,所以吸取了ArrayList的经验,提前实现了动态扩容。给大家看下最核心的代码:
计算扩容后的长度
计算方法很简单,每次扩容2倍。
相信大家对集合中常见的海王都有了一定的印象,没印象的也不用着急,毕竟你可能也没机会当海王呢