谈谈集合框架

  一寒假在家都没有网,很多想法很多项目中遇到的问题也没能及时记下来,结果博客断层了一个多月。现在拾起来。

  昨天去面试,两个面试官大哥很和蔼很帅气,然后给我的第一个问题就是谈谈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("\n"+"***********");
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里面的东西,结果大哥给了提示也说不正确,这让我感觉非常惭愧,以后要尽量让这个博客发挥出它的价值。

转载于:https://www.cnblogs.com/I0000/p/3581247.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值