IT 面试题
1.JDK1.X新增的功能 ==>>>
2.字符流和字节流的区别,使用场景,相关类 ==>>>
字节流与字符流
在Java.io包中操作文件内容的主要有两大类:字节流、字符流,两类都分为输入和输出操作。在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)。1个字符=2个字节。
程序中所有的输入输出都是字节的形式,字符的出现是为了满足文本中出现的汉字,或者编译器unicode编码以后的数据。
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
3.线程安全的概念,实现线程安全的几种方法 ==>>>
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
Synchronized 关键字 修饰方法,代码块
4.抽象类和接口的区别,使用场景 ==>>>
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
5.hash算法的实现原理,hashcode的实现原理 ==>>>
hash算法的出现是为了: 列如java中set 中的元素是不能重复的,所以如果set中有很多元素时候,新加入的元素为了确保不重复难道需要跟之前的所有元素比较吗? 这就是hash算法出现的原因。当比较的时候,能够快速通过hashCode锁定内存中的一块区域,在这个区域内做比较。这样就减少了比较的次数。
确实提高了效率。但一个面临问题:若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:
1 如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。
2 如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。
6.error和exception的区别,RuntimeException和非RuntimeException的区别 ==>>>
Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等,对于这种错误,程序基本无能为力,除了退出运行外别无选择。 Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
RuntimeException 也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机 接管。比如:我们从来没有人去处理过 NullPointerException 异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由 Thread.run() 抛出 ,如果是单线程就被 main() 抛出 。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是
Exception 的子类,也有一般异常的特点,是可以被 Catch
块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
checked Exception,非RuntimeException 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。 对于这种异常, JAVA 编译器强制要求我们必需对出现的这些异常进行
catch 。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆 catch 块去处理可能的异常。
可以通过编译器是否需要try catch 来判断是运行时还是非运行时异常。运行时异常可以不处理,非运行时异常都需要处理。
7.继承与组合的区别,使用场景 ==>>>
继承: 复用 但是一旦出现错误 BUG 影响的地方也多
组合: 一个类引用另一个类的实例, 单纯的使用另外一个类。
8.使用静态工厂方法的好处和坏处 ==>>>
静态工厂方法最主要的特点是:每次被调用的时候,不一定要创建一个新的对象。利用这一特点,静态工厂方法可用来创建以下类的实例。
单例类:只有惟一的实例的类。
枚举类:实例的数量有限的类。
具有实例缓存的类:能把已经创建的实例暂且存放在缓存中的类。
具有实例缓存的不可变类:不可变类的实例一旦创建,其属性值就不会被改变。
9.排序算法,他们是时间复杂度是多少 ==>>>
1.插入排序—直接插入排序(Straight Insertion Sort)
基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
3. 选择排序—简单选择排序(Simple Selection Sort)
基本思想:
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
5. 交换排序—冒泡排序(Bubble Sort)
基本思想:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
6. 交换排序—快速排序(Quick Sort)
基本思想:
1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
7. 桶排序(Bucket Sort)
基本思想:
1)前提条件 所有数字 属于一个范围
2)比如考试分数,1-100.虚拟有100个桶。将需要排序的数字按顺序一个个放在100个桶的位置。比如数字6,就放在第六个桶里
3)一次放入,最后将桶个数为0的跳过,得到排序
4)桶排序最快,但是最消耗内存。
10.数据库设计原则、范式 ==>>>
第一范式(1NF): 原子性,数据不可再分
原则就是使得表列为原子性,每一个字段内容不能再分解。
第二范式(2NF):唯一性,消除部分依赖
第二范式要求满足如下两个要求,
每一行数据具有唯一性
这一点,只要是有主键就可以实现。因为主键的存在使得每一行数据都具有唯一性。
第三范式(3NF):独立性,消除传递依赖
也就是说,有些字段的值能够使用现有的表列来计算得出,这样的字段就属于冗余字段,会产生传递依赖现象。
11.数据库常用的编码方式有哪几种
GBK,UTF-8
12.如果有10万条学生成绩信息,怎么获取成绩最高的那一条数据,怎么获取成绩第三的那一条数据,列举你认为性能最好的方式 ==>>>
select top N from XX order by XX
13.序列化的作用,应用场景,除了网路传输 ==>>>
一.Java序列化的作用
有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象。例如,有的时候我们想要
把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。对于这种通用
的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java的序列化的概念。在Java的OutputStream类下面的子类ObjectOutput-
Stream类就有对应的WriteObject(Object object) 其中要求对应的object实现了java的序列化的接口。
为了更好的理解java序列化的应用,我举两个自己在开发项目中遇到的例子:
1)在使用tomcat开发JavaEE相关项目的时候,我们关闭tomcat后,相应的session中的对象就存储在了硬盘上,如果我们想要在tomcat重启的
时候能够从tomcat上面读取对应session中的内容,那么保存在session中的内容就必须实现相关的序列化操作。
2)如果我们使用的java对象要在分布式中使用或者在rmi远程调用的网络中使用的话,那么相关的对象必须实现java序列化接口。
14.spring的IOC、AOP的使用场景 ==>>>
IOC 依赖注入 原来程序中一个对象依赖对象会随着该对象的注入,依赖的对象也会随之创建。 主要应用在引用某个model,service的时候。
AOP 面向切面编程 通常用于对日志,事务一层的统一处理上。
Spring除了具有IOC,AOP外,还具有轻量级的特点,其本身作为一个容器,也能支持把各种组件组装成一个应用。
SpringMvc 是一个MVC框架,集成了Spring,和Struts(MVC框架,servlet和JSP应用)的功能。
15.ajax是否能跨域请求,解决的办法 ==>>>
不能跨域。
1.代理服务器,类似nginx。或者通过域A来发送到服务端,服务端通过 HttpClient 请求域B的数据在解析返回给域A。
2.ajax本身是不可以跨域的,
通过产生一个script标签来实现跨域。因为script标签的src属性是没有跨域的限制的
16.解析xml的几种方法,他们的原理 ==>>>
DOM、SAX、JDOM、DOM4j
17.怎么样实现高性能的代码 ==>>>
(1)、先把焦点放在设计、数据结构和算法身上; (2)、不要依赖于编译器编译期优化技术,正确理解运行期代码优化技术以及正确使用运行期代码优化; (3)、使用StringBuffer类完成字符串连接; (4)、将对象创建成本降至最低,即尽量创建轻量级对象;
18.如果有和其他系统有接口调用,但其他系统还没开发完成,怎么进行单元测试 ==>>>
采用Mock测试,Mock对象也就是真实对象在调试期的替代品。什么时候需要Mock对象:
1.真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)
2.真实对象很难被创建(比如具体的web容器)
3.真实对象的某些行为很难触发(比如网络错误)
4.真实情况令程序的运行速度很慢
5.真实对象有用户界面
6.测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
7.真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)
http://blog.csdn.net/chjttony/article/details/14522771
19.防止重复提交有哪几种方式 (这个网上很多,可以google下)
1.按钮禁用
2.页面生成一个随机的令牌,如数字A,A存放在页面和服务端的session中,提交的时候比较,相同,讲session中的令牌删除。
3.数据库插入前判断数据是否存在。
20.怎么样运用样式设计一个DIV浮出层 。
21.数据库连接池的实现原理,请求怎么样去获取连接,,关闭连接时,连接池是销毁连接还是回收连接 ==>>>
数据库连接池的原理就是预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量?使用情况,为系统开发?测试及性能调整提供依据。
每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxconn)如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout 则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。
一般来说关闭连接时,应该回收连接,作为空闲池中的一员以备别的请求使用。
22.tomcat、weblogic、jboss的区别,容器的作用 ==>>>、
容器是用来提供一种服务的应用,tomcat是一个servlet容器。当页面访问一个tomcat指定的端口时,tomcat解析容器的servlet,处理完将servlet处理的结果返回给页面。
23.apache是容器么,它的作用是什么 ==>>>
apache是容器,支持静态的。tomcat支持动态的如servlet,jsp,php。
24.内部跳转和外部跳转的区别,底层实现原理 ==>>>
总结归纳要点:
1、内部跳转的时候实际上是通过服务器端将请求转发到另外的页面或者servlet中,这个时候跳转到的目标页面或者servlet可以获取到请求对象,
也可以获取到请求中的属性和参数。而外部跳转的时候实际上是第一次请求后,服务器端向客户端发送了一个指令,让客户端再次请求了一次服务器端,这个时候服
务器第二次拿到的request对象已经不是第一次请求的request对象了,所以无法获取到第一次请求里的参数和属性。
2、内部跳转的url地址栏不会发生变化,外部跳转url则会发生变化。
3、内部跳转无法跳转到工程以外的jsp或者servlet,外部跳转则可以。
4、内部跳转实现的方法:
- request.getRequestDispatcher("XXX.jsp或者servlet").forward(request, response),
- request.getRequestDispatcher("XXX.jsp或者servlet").forward(request, response),
而外部跳转实现的方法:
- response.sendRedirect("XXX.jsp或者servlet")。
25.http和https的区别 ==>>>
HTTPS和HTTP的区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议 http和https使用的是完全不同的连接方式用的端口也不一样:前者是80,后者是443。
http的连接很简单,是无状态的 HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全
26.宕机的原因有哪几种,怎么样分析宕机的原因,如:数据库的长连接。。。 ==>>>
27.在velocity页面,为什么不推荐不推荐使用宏定义 ==>>>
28.webx的核心原理,webx框架和velocity的优缺点 ==>>>
29.页面上如果有一个screen和两个control,那么他们有几个context ==>>>
30.一个含有layout、screen和control的页面,他们的加载顺序是什么,是等所有的加载完一起显示,还是其他。。。 ==>>>
31.#if($!a=='true')会出问题么,为什么 ==>>>
32.支付宝怎么样保证他的安全,他的调用异常分哪几种 ==>>>
33.项目中你觉得做得最好的是什么 ==>>>
34.session 和cookie区别
1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据。
2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间。 Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了。
注:为这个用户创建的Cookie的名称是aspsessionid。这个Cookie的唯一目的就是为每一个用户提供不同的身份认证。
3.cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
4.cookie 和session的区别是:cookie数据保存在客户端,session数据保存在服务器端。
简单的说,当你登录一个网站的时候,
- 如果web服务器端使用的是session,那么所有的数据都保存在服务器上,客户端每次请求服务器的时候会发送当前会话的sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登录或具有某种权限。由于数据是存储在服务器上面,所以你不能伪造,但是如果你能够获取某个登录用户的 sessionid,用特殊的浏览器伪造该用户的请求也是能够成功的。sessionid是服务器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性.
- 如果浏览器使用的是cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了cookie用户名,那么当你再次请求服务器的时候,浏览器会将用户名一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为cookie变量,所以只要不关闭浏览器,那么cookie变量一直是有效的,所以能够保证长时间不掉线。如果你能够截获某个用户的 cookie变量,然后伪造一个数据包发送过去,那么服务器还是认为你是合法的。所以,使用 cookie被攻击的可能性比较大。如果设置了的有效时间,那么它会将 cookie保存在客户端的硬盘上,下次再访问该网站的时候,浏览器先检查有没有 cookie,如果有的话,就读取该 cookie,然后发送给服务器。如果你在机器上面保存了某个论坛 cookie,有效期是一年,如果有人入侵你的机器,将你的 cookie拷走,然后放在他的浏览器的目录下面,那么他登录该网站的时候就是用你的的身份登录的。所以 cookie是可以伪造的。当然,伪造的时候需要主意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器
5.两个都可以用来存私密的东西,同样也都有有效期的说法,区别在于session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过去与否可以在cookie生成的时候设置进去。
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中