一寒假在家都没有网,很多想法很多项目中遇到的问题也没能及时记下来,结果博客断层了一个多月。现在拾起来。
昨天去面试,两个面试官大哥很和蔼很帅气,然后给我的第一个问题就是谈谈ArrayList和LinkedList,这种集合框架的问题在面试中太常见了,以前老师给发过《葵花宝典》里面对这类问题总结的也非常详细,老师就让我们背下来,后来提问我的时候我按照自己的想法总体全面得说了一下,结束后老师评价一句:这是你编的吧。。。后来自己仔细想了一下确实好多口误和认识上的错误。所以今天总结一下,给自己提个醒。
首先引用百度上的一张比较标准图片吧:
这个图貌似有点绕,不过没关系,看多了就不绕了。接口Collection下面有两个子接口:List和Set;List下面三个实现类:LinkedList、ArrayList、Vector;Set下面两个实现类:TreeSet和HashSet(子类LinkedHashSet);右边接口Map下面有两个实现类TreeMap和HashMap(子类LinkedHashMap)。
首先看最上面的一个接口Collection,实现了Iterable接口,也就为集合提供了迭代器,这个iterator方法我就经常用。JDK不提供Collection的任何直接实现类,所有的实现都经过它的两个子接口。提供的一些方法全都是见名知意的,所以不再赘述。补充一点,老师以前说过所有的接口都是一个协议一个标准,它里面甚至可以什么方法都没有(举例就像cloneable),对这句话我暂时也没能理解太深,留给以后解决。
接下来Collection的两个子接口:Set和List。两者之间最大区别就是Set里存放的元素不能重复,而List里存放的元素可以重复(准确来讲是Set里不能同时存在a和b使得a.equals(b)成立,而List里可以同时存在a和b使得a.equals(b)成立)。两者之间还有一点区别是我今天重点记录的:List和Set的是否有序。对于很多资料上都寥寥地记录着List是有序的而Set是无序的,在我回答老师问题的时候我也这样回答,结果被老师狠批了一顿:谁说List有序了,你存个1、4、2、3它能给你排序不,Set内部才有自己的排序算法……当时我就震惊了,我们老师说的完全有道理,那些资料书上都是扯淡?下面我们一起来看一下JDK API帮助文档上面怎么说:“List:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。”。看出来了吧,对于大部分资料上说的List有序是指存储有序(但是大多数资料并没有写明这一点),就是存进去1、4、2、3后,用迭代器打印出来的还会是1、4、2、3;而Set怎么样呢?下面我用一小段代码做个测试:
1 public class Test { 2 3 public static void main(String[] args) { 4 5 Set set = new HashSet(); 6 7 set.add("1"); 8 set.add("a"); 9 set.add("2"); 10 set.add("b"); 11 set.add("3"); 12 set.add("c"); 13 14 List list = new ArrayList(); 15 16 list.add("1"); 17 list.add("a"); 18 list.add("2"); 19 list.add("b"); 20 list.add("3"); 21 list.add("c"); 22 23 24 Iterator it = set.iterator(); 25 while(it.hasNext()){ 26 System.out.print(it.next()+" "); 27 } 28 29 System.out.println(" "+"***********"); 30 31 Iterator it2 = list.iterator(); 32 while(it2.hasNext()){ 33 System.out.print(it2.next()+" "); 34 } 35 36 } 37 }
上述代码运行结果为:
这时候我又想了,那TreeSet和LinkedList会是怎么样呢,于是我又分别构建了两个集合,存入同样的元素,运行结果如下:
下面说一下Map接口。首先还是看一下帮助文档(这是一个非常好的习惯,就像看源代码一样,很多问题通过帮助文档可以一目了然地得到解决):将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。其实现类有HashMap和TreeMap。
关于集合还有一些要注意的地方:1.涉及堆栈、队列等用List。快速随机访问用ArrayList,快速插入、删除等用LinkedList。2.线程同步的类:Vector和HashTable;线程不同步的类:ArrayList LinkedList HashSet TreeSet HashMap TreeMap. 3.ArrayList的大小是如何自增的:ArrayList底层是用数组实现的,如果容量用完,会新建一个长度更长的数组,然后调用Arrays.copyof方法将旧的数组复制到新的数组中去。
在这个博客里我还是想说一下主要目的是给自己总结和复习,本身一个技术渣谈不上给别人什么指导,而且我总结的也是在别人总结的基础上总结别人的,可以说是嚼了别人嚼无数遍又吐出来的知识。如果不回顾自己的总结,不回头解决以前留下的问题,那这个博客对我来说也就没什么意义了。昨天面试官大哥就问了我一个问题:能不能说出在搭建ssh时候配置文件web.xml里面的一些配置,这个是我之前博客里总结过的,可是常用的application.xml和struts.xml还有点印象,所以稀里糊涂的回答了application.xml里面的东西,结果大哥给了提示也说不正确,这让我感觉非常惭愧,以后要尽量让这个博客发挥出它的价值。