集合(一)

● 请说明List、Map、Set三个接口存取元素时,各有什么特点?

考察点:List

参考回答:

List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。

● 阐述ArrayList、Vector、LinkedList的存储性能和特性

考察点:ArrayList

参考回答:

ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

● 请判断List、Set、Map是否继承自Collection接口?

考察点:collection接口

参考回答:

List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

● 请讲讲你所知道的常用集合类以及主要方法?

考察点:集合

参考回答:

最常用的集合类是List 和 Map。
List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。

● 请说明Collection 和 Collections的区别。

考察点:集合

参考回答:

Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

● 请简要说明ArrayList,Vector,LinkedList的存储性能和特性是什么?

考察点:ArrayList

参考回答:

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

● 请说明ArrayList和LinkedList的区别?

考察点:ArrayList

参考回答:

ArrayList和LinkedList都实现了List接口,他们有以下的不同点: 
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。 
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

● 请你说明HashMap和Hashtable的区别? 

考察点:集合

参考回答:

HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点: 
HashMap允许键和值是null,而Hashtable不允许键或者值是null。 
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。 
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。 
一般认为Hashtable是一个遗留的类。

● 请说说快速失败(fail-fast)和安全失败(fail-safe)的区别?

考察点:集合

参考回答:

Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

● 请你说说Iterator和ListIterator的区别?

考察点:迭代器

参考回答:

Iterator和ListIterator的区别是: 
Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。 
Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。 
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

● 请简单说明一下什么是迭代器?

考察点:JAVA迭代器

参考回答:

Iterator提供了统一遍历操作集合元素的统一接口, Collection接口实现Iterable接口, 每个集合都通过实现Iterable接口中iterator()方法返回Iterator接口的实例, 然后对集合的元素进行迭代操作. 有一点需要注意的是:在迭代元素的时候不能通过集合的方法删除元素, 否则会抛出ConcurrentModificationException 异常. 但是可以通过Iterator接口中的remove()方法进行删除.

推荐文章

协同线程

最早接触coroutine是在02年使用unreal engine时。unreal script通过支持latent function和state代码实现了coroutine的思想。由于unreal script属于私有语言,整个语言设计的针对性比较强,所以虽然很好用,但是在语言的通用性上的没有任何的考虑。03年开始接触lua时,被他的coro

推荐文章

World Quant 面试题-4

Question: 一条东西向长街,你站在街中间,街北是一排门,你有一把钥匙,请写出一种策略,要求X/N在最坏情况下最少,X为你到达正确的门时所走的总路程,N为正确的门距原点的距离,可以假设门与门之间距离为1。   Definition: 1.      There

推荐文章

应聘时的常见问题及回答提示---和-常用英文(200句)

“你能为我们公司做什么?”,很多英语面试官都喜欢问这个面试问题,这也是每个用人单位最为关心的一个问题。   “为什么我们会选择你,你比别人更能胜任这个职位的地方在哪里?”     对于这个问题,我想可以从三个方面回答。 About this question,I think I can explain

推荐文章

SD卡协议学习点滴(一)

转自:http://hi.baidu.com/narshben/blog/item/b427a416dd2bea4520a4e992.html 首先SD卡有所谓操作模式(operation mode)的概念,每种操作模式又具体对应一种或多种状态,主机通过发送命令可以使SD卡在不同的状态间转换,SD卡则接受命令,并根据自己现在所处状态做出

推荐文章

程序员编程技术迅速提高的终极攻略

前言 你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发) 建议: 不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。 回顾一下

推荐文章

nodejs发送邮件

这里我主要使用的是 nodemailer 这个插件 第一步 下载依赖 cnpm install nodemailer --save 第二步 建立email.js ‘use strict‘; const nodemailer = require(‘nodemailer‘); let transporter =

推荐文章

理解 JavaScript 的 async/await

随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await。我第一次看到这组关键字并不是在 JavaScript 语言里,而是在 c# 5.0 的语法中。C# 的 async/await 需要在 .NET Framework 4.5 以上的版本中使用,因此我还很悲伤了一阵——为了要兼容 XP 系统,我们

推荐文章

程序员与厨师

不管你信不信,反正我是信了,每一个程序员上辈子都是呆在厨房的厨子. 好吧,你不信,我来证明给你看. 1 下厨前,你得知道做的是早餐还是中晚餐, 中晚餐的话, 怎么也得走趟超市,如遇到好友聚会,怎么着也得做出一桌对得起朋友的饭菜.还有你得分析,朋友中的几人,谁的口味重,谁爱吃辣,谁又完全碰不得,谁最近心烦可能多喝点酒.这一切的一切都决定你去

推荐文章

7788

    #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<map> #include<iomani

推荐文章

[包计划] 30-seconds-of-code

精选的 JavaScript 代码片段集合,都很简短。正如这个库的名字,可以在 30秒 或更短的时间内理解这些代码段。 来源 GitHub 官方网站 内容 Adapter Array Browser Date Function Math Node Object String Typ

推荐文章

ubuntu下webpack初始化vue项目

一、安装node和npm sudo apt install -y nodejs sudo apt install -y npm 二、安装vue和vue-cli npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install vue

推荐文章

04-树6 Complete Binary Search Tree (30 分)

  04-树6 Complete Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties

推荐文章

SequoiaDB中查看集合空间,集合信息

由于在刚开始使用SequoiaDB时候,以为用getCS()就能获得集合空间,用getCL()就能获得集合。后来发现是需要list,故特意写出来供大家参考~~~ 首先创建两个集合空间,分别为foo和Zoo。 db.createCS(“foo”)  db.createCS(“Zoo”) 然后在两个集合空间中分别创建

推荐文章

[个人项目] 使用 Vuejs 完成的音乐播放器

Foreword 虽然音乐播放这类的项目的静态展示居多,业务逻辑并不复杂,但是对于我这种后端出身的前端萌新来说,能使用vuejs完成大部分功能, 也会有许多收获。 api:我使用的是一个开源的 nodejs 封装的网易云音乐 api,名叫NeteaseCloudMusicApi 文档地址 github地址 感谢大佬提供的学习资源. 我

推荐文章

namenode 问题小记

问题1:namenode进程故障 Namenode挂掉,Namenode gc日志里面YGC报错promotion failed 现象描述 NameNode进程挂掉,Namenode gc日志里面YGC报错promotion failed。 可能原因 Young gc的时候,需要复制eden区和from区内的对象到to区,如果此时to

推荐文章

failover swarm 故障转移

#故障转移 Failover #当其中一个节点关闭宕机时,其节点中的service会转移到另一个节点上。Swarm会检测到node1发生故障并把此故障节点的状态标记为Down; docker node ls 可查看 node1的STATUS 为Down同时 Swarm会把node1上的service调度到其它有资源的节点上来运行;docker