前言:

在平常的写java程序中,常用除了8种常用数据类型,String对象外,还有集合类,例如ArrayList,HashMap等,这些最常用。

一、List接口

  List接口为Collection直接接口。List所代表的是有序的Collection(容器),即用某种特定的插入顺序维护元素顺序。使用者可以对列表中每个元素插入的位置进行精确的控制。然后可以根据元素的整数索引访问元素,并搜索列表中的元素。例如:get(1);实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

  1-1:ArrayList

    ArrayList是一个动态数组,也是我们使用最多的集合。它允许任何符号规则的元素插入(包括null)。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器的元素不断增加,容器的大小也会自动增加,在每次向容器中增加元素的同时都会进行容器检查,当快溢出时,就会进行扩容操作。(如果我们明确所插入的元素的多少,最好指定一个初始容量值,避免过度的进行扩容操作而影响程序性能。)

  常用的操作:size,isEmpty,get,set,iterator 和 listIterator,都是以固定时间运行。

  ArrayList 擅长随机访问,因为基于动态数组的数据结构原因。(联想物理存址的概念)

  (非同步的,多线程访问下同一个List,需要实现访问同步)

  1-2:LinkedList

    LinkedList是一个双向链表,除了有ArrayList的基本操作以外,还额外提供了get,remove,insert方法在LinkedList的首部或尾部。由于LinkedList是基于双重链表的数据结构,所有操作都要按照该数据结构执行,在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端),可以通过较低的代价在List中进行插入和删除操作。(联想链表的物理存址方便性)

    与ArrayList 一样,(非同步的,多线程访问下同一个List,需要实现访问同步)

  1-3:Vector

    与ArrayList相似,但是Vector是同步的。Vector是线程安全的动态数组。它的操作与ArrayList几乎一样,(但是写代码时候很少用到,也不知道为什么。)

  1-4:Stack

    Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

    (但是写代码时候很少用到,也不知道为什么。)

二、Set接口

  set是一种不包括重复元素的Collection。它维持自己的内部排序,并不能随机访问,与List一样,允许null的存在,但是仅有一个,由于Set接口的特殊性,传入Set集合中的元素都必须不同,同事要注意任何可变对象,如果在对集合中元素进行操作时,导致e1.equals(e2)==true,则必定会产生某些问题。

  Set接口的集合有:EnumSet、HashSet、TreeSet

  :2-1:EnumSet

  一看Enum就知道是枚举的Set,所有元素都是枚举类型。因为其内部是以HashCode来实现的,内部

  2-2:HashSet

  HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的,内部元素的顺序由哈希码来决定,所以迭代顺序不清楚。

  2-3:TreeSet

  基于TreeMap,生成一个总是处于排序状态的set,内部以TreeMap来实现。是使用元素的自然顺序对元素进行排序,或者根据创建Set是提供的Comparator进行排序,具体取决于使用的构造方法。

三、Map接口

  Map与List、Set接口不同,他是由一系列键值对组成的集合,提供了key-value的映射,同时也没有继承Collection。在Map中,他保证了key与value之间的对应关系,不会存在相同的key,Map的put方法不允许key重复的。

  3-1:HashMap

  一看就知道是以哈希表数据结构实现,查找对象时,通过哈希函数计算其位置,为了快速查询。内部定义了一个hash表数组(Entry[ ]  table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存在的索引,如果有冲突,则使用散列链表的形式将所有相同的哈希地址的元素串起来,是一个单链表结构。

  3-2:TreeMap

  key是以某种排序规则排序,内部以red-black Tree(红黑树)的数据结构实现,实现了SortedMap接口

  3-3:HashTable

  也是哈希表数据结构的Map,线程安全,适用于同步操作,所以性能比HashMap要低。

四、Queue

  队列,它主要分为两大类,一类是阻塞式队列,队列满了以后再插入元素则会抛出异常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一种队列则是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。

五、相互区别

  Vector 和 ArrayList

  (1)Vector是线程同步的,所以他也是线程安全的,而ArrayList是线程异步,不安全,一般不考虑多线程情况下,使用ArrayList效率高。

  (2)如何集合中元素的数目大于目前集合数组的长度时,Vector增长率为当前数组长度的100%,而ArrayList增长率为50%,考虑到集合使用数据比较大时,使用Vector比较好。

  (3)查找指定位置的数据,Vector和ArrayList使用时间是相同的。而移动数据位置最快是LinkedList。

  (4)ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要 差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快

  ArrayList和LinkedList

  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
  3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
      这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数 据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

  

  HashMap与TreeMap

1、HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。HashMap中元素的排列顺序是不固定的)。

2、  HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。

3、在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和 equals()的实现。 这个TreeMap没有调优选项,因为该树总处于平衡状态。

  Hashtable与Hashmap

1、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 。

2、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的 。

3、值:只有HashMap可以让你将空值作为一个表的条目的key或value 。

Java面试题集(二)list与Map相关知识(1.2)的更多相关文章

  1. 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

    Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...

  2. JAVA面试题集之基础知识

                           JAVA面试题集之基础知识 基础知识:  1.C 或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就 ...

  3. 互联网大厂Java面试题集—Spring boot面试题(一)

    Spring Boot 需要独立的容器运行吗? 可以不需要,内置了 Tomcat/ Jetty 等容器.通过pom.xml中导入依赖: <!--spring-boot-starter-web:代 ...

  4. Java面试题全集(上-中-下)及Java面试题集(1-50/51-70)

    阅读量超百万级的文章,收藏并分享一下.感谢原创作者的总结 对初中级java开发人员有特别大的帮助,不论是技术点面试还是知识点总结上. Java面试题全集(上):     https://blog.cs ...

  5. java高级工程师开放面试题集<二>

    临近年关,不少人蠢蠢欲动,有童鞋问我java后端面试会面试什么? 作为一个java后端老鸟,跌打滚爬多次被面试和面试别人,总结了一些经验,希望对大家有所帮助. 特别说明,仅仅针对工作两年以上的java ...

  6. Java面试题集(51-70)

    Java程序员面试题集(51-70) 51.类ExampleA 继承Exception,类ExampleB 继承ExampleA. 有如下代码片断: try{ thrownew ExampleB(“b ...

  7. 大公司的Java面试题集

    找工作要面试,有面试就有对付面试的办法.以下一些题目来自我和我朋友痛苦的面试经历,提这些问题的公司包括IBM, E*Trade, Siebel, Motorola, SUN, 以及其它大小公司. 面试 ...

  8. java面试题集2

    JAVA面试题-CORE JAVA部分          1.  在main(String[] args)方法内是否可以调用一个非静态方法? 答案:不能 2.  同一个文件里是否可以有两个public ...

  9. Java面试题集(116-135)

    Java程序员面试题集(116-135) 摘要:这一部分讲解基于Java的Web开发相关面试题,即便在Java走向没落的当下,基于Java的Web开发因为拥有非常成熟的解决方案,仍然被广泛应用.不管你 ...

  10. Java面试题集(71-85)

    Java程序员面试题集(71-85) 摘要:这一部分主要包括了UML(统一建模语言).面向对象的设计原则(六原则一法则).GoF设计模式.企业级设计模式.JDBC(Java数据库连接).XML(可扩展 ...

随机推荐

  1. python-数据清洗与编码解码

    0x01 join str = 'hk$$yicunyiye$$hello world' print(str.split('$$')) #自己实现 result = '' for i in str.s ...

  2. 给你的MyBatis-Plus装上批量插入的翅膀

    努力和选择,哪个更重要?关注微信公众号[天开易想]这是一位懂互联网研发和架构的户外.篮球老铁 前言 各位好,我是易哥(thinkYi). 大家有用过MyBatis-Plus(简称MP)的都知道它是一个 ...

  3. NodeJS沙箱逃逸&&vm

    NodeJS沙箱逃逸 关于nodejs的沙箱 使用场景 在线代码编辑器 第三方js代码 jsonp,like百度搜索框 https://www.baidu.com/s?wd=nodejs&mi ...

  4. HTTP 的前世今生,那些不为人知的秘密

    每个时代,都不会亏待会学习的人. 大家好,我是 yes. HTTP 协议在当今的互联网可谓是随处可见,一直默默的在背后支持着网络世界的运行,对于我们程序员来说 HTTP 更是熟悉不过. 平日里我们都说 ...

  5. [论文理解] Good Semi-supervised Learning That Requires a Bad GAN

    Good Semi-supervised Learning That Requires a Bad GAN 恢复博客更新,最近没那么忙了,记录一下学习. Intro 本文是一篇稍微偏理论的半监督学习的 ...

  6. 027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑“与”运算符

    027 01 Android 零基础入门 01 Java基础语法 03 Java运算符 07 逻辑"与"运算符 本文知识点:Java中的逻辑"与"运算符 逻辑运 ...

  7. 004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构

    004 01 Android 零基础入门 01 Java基础语法 01 Java初识 04 Java程序的结构 Java程序的结构 Java程序外层--类 程序外层,如下面的代码,是一个类的定义. c ...

  8. AMD Ryzen 5000系列桌面处理器 2020年10月8日发布

    AMD Ryzen 5 5600X 6核心12线程,基础频率3.7GHz,最大频率4.6GHz,二级缓存3MB,三级缓存32MB,不锁频,支持DDR4 3200MHz内存,台积电7纳米工艺,PCIe ...

  9. c#之task与thread区别及其使用

    如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! ! --------------------------- ...

  10. Dubbo的负载均衡策略&容错策略

    dubbo的负载均衡策略 RandomLoadBalance 随机调用负载均衡 默认方式该类实现了抽象的AbstractLoadBalance接口,重写了doSelect方法,看方法的细节就是首先遍历 ...