java面试题汇总

1、session和cookie的区别

答:1)存储端:session是存储服务器端,而cookie是存储在客户端。
2)安全性:session的安全性比cookie高。
3)存储选择: 获取session里的信息是通过存放在会话cookie里的session id获取的,而session是存放在服务器的内存中里,session里的数据不断增加会造成服务器的负担,可以把很重要的信息存储在session中,而把一些次要东西存储在客户端的cookie里。
4)生命周期:cookie可分为会话cookie和持久化cookie。会话cookie是存放在客户端浏览器的内存中,当浏览器关闭会话cookie也就消失了,而持久化cookie是存放在客户端硬盘中,持久化cookie的生命周期是我们在设置cookie时候设置的那个保存时间,session的信息是通过sessionid获取的,而sessionid是存放在会话cookie当中的,当浏览器关闭的时候会话cookie消失,所以sessionid也就消失了,但是session的信息还存在服务器端,因此一般设置session的时间,时间一到,session就回自动关闭。
拓展:关闭session方法
session在服务器关闭的时候,或者是sessio过期,又或者调用了invalidate(),再或者是session中的某一条数据消失调用session.removeAttribute()方法,session在通过调用session.getsession来创建的。

2、Servlet生命周期以及运行原理

答:Servlet生命周期:加载和实例化Servlet、初始化、请求处理、卸载Servlet。
1. init()方法
在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();
2. service()方法
它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
3. destroy()方法
仅执行一次,一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

3、list、set、map区别

答:1. List和Set都是继承自Collection接口,Map则不是。
2. List有插入顺序,并且是可以重复的,而Set不允许重复,无插入顺序,如果元素相同会被后一个覆盖。其中,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变;而Set检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
3. Map适合储存键值对的数据。

4、HashMap和HashTable的区别

答:1. HashMap是非线程安全的且非同步的,HashTable是线程安全的且同步的。
2. HashMap效率上比HashTable要高。
3. HashMap允许空键值,而HashTable不允许。
4. HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。
拓展:线程安全集合类与非线程安全集合类
LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。

5、同步和异步的区别以及适用场景

答:同步就是等待用户全部操作完数据,进行数据全部加载,并且把所有的数据返回给用户;而异步就大大降低了加载所需的时间,它不需要等用户全部操作完成提交,将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动。
AJAX中根据async的值不同分为同步(async = false)和异步(async = true)两种执行方式。Jquery中的ajax在默认不写async情况下,请求为异步请求;即:async:true。
对于实际应用中,例如B/S模式中的ajax请求,具体过程是:客户端发出ajax请求->服务端处理->处理完毕执行客户端回调,在客户端(浏览器)发出请求后,仍然可以做其他的事,这样就会减少页面刷新,降低等待加载时间。而同步一般用于银行的转账功能等需要等待用户全部操作完成才进行提交的相关业务。

6、js中Number()、parseInt()和parseFloat()的区别

答:Number():如果是Boolean值,true和false值将分别被转换为1和0;如果是数字值,只是简单的传入和返回;如果是null值,返回0;如果是undefined,返回NaN;如果是字符串:
a. 如果字符串中只包含数字时,将其转换为十进制数值,忽略前导0
b. 如果字符串中包含有效浮点格式,如“1.1”,将其转换为对应的浮点数字,忽略前导0
c. 如果字符串中包含有效的十六进制格式,如“0xf”,将其转换为相同大小的十进制数值
d. 如果字符串为空,将其转换为0
e. 如果字符串中包含除上述格式之外的字符,则将其转换为NaN
如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再依照前面的规则转换返回的字符串值。
eg:

var num1 = Number("Hello world");       //NaN
var num2 = Number("");           //0
var num3 = Number("0000011");        //11

parseInt():处理整数的时候parseInt()更常用。parseInt()函数在转换字符串时,会忽略字符串前面的空格,知道找到第一个非空格字符。如果第一个字符不是数字或者负号,parseInt() 就会返回NaN,同样的,用parseInt() 转换空字符串也会返回NaN。如果第一个字符是数字字符,parseInt() 会继续解析第二个字符,直到解析完所有后续字符串或者遇到了一个非数字字符。
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,所以要解析十六进制的值,当然,对二进制、八进制,甚至十进制(默认模式),都可以这样调用parseInt()方法。
eg:

var num1 = parseInt("AF",16);           //175
var num2 = parseInt("AF");            //NaN
var num3 = parseInt("10",2);           //2(按照二进制解析)
var num4 = parseInt("sdasdad");         //NaN

parseFloat():与parseInt() 函数类似,parseFloat() 也是从第一个字符(位置0)开始解析每一个字符。也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中第一个小数点是有效的,而第二个小数点就是无效的了,它后面的字符串将被忽略。
parseFloat() 只解析十进制,因此它没有第二个参数指定基数的用法。
如果字符串中包含的是一个可解析为正数的数(没有小数点,或者小数点后都是零),parseFloat() 会返回整数。
eg:

var num1 = parseFloat("123AF");           //123
var num2 = parseFloat("0xA");           //0
var num3 = parseFloat("22.5");            //22.5
var num4 = parseFloat("22.3.56");         //22.3
var num5 = parseFloat("0908.5");          //908.5

**备注:**parseInt() 和parseFloat() 的区别在于:
parseFloat() 所解析的字符串中第一个小数点是有效的,而parseInt() 遇到小数点会停止解析,因为小数点并不是有效的数字字符。
parseFloat() 始终会忽略前导的零,十六进制格式的字符串始终会被转换成0,而parseInt() 第二个参数可以设置基数,按照这个基数的进制来转换。
intValue()是把Integer对象类型变成int的基础数据类型;parseInt()是把String 变成int的基础数据类型;Valueof()是把给定的String参数转化成Integer对象类型。

7、setInterval和setTimeout区别:

答:setTimeout和 setInterval的语法相同。它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码。
不过这两个函数还是有区别的, setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代 码,而setTimeout只执行一次那段代码。虽然表面上看来setTimeout只能应用在on-off方式的动作上,不过可以通 过创建一个函数循环重复调用setTimeout,以实现重复的操作。
备注:
clearInterval() 方法可取消由 setInterval() 设置的 timeout。
clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。

猜你喜欢

转载自blog.csdn.net/lxw983520/article/details/80014602