Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 行业新闻 >

如何学习Java编程集合类

发布日期:2020-03-10 13:47:59点击次数:

分享到:
第一次接触
 
第一次接触集合类,想必大家的方式都差不多,应该就是用了一个叫做List的东西,以及它的子类ArrayList,通过它的api我基本上就可以了解它有哪些功能了,无非就是增删改查呗。
 
虽然这东西看起来没有什么难度,但是面试题里可不会直接问你它的api有哪些,恰好一次面试,面试官就问了我ArrayList相关的问题:ArrayList的底层数据结构是什么,它和linkedlist的区别是什么,它的扩容方式是怎么样的,它是线程安全的么,这些看起来很简单的问题,我当时一个都回答不上来。
 
在没有面试以前,你永远不知道自己学的其实非常少。
 
在第一次面试受到打击之后,我便决定开始面向面试复习,把这类问题统统找出来搞懂。
 
面向面试复习
 
既然我们的目标是面试,那么就必须要搞懂面试题都喜欢考哪些集合类的问题。
 
于是,上网找面试题就成为一件重要的工作,我花了好几天的时间到网上搜刮了各类Java面试题,不管是BAT的面经,还是网上整理比较详细的300道面试题,我都找来看了,虽然有很多重复的题目,但是大部分题目都是我没见过的。
 
原来学习Java编程集合类可以问出这么多问题来。
 
就拿ArrayList来说,可以问数据结构,可以问扩容和一些方法的实现,也可以问你它和linkedlist、vector的区别,复杂一点的,甚至会问你线程安全的ArrayList是怎么实现的,删除它里面的某个元素应该如何删除。
 
看起来简单问题的背后,其实都有很多坑,我也是看了很多面试题解析之后才慢慢了解到的。
 
Java集合类里最常问的一类题目,无疑就是hashmap了,这玩意实在是太热门了。
 
hashmap的数据结构是怎么样的,1.8和以前有什么区别么,put方法和get又是怎么实现的,扩容是如何进行的,甚至还会问你具体的hash算法是怎么实现的。
 
更复杂的还有呢,并发工具类里的linkedhashmap和hashmap有何区别,它又是如何实现的呢,这就牵扯到很多并发编程的相关知识了,这部分我们留着下次讲并发编程的内容时再来一起探讨。
 
看过足够多的集合类面试题,参加了足够多的面试之后,我似乎对这些面试题已经无感了,毕竟熟读唐诗三百首,不会做诗也会吟啊,就这么几种题型,每天回答个三五遍,几个月里都忘不掉了。
 
但是,事情并没有我想象的这么简单。虽然这些面试题多看几遍确实容易记住,但是记忆不能当饭吃,面试时万一想不出来那可是硬伤,更重要的是,很多时候,面试官问问题都不会按常理出牌,这些网上能找到的面试题,他们一样可以用别的方式不停地深挖,直到他了解到你的水平为止。
 
如果你只会简单地告诉面试官那些死记硬背的答案,而在他深挖集合类实现细节的时候没能答好的话,也是很扣分的,特别是对于美团、阿里这种Java大厂来说,他们抠细节的能力绝对超出你的想象。
 
搞懂原理最重要
 
既然面向面试题复习的方式不一定总是奏效,那么有没有更加好的选择呢。
 
还真有,那就是,理解技术的实现原理。面试题是个好东西,但是我们不能只停留在简单的一问一答上,并不是说你搞懂了这个面试题的答案是什么就行了。举个例子,比如说,Java中的hashmap的数据结构是什么样的,它的扩容方式又是如何的,这种时候,如果光是依靠面试题的答案去理解,多少会有一些片面。你可能可以大概答出个三四点,但是其实你可能也没真正理解为什么要这样做,或者实现细节是怎么样的。
 
实际上,要想真正了解hashmap的数据结构和实现原理,最好的办法就是去看源码,有的小伙伴肯定会眉头一皱,源码这么复杂,看不懂怎么办,没关系,自己看不懂,还可以让别人教你呀,网上有很多源码解析的博客,我自己也整理了不少,发在咱们的技术博客how2playlife.com上。
 
为什么要看源码呢,比如hashmap,它的类定义里就已经展示了它的数据结构,我们可以从中看出它是一个数组加链表的数据结构,这些成员变量都是在hashmap这个类里定义好的,并且,再看看它的put和get方法,你就可以知道它是如何插入和查询数据的,并且,在1.7和1.8源码比较的过程中,你也可以更好地理解这两个版本源码的区别。
 
而对于扩容方法也是一样的,在hashmap的扩容方法中,你可以看到的是,hashmap为了把原来的数据搬到扩容后的数据结构中,就必须要进行重新哈希,调整每个元素的索引和位置,这里面涉及了一系列算法,不看源码的话,你根本不知道扩容过程中到底发生了什么。
 
当你看完源码,不管你遇到的是原来那些面试题,还是有一些新的面试题,你总会发现其实都差不多,万变不离其宗,只要你理解了底层的实现之后,对于这些面试题应该都能够比较好地应付。