• 谈谈集合框架


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

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

  • 相关阅读:
    虚拟列表
    vue中使用postcsspxtorem实现适配
    打包工具 rollup.js 入门教程
    后端一次给你10万条数据,如何优雅展示,到底考察我什么
    手写Promise原理
    react路由集中管理及鉴权 reactrouterconfig
    结合代码实践,全面学习前端工程化
    KDE 全局菜单文字颜色不随 Plasma Style 变化
    vue使用intro.js引导组件
    第五章、Vue3高级
  • 原文地址:https://www.cnblogs.com/I0000/p/3581247.html
Copyright © 2020-2023  润新知