东时 资讯

2017年HTML5全栈开发面试题汇总

开心果烁烁 2017-03-14 4603 0

摘要: 2017年​HTML5全栈开发面试题汇总,仅部分问题有答案,其他请自行解决处理。

2017年HTML5全栈开发面试题汇总,仅部分问题有答案,其他请自行解决处理。分为四部分,HTML,CSS,JavaScript,Java。

QQ图片20170315155230.png

一、HTML常见题目

01、Doctype作用?严格模式与混杂模式如何区分?它们有何意义?

02、HTML5 为什么只需要写 <!DOCTYPE HTML>?

答:Html5不基于SGML,因此不需要对DTD进行引用,但是需要DOCTYPE来规范浏览器的行为(让浏览器按照他们应该的方式来运行)而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。

03、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

答:行内元素:a  b  span  img  input  select  strong

块级元素:div  ul  ol  li  dl  dt  dd  h1  h2  h3  h4  p  等

空元素:<br>  <hr>  <img>  <link> <meta>

04、页面导入样式时,使用link和@import有什么区别?

05、介绍一下你对浏览器内核的理解?

06、常见的浏览器内核有哪些?

07、Html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?

答:新特性,新增元素:

1)内容元素:article、footer、header、nav、section

2)表单控件:calendar、date、time、email、url、search

3)控件元素:webworker,websockt,Geolocation

移除元素:

1)显现层元素:basefont,big,center,font,s,strike,tt,u

2)性能较差元素:frame,frameset,noframes

处理兼容问题有两种方式:

1)IE6/IE7/IE8支持通过document方法产生的标签,利用这一特性让这些浏览器支持HTML5新标签。

2)使用是html5shim框架

另外,DOCTYPE声明的方式是区分HTML和HTML5标志的一个重要因素,此外,还可以根据新增的结构,功能元素来加以区分。

08、如何区分 HTML 和 HTML5?

答:1)在文档类型声明上不同:

HTML是很长的一段代码,很难记住,而HTML5却只有简简单单的声明,方便记忆。

2)在结构语义上不同:

HTML:没有体现结构语义化的标签,通常都是这样来命名的<div id="header"></div>,这样表示网站的头部。

HTML5:在语义上却有很大的优势。提供了一些新的标签,比如:<header><article><footer>

09、简述一下你对HTML语义化的理解?

答:1)用正确的标签做正确的事情;

2)html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析;

3)即使在没有样式css情况下也以一种文档格式显示,并且是容易阅读的;

4)搜索引擎的爬虫也依赖于HTML标记来确定上下文和各个关键字的权重,利于SEO;

5)使于都源代码的人对网站更容易将网站分块,便于阅读维护理解。

10、HTML5的离线储存怎么使用,工作原理能不能解释一下?

答:localStorage 长期存储数据,浏览器关闭后数据不丢失;

sessionStorage 数据在浏览器关闭后自动删除。

11、浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?

12、请描述一下 cookies,sessionStorage 和 localStorage 的区别?

13、iframe有那些缺点?

答:1)在网页中使用框架结构最大的弊病是搜索引擎的“蜘蛛”程序无法解读这种页面;

2)框架结构有时会让人感到迷惑,页面很混乱;

14、Label的作用是什么?是怎么用的?(加 for 或 包裹)

15、HTML5的form如何关闭自动完成功能?

16、如何实现浏览器内多个标签页之间的通信? (阿里)

17、webSocket如何兼容低浏览器?(阿里)

18、页面可见性(Page Visibility)API 可以有哪些用途?

19、如何在页面上实现一个圆形的可点击区域?

20、实现不使用 border 画出1px高的线,在不同浏览器的Quirksmode和CSSCompat模式下都能保持同一效果。

21、网页验证码是干嘛的,是为了解决什么安全问题?

22、tite与h1的区别、b与strong的区别、i与em的区别?

 

二、CSS面试题

 

01、介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的?

02、CSS选择符有哪些?哪些属性可以继承?

答:1)id 选择器(#myid)

 

2)类选择器(.myclassname)

 

3)标签选择器(div,h1,p)

 

4)相邻选择器(h1 + p)

 

5)子选择器(ul > li)

 

6)后代选择器(li a)

 

7)通配符选择器(* )

 

8)属性选择器( a[rel = "external"])

 

9)伪类选择器(a: hover, li: nth - child)

 

可继承的样式: font-size font-family color, UL LI DL DD DT

03、CSS优先级算法如何计算?

04、CSS3新增伪类有那些?

答:p:first-of-type   选择属于其父元素的首个 <p> 元素的每个 <p> 元素;

 

p:last-of-type   选择属于其父元素的最后 <p> 元素的每个 <p> 元素;

 

p:only-of-type  选择属于其父元素唯一的 <p> 元素的每个 <p> 元素;

 

p:only-child    选择属于其父元素的唯一子元素的每个 <p> 元素;

 

p:nth-child(2)  选择属于其父元素的第二个子元素的每个 <p> 元素;

 

:enabled  :disabled 控制表单控件的禁用状态;

 

:checked        单选框或复选框被选中。

05、如何居中div?如何居中一个浮动元素?如何让绝对定位的div居中?

06、display有哪些值?说明他们的作用。

07、position的值relative和absolute定位原点是?

08、CSS3有哪些新特性?

答:CSS3 实现圆角(border-radius:8px;),阴影(box-shadow:10px),对文字加特效(text-shadow),线性渐变(gradient),旋转(transform)

 

transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜增加了更多的 css 选择器 多背景 rgba

09、请解释一下CSS3的Flexbox(弹性盒布局模型),以及适用场景?

10、用纯CSS创建一个三角形的原理是什么?

11、一个满屏 品 字布局 如何设计?

12、常见兼容性问题?

13、li与li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

14、经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧?

15、为什么要初始化CSS样式。

答:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对 CSS 初始化往往会出现浏览器之间的页面显示差异。

 

当然,初始化样式会对 SEO 有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。

 

最简单的初始化方法是:*{padding:0;margin:0} (不建议)

 

淘宝的样式初始化:

 

body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input,

 

        textarea, th, td { margin:0; padding:0; }

 

        body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }

 

        h1, h2, h3, h4, h5, h6{ font-size:100%; }

 

        address, cite, dfn, em, var { font-style:normal; }

 

        code, kbd, pre, samp { font-family:couriernew, courier, monospace; }

 

        small{ font-size:12px; }

 

        ul, ol { list-style:none; }

 

        a { text-decoration:none; }

 

        a:hover { text-decoration:underline; }

 

        sup { vertical-align:text-top; }

 

        sub{ vertical-align:text-bottom; }

 

        legend { color:#000; }

 

        fieldset, img { border:0; }

 

        button, input, select, textarea { font-size:100%; } table { border-collapse:collapse; border-spacing:0; }

16、absolute的containingblock计算方式跟正常流有什么不同?

17、CSS里的visibility属性有个collapse属性值是干嘛用的?在不同浏览器下以后什么区别?

18、position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?

19、对BFC规范(块级格式化上下文:block formatting context)的理解?

20、CSS权重优先级是如何计算的?

21、请解释一下为什么会出现浮动和什么时候需要清除浮动?清除浮动的方式

22、移动端的布局用过媒体查询吗?

23、使用 CSS 预处理器吗?喜欢那个?

24、CSS优化、提高性能的方法有哪些?

25、浏览器是怎样解析CSS选择器的?

26、在网页中的应该使用奇数还是偶数的字体?为什么呢?

27、margin和padding分别适合什么场景使用?

28、抽离样式模块怎么写,说出思路,有无实践经验?[阿里航旅的面试题]

29、元素竖向的百分比设定是相对于容器的高度吗?

30、全屏滚动的原理是什么?用到了CSS的那些属性?

31、什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?

32、视差滚动效果,如何给每页做不同的动画?(回到顶部,向下滑动要再次出现,和只出现一次分别怎么做?)

33、::before 和:after中双冒号和单冒号 有什么区别?解释一下这2个伪元素的作用。

34、如何修改chrome记住密码后自动填充表单的黄色背景 ?

35、你对line-height是如何理解的?

36、设置元素浮动后,该元素的display值是多少?(自动变成display:block)

37、怎么让Chrome支持小于12px 的文字?

38、让页面里的字体变清晰,变细用CSS怎么做?(-webkit-font-smoothing: antialiased;)

39、font-style属性可以让它赋值为“oblique” oblique是什么意思?

40、position:fixed;在Android下无效怎么处理?

41、如果需要手动写动画,你认为最小时间间隔是多久,为什么?(阿里)

42、display:inline-block 什么时候会显示间隙?(携程)

43、overflow: scroll时不能平滑滚动的问题怎么处理?

44、有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度。


三、JavaScript面试题

 

01、介绍JavaScript的基本数据类型。

02、说说写JavaScript的基本规范?

03、JavaScript原型,原型链 ? 有什么特点?

04、JavaScript有几种类型的值?(堆:原始数据类型和栈:引用数据类型),你能画一下他们的内存图吗?

05、Javascript如何实现继承?

06、Javascript创建对象的几种方式?

07、Javascript作用链域?

08、谈谈This对象的理解。

09、eval是做什么的?

10、什么是window对象? 什么是document对象?

11、null,undefined的区别?

12、写一个通用的事件侦听器函数(机试题)。

13、[“1”, “2”, “3”].map(parseInt) 答案是多少?

14、关于事件,IE与火狐的事件机制有什么区别? 如何阻止冒泡?

15、什么是闭包(closure),为什么要用它?

16、javascript 代码中的”use strict”;是什么意思 ? 使用它区别是什么?

17、如何判断一个对象是否属于某个类?

18、new操作符具体干了什么呢?

19、用原生JavaScript的实现过什么功能吗?

20、Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?

21、对JSON的了解?

22、[].forEach.call($$("*"),function(a){a.style.outline="1px solid#"+(~~(Math.random()*(1<<24))).toString(16) }) 能解释一下这段代码的意思吗?

23、js延迟加载的方式有哪些?

24、Ajax 是什么? 如何创建一个Ajax?

25、同步和异步的区别?

26、如何解决跨域问题?

27、页面编码和被请求的资源编码如果不一致如何处理?

28、模块化开发怎么做?

29、AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?

30、requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何缓存的?)

31、让你自己设计实现一个requireJS,你会怎么做?

32、谈一谈你对ECMAScript6的了解?

33、ECMAScript6 怎么写class么,为什么会出现class这种东西?

34、异步加载的方式有哪些?

35、documen.write和 innerHTML的区别?

36、DOM操作——怎样添加、移除、移动、复制、创建和查找节点?

37、.call() 和.apply() 的含义和区别?

38、数组和对象有哪些原生方法,列举一下?

39、JS 怎么实现一个类。怎么实例化这个类

40、JavaScript中的作用域与变量声明提升?

41、如何编写高性能的Javascript?

42、那些操作会造成内存泄漏?

43、jQuery的源码看过吗?能不能简单概况一下它的实现原理?

44、jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?

45、jquery中如何将数组转化为json字符串,然后再转化回来?

46、jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

47、jquery.extend 与 jquery.fn.extend的区别?

48、jQuery 的队列是如何实现的?队列可以用在哪些地方?

49、谈一下Jquery中的bind(),live(),delegate(),on()的区别?

50、JQuery一个对象可以同时绑定多个事件,这是如何实现的?

51、是否知道自定义事件。jQuery里的fire函数是什么意思,什么时候用?

52、jQuery 是通过哪个方法和 Sizzle 选择器结合的?(jQuery.fn.find()进入Sizzle)

53、针对 jQuery性能的优化方法?

54、Jquery与jQueryUI有啥区别?

55、JQuery的源码看过吗?能不能简单说一下它的实现原理?

56、jquery 中如何将数组转化为json字符串,然后再转化回来?

57、jQuery和Zepto的区别?各自的使用场景?

58、针对 jQuery 的优化方法?

59、Zepto的点透问题如何解决?

60、jQueryUI如何自定义组件?

61、需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案?

62、如何判断当前脚本运行在浏览器还是node环境中?(阿里)

63、移动端最小触控区域是多大?

64、jQuery 的slideUp动画 ,如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行,该如何处理呢?

65、把 Script 标签 放在页面的最底部的body封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?

66、移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时?(click 有300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是不是要双击操作。)

67、知道各种JS框架(Angular,Backbone, Ember, React, Meteor, Knockout…)么? 能讲出他们各自的优点和缺点么?

68、Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法?

69、解释JavaScript中的作用域与变量声明提升?

70、那些操作会造成内存泄漏?

71、JQuery一个对象可以同时绑定多个事件,这是如何实现的?

72、Node.js的适用场景?(如果会用node)知道route,middleware, cluster, nodemon, pm2, server-side rendering么?

73、解释一下 Backbone 的 MVC 实现方式?

74、什么是“前端路由”?什么时候适合使用“前端路由”? “前端路由”有哪些优点和缺点?

75、知道什么是webkit么? 知道怎么用浏览器的各种工具来调试和debug代码么?



四、Java面试题

1.Java集合框架是什么?说出一些集合框架的优点?


每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:


(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。


(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。


(3)通过使用JDK附带的集合类,可以降低代码维护成本。


(4)复用性和可操作性。


2.集合框架中的泛型有什么优点?


Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。


3.Java集合框架的基础接口有哪些?


Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。


Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。


List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。


Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。


一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。


4.为何Collection不从Cloneable和Serializable接口继承?


Collection接口指定一组对象,对象即为它的元素。如何维护这些元素由Collection的具体实现决定。例如,一些如List的Collection实现允许重复的元素,而其它的如Set就不允许。很多Collection实现有一个公有的clone方法。然而,把它放到集合的所有实现中也是没有意义的。这是因为Collection是一个抽象表现。重要的是实现。


当与具体实现打交道的时候,克隆或序列化的语义和含义才发挥作用。所以,具体实现应该决定如何对它进行克隆或序列化,或它是否可以被克隆或序列化。


在所有的实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的实现应该决定它是否可以被克隆和序列化。


5.为何Map接口不继承Collection接口?


尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。


如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。


6.Iterator是什么?


7.Enumeration和Iterator接口的区别?


8.为何没有像Iterator.add()这样的方法,向集合中添加元素?


语义不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,ListIterator没有提供一个add操作,它要确保迭代的顺序。


9.为何迭代器没有一个方法可以直接获取下一个元素,而不需要移动游标?


它可以在当前Iterator的顶层实现,但是它用得很少,如果将它加到接口中,每个继承都要去实现它,这没有意义。


10.Iterater和ListIterator之间有什么区别?


(1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。


(2)Iterator只可以向前遍历,而LIstIterator可以双向遍历。


(3)ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。


11.遍历一个List有哪些不同的方式?



12.通过迭代器fail-fast属性,你明白了什么?


每次我们尝试获取下一个元素的时候,Iterator fail-fast属性检查当前集合结构里的任何改动。如果发现任何改动,它抛出ConcurrentModificationException。Collection中所有Iterator的实现都是按fail-fast来设计的(ConcurrentHashMap和CopyOnWriteArrayList这类并发集合类除外)。


13.fail-fast与fail-safe有什么区别?


14.在迭代一个集合的时候,如何避免ConcurrentModificationException?


在遍历一个集合的时候,我们可以使用并发集合类来避免ConcurrentModificationException,比如使用CopyOnWriteArrayList,而不是ArrayList。


15.为何Iterator接口没有具体的实现?


Iterator接口定义了遍历集合的方法,但它的实现则是集合实现类的责任。每个能够返回用于遍历的Iterator的集合类都有它自己的Iterator实现内部类。


这就允许集合类去选择迭代器是fail-fast还是fail-safe的。比如,ArrayList迭代器是fail-fast的,而CopyOnWriteArrayList迭代器是fail-safe的。


16.UnsupportedOperationException是什么?


UnsupportedOperationException是用于表明操作不支持的异常。在JDK类中已被大量运用,在集合框架java.util.Collections.UnmodifiableCollection将会在所有add和remove操作中抛出这个异常。


17.在Java中,HashMap是如何工作的?


HashMap在Map.Entry静态内部类实现中存储key-value对。HashMap使用哈希算法,在put和get方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。Entry存储在LinkedList中,所以如果存在entry,它使用equals()方法来检查传递的key是否已经存在,如果存在,它会覆盖value,如果不存在,它会创建一个新的entry然后保存。当我们通过传递key调用get方法时,它再次使用hashCode()来找到数组中的索引,然后使用equals()方法找出正确的Entry,然后返回它的值。下面的图片解释了详细内容。


其它关于HashMap比较重要的问题是容量、负荷系数和阀值调整。HashMap默认的初始容量是32,负荷系数是0.75。阀值是为负荷系数乘以容量,无论何时我们尝试添加一个entry,如果map的大小比阀值大的时候,HashMap会对map的内容进行重新哈希,且使用更大的容量。容量总是2的幂,所以如果你知道你需要存储大量的key-value对,比如缓存从数据库里面拉取的数据,使用正确的容量和负荷系数对HashMap进行初始化是个不错的做法。


18.hashCode()和equals()方法有何重要性?


HashMap使用Key对象的hashCode()和equals()方法去决定key-value对的索引。当我们试着从HashMap中获取值的时候,这些方法也会被用到。如果这些方法没有被正确地实现,在这种情况下,两个不同Key也许会产生相同的hashCode()和equals()输出,HashMap将会认为它们是相同的,然后覆盖它们,而非把它们存储到不同的地方。同样的,所有不允许存储重复数据的集合类都使用hashCode()和equals()去查找重复,所以正确实现它们非常重要。equals()和hashCode()的实现应该遵循以下规则:


(1)如果o1.equals(o2),那么o1.hashCode() == o2.hashCode()总是为true的。


(2)如果o1.hashCode() == o2.hashCode(),并不意味着o1.equals(o2)会为true。


19.我们能否使用任何类作为Map的key?



20.Map接口提供了哪些不同的集合视图?


Map接口提供三个集合视图:


(1)Set keyset():返回map中包含的所有key的一个Set视图。集合是受map支持的,map的变化会在集合中反映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。


(2)Collection values():返回一个map中包含的所有value的一个Collection视图。这个collection受map支持的,map的变化会在collection中反映出来,反之亦然。当一个迭代器正在遍历一个collection时,若map被修改了(除迭代器自身的移除操作以外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。


(3)Set<Map.Entry<K,V>> entrySet():返回一个map钟包含的所有映射的一个集合视图。这个集合受map支持的,map的变化会在collection中反映出来,反之亦然。当一个迭代器正在遍历一个集合时,若map被修改了(除迭代器自身的移除操作,以及对迭代器返回的entry进行setValue外),迭代器的结果会变为未定义。集合支持通过Iterator的Remove、Set.remove、removeAll、retainAll和clear操作进行元素移除,从map中移除对应的映射。它不支持add和addAll操作。


21.HashMap和HashTable有何不同?


23.ArrayList和Vector有何异同点?


ArrayList和Vector在很多时候都很类似。


(1)两者都是基于索引的,内部由一个数组支持。


(2)两者维护插入的顺序,我们可以根据插入顺序来获取元素。


(3)ArrayList和Vector的迭代器实现都是fail-fast的。


(4)ArrayList和Vector两者允许null值,也可以使用索引值对元素进行随机访问。


以下是ArrayList和Vector的不同点。


(1)Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。


(2)ArrayList比Vector快,它因为有同步,不会过载。


(3)ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。


24.Array和ArrayList有何区别?什么时候更适合用Array?


Array可以容纳基本类型和对象,而ArrayList只能容纳对象。


Array是指定大小的,而ArrayList大小是固定的。


Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。


(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。


(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。


(3)如果你要使用多维数组,使用[][]比List<List<>>更容易。


25.ArrayList和LinkedList有何区别?


ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。


(1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。


(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。


(3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。


26.哪些集合类提供对元素的随机访问?


ArrayList、HashMap、TreeMap和HashTable类提供对元素的随机访问。


27.EnumSet是什么?


java.util.EnumSet是使用枚举类型的集合实现。当集合创建时,枚举集合中的所有元素必须来自单个指定的枚举类型,可以是显示的或隐示的。EnumSet是不同步的,不允许值为null的元素。它也提供了一些有用的方法,比如copyOf(Collection c)、of(E first,E…rest)和complementOf(EnumSet s)。


28.哪些集合类是线程安全的?


Vector、HashTable、Properties和Stack是同步类,所以它们是线程安全的,可以在多线程环境下使用。Java1.5并发API包括一些集合类,允许迭代时修改,因为它们都工作在集合的克隆上,所以它们在多线程环境中是安全的。


29.并发集合类是什么?


Java1.5并发包(java.util.concurrent)包含线程安全集合类,允许在迭代时修改集合。迭代器被设计为fail-fast的,会抛出ConcurrentModificationException。一部分类为:CopyOnWriteArrayList、 ConcurrentHashMap、CopyOnWriteArraySet。


30.BlockingQueue是什么?


Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。


31.队列和栈是什么,列出它们的区别?


栈和队列两者都被用来预存储数据。java.util.Queue是一个接口,它的实现类在Java并发包中。队列允许先进先出(FIFO)检索元素,但并非总是这样。Deque接口允许从两端检索元素。


栈与队列很相似,但它允许对元素进行后进先出(LIFO)进行检索。


Stack是一个扩展自Vector的类,而Queue是一个接口。


32.Collections类是什么?


Java.util.Collections是一个工具类仅包含静态方法,它们操作或返回集合。它包含操作集合的多态算法,返回一个由指定集合支持的新集合和其它一些内容。这个类包含集合框架算法的方法,比如折半搜索、排序、混编和逆序等。


33.Comparable和Comparator接口是什么?


如果我们想使用Array或Collection的排序方法时,需要在自定义类里实现Java提供Comparable接口。Comparable接口有compareTo(T OBJ)方法,它被排序方法所使用。我们应该重写这个方法,如果“this”对象比传递的对象参数更小、相等或更大时,它返回一个负整数、0或正整数。但是,在大多数实际情况下,我们想根据不同参数进行排序。比如,作为一个CEO,我想对雇员基于薪资进行排序,一个HR想基于年龄对他们进行排序。这就是我们需要使用Comparator接口的情景,因为Comparable.compareTo(Object o)方法实现只能基于一个字段进行排序,我们不能根据对象排序的需要选择字段。Comparator接口的compare(Object o1, Object o2)方法的实现需要传递两个对象参数,若第一个参数比第二个小,返回负整数;若第一个等于第二个,返回0;若第一个比第二个大,返回正整数。


34.Comparable和Comparator接口有何区别?


Comparable和Comparator接口被用来对对象集合或者数组进行排序。Comparable接口被用来提供对象的自然排序,我们可以使用它来提供基于单个逻辑的排序。


Comparator接口被用来提供不同的排序算法,我们可以选择需要使用的Comparator来对给定的对象集合进行排序。


35.我们如何对一组对象进行排序?


如果我们需要对一个对象数组进行排序,我们可以使用Arrays.sort()方法。如果我们需要排序一个对象列表,我们可以使用Collection.sort()方法。两个类都有用于自然排序(使用Comparable)或基于标准的排序(使用Comparator)的重载方法sort()。Collections内部使用数组排序方法,所有它们两者都有相同的性能,只是Collections需要花时间将列表转换为数组。


36.当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?


在作为参数传递之前,我们可以使用Collections.unmodifiableCollection(Collection c)方法创建一个只读集合,这将确保改变集合的任何操作都会抛出UnsupportedOperationException。


37.我们如何从给定集合那里创建一个synchronized的集合?


我们可以使用Collections.synchronizedCollection(Collection c)根据指定集合来获取一个synchronized(线程安全的)集合。


38.集合框架里实现的通用算法有哪些?


Java集合框架提供常用的算法实现,比如排序和搜索。Collections类包含这些方法实现。大部分算法是操作List的,但一部分对所有类型的集合都是可用的。部分算法有排序、搜索、混编、最大最小值。


39.大写的O是什么?举几个例子?


大写的O描述的是,就数据结构中的一系列元素而言,一个算法的性能。Collection类就是实际的数据结构,我们通常基于时间、内存和性能,使用大写的O来选择集合实现。比如:例子1:ArrayList的get(index i)是一个常量时间操作,它不依赖list中元素的数量。所以它的性能是O(1)。例子2:一个对于数组或列表的线性搜索的性能是O(n),因为我们需要遍历所有的元素来查找需要的元素。


40.与Java集合框架相关的有哪些最好的实践?


(1)根据需要选择正确的集合类型。比如,如果指定了大小,我们会选用Array而非ArrayList。如果我们想根据插入顺序遍历一个Map,我们需要使用TreeMap。如果我们不想重复,我们应该使用Set。


(2)一些集合类允许指定初始容量,所以如果我们能够估计到存储元素的数量,我们可以使用它,就避免了重新哈希或大小调整。


(3)基于接口编程,而非基于实现编程,它允许我们后来轻易地改变实现。


(4)总是使用类型安全的泛型,避免在运行时出现ClassCastException。


(5)使用JDK提供的不可变类作为Map的key,可以避免自己实现hashCode()和equals()。


(6)尽可能使用Collections工具类,或者获取只读、同步或空的集合,而非编写自己的实现。它将会提供代码重用性,它有着更好的稳定性和可维护性。


在线咨询
在线报名
客服QQ
视频下载
回到顶部