JAVA 面试宝典02
一、集合
1.Java 集合类框架的基本接口有哪些?
Java
集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java 集合类里面
最基本的接口有:
- Collection:代表一组对象,每一个对象都是它的子元素。
- Set:不包含重复元素的Collection。
- List:有顺序的collection,并且可以包含重复元素。
- Map:可以把键(key)映射到值(value)的对象,键不能重复。
2.为什么集合类没有实现Cloneable和Serializable 接口?
克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该
由集合类的具体实现来决定如何被克隆或者是序列化。
3.什么是迭代器(Iterator)?
Iterator 接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove
(Object Obj)删除,可以通过迭代器的remove()
方法删除。
4.Iterator 和 ListIterator 的区别是什么?
Iterator
可用来遍历Set 和List 集合,但是ListIterator
只能用来遍历List
。 Iterator
对集合只能是前向遍历,ListIterator
既可以前向也可以后向。 ListIterator
实现了 Iterator
接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
5.hashCode()和 equals()方法的重要性体现在什么地方?
Java
中的 HashMap
使用 hashCode()
和 equals()
方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash 值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap
的精确性和正确性是至关重要的。
6.HashMap 和 Hashtable 有什么区别?
HashMap
和Hashtable
都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
HashMap
允许键和值是null,而Hashtable不允许键或者值是null。Hashtable
是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
7.ArrayList 和 LinkedList 有什么区别?
ArrayList
和 LinkedList
都实现了 List
接口,他们有以下的不同点:
ArrayList
是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问,因此查询某个元素的时间短。与此对应,LinkedList 是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素 的时间长。- 相对于
ArrayList,LinkedList
的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
8.Comparable 和 Comparator 接口是干什么的?列出它们的区别。
java
提供了只包含一个compareTo()
方法的Comparable
接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。Java
提供了包含compare()
和 equals()
两个方法的Comparator
接口。compare()
方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()
方法需要一个对象作为参数,它用来决定输入参数是否和comparator
相等。只有当输入参数也是一个comparator
并且输入参数和当前comparator
的排序结果是相同的时候,这个方法才返回true
。
9.Enumeration 接口和 Iterator 接口的区别有哪些?
Enumeration
速度是Iterator
的2倍,同时占用更少的内存。但是,Iterator
远远比Enumeration
安全,因为其他线程不能够修改正在被iterator
遍历的集合里面的对象。同时,Iterator
允许调用者删除底层集合里面的元素,这对Enumeration
来说是不可能的。
10.HashSet 和 TreeSet 有什么区别?
Treeset
中的数据是自动排好序的,不允许放入null值HashSet
中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 。HashSe
t 要求放入的对象必须实现HashCode()
方法,放入的对象,是以hashcode
码作为标识的,而具有相同内容的String对象,hashcode
是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。
二、JAVAWEB
1.Ajax
Ajax
的原理简单来说通过XmlHttpRequest
对象来向服务器发异步请求,从服务器获得数据,然后用javascript
来操作 DOM 而更新页面。这其中最关键的一步就是从服务器获得请求数据。XMLHttpRequest
是 ajax
的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,也就是javascript
可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。
优点:
Ajax 的给我们带来的好处大家基本上都深有体会:
- 最大的一点是页面无刷新,在页面内与服务器通信,给用户的体验非常好。
- 使用异步方式与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
- 可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,减轻服务器和带宽的负担,节约空间和宽带租用成本。并且减轻服务器的负担,
ajax
的原则是“按需取数据”,可以最大程度的减少冗余请求,和响应对服务器造成的负担。
缺点:
下面所阐述的ajax的缺陷都是它先天所产生的。ajax
干掉了 back
按钮,即对浏览器后退机制的破坏。后退按钮是一个标准的web
站点的重要功能,但是它没法和js进行很好的合作。这是ajax
所带来的一个比较严重的问题.
2、安全问题
技术同时也对IT 企业带来了新的安全威胁,ajax
技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。ajax
的逻辑可以对客户端的安全扫描技术隐藏起来,允许黑客从远端服务器上建立新的攻击。还有 ajax
也难以避免一些已知的安全弱点,诸如跨站点脚步攻击、SQL
注入攻击和基于credentials
的安全漏洞等。
2.Servlet
主要分四大选择器,分别是基本选择器、层次选择器、过滤选择器、属性过滤选择器。 常用的选择器分为以下几种。
- 基本选择器: Id 选择器、class选择器、element选择器、*选择器、并列选择器。
- 层级选择器: parent > child(直系子元素)、 prev + next(下一个兄弟元素,等同于next()方法)、 prev ~ siblings(prev 元素的所有兄弟元素,等同于nextAll()方法)
- 过滤选择器: first 和:last(取第一个元素或最后一个元素)、even 和:odd(取偶数索引或奇数索引元素,索引从0开始,even表示偶数,odd表示奇数)、t(取非元素) 、eq(x) (取指定索引的元素) 、gt(x)和:lt(x)(取大于 x 索引或小于x索引的元素)、header(取H1~H6标题元素)
3.Cookie&Session
会话(Session)跟踪是Web
程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie
与Session
。Cookie
通过在客户端记录信息确定用户身份,Session
通过在服务器端记录信息确定用户身份。
4.什么是Cookie
Cookie
实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response
向客户端浏览器颁发一个Cookie
。客户端浏览器会把Cookie
保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同Cookie
一同提交给服务器。服务器检查该Cookie
,以此来辨认用户状态。服务器还可以根据需要修改Cookie
的内容。
5.Cookie 机制
在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。 而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户 A 购买了一件商品放入购物车内,当再次购买商品时
服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。Cookie
就是这样的一种机制。它可以弥补HTTP
协议无状态的不足。在Session
出现之前,基本上所有的网站都采用Cookie
来跟踪会话。
6.什么是Session
Session
是另一种记录客户状态的机制,不同的是Cookie
保存在客户端浏览器中,而Session
保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session
。客户端浏览器再次访问时只需要从该 Session
中查找该客户的状态就可以了。
如果说Cookie
机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session
机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session
相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
7.Session 机制
除了使用Cookie
,Web
应用程序中还经常使用Session来记录客户端状态。Session
是服务器端使用的一种记录客户端状态的机制,使用上比Cookie
简单一些,相应的也增加了服务器的存储压力。
8.如何利用cookie实现自动登录?
当用户在某个网站注册后,就会收到一个惟一用户ID的cookie
。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源.
9.保存session id 有几种方法?
A.保存session id
的方式可以采用cookie
,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
B.由于cookie
可以被人为的禁止,必须有其它的机制以便在cookie
被禁止时仍然能够把session id
传递回服务器,经常采用的一种技术叫做URL
重写,就是把session id
附加在URL路径的后面,附加的方式也有两种,一种是作为 URL 路径的附加信息,另一种是作为查询字符串附加在 URL 后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id
。
C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id
传递回服务器。
10.session 什么时候被创建?
一个常见的错误是以为session
在有客户端访问时就被创建,然而事实是直到某server
端程序(如Servlet)调用 HttpServletRequest.getSession(true)
这样的语句时才会被创建。
11.session 何时被删除?
A. 程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止
注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端
的session 对象失效.
12.cookie 机制和 session 机制的区别?
具体来说cookie
机制采用的是在客户端保持状态的方案,而session
机制采用的是在服务器端保持状态的方案。同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session
机制可能需要借助于cookie
机制来达到保存标识的目的,但实际上还有其他选择。