Java面试题
1、StringBulider和StringBuffer
(1)String是不可变类(字符串常量final),修改会创建新的对象;StringBulider和StringBuffer是可变类(字符串变量),任何对它所指代的字符串的改变都不会产生新的对象
(2)StringBuffer支持并发,线程安全;StringBulider不支持并发,线程不安全
(3)String适合少量字符串操作;StringBuffer适用于单线程下在字符缓冲区进行大量操作;StringBuffer适用多线程下在字符缓冲区进行大量操作
StringBulider > StringBuffer > String
2、ArrayList、Vector、 LinkedList
ArrayList和Vector都使用数组方式存储数据,数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以查询数据快而插入数据慢;Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差;而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度快而查询速度慢
3、HashMap和Hashtable
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都实现了Map接口,区别:
(1)HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable
(2)HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
(3)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解
(4)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
(5)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步
4、sleep() 和 wait()
sleep()是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁
wait()是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态
5、重载Overload和重写Override
多态性体现
(1)重载同一类中多个方法的方法名相同,参数类型和个数不相同
(2)重写子类中方法名和参数与父类中相同,覆盖
6、堆(heap)和栈(stack)
栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理;堆是栈的一个组成元素。
栈由编译器自动分配释放 ,存放函数的参数值,局部变量的值等;堆一般由程序员分配释放, 若程序员不释放
7、forward 和redirect
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,
所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
8、