JAVA后端面试汇总(附上答案)
说一下 HashSet 的实现原理?
- HashSet实现Set接口,底层是一张哈希表。它不保证set 的迭代顺序;
- 它是基于HashMap实现封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而value使用一个static final的Object对象标识。
- HashSet的其他操作都是基于HashMap的。
ArrayList 和 LinkedList 的区别是什么?
- ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。
- 对于随机访问,ArrayList优于LinkedList
- 对于插入和删除操作,LinkedList优于ArrayList
- LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
如何实现数组和 List 之间的转换?
- List转数组:toArray(arraylist.size())
- 方法数组转List:Arrays的asList(a)方法
ArrayList 和 Vector 的区别是什么?
- 线程安全性,Vector的方法都是同步且线程安全的,而ArrayList的方法不是。
- 访问性能性,由于线程的同步必然要影响性能,ArrayList的访问性能要比Vector好,访问速度快。
- 存储容量性,当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
Array 和 ArrayList 有何区别?
- 存储类型方面,Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
- 大小方面,Array大小是固定的,ArrayList的大小是动态变化的。
- 方法方面,ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
在 Queue 中 poll()和 remove(),offer()和add(),element()和peek()有什么区别?
- offer,add区别:都是向队列中添加元素,但一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
- poll,remove区别:remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
-
element,peek区别:element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null
什么是Iterator?
- terator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包括了可以返回迭代器实例的迭代方法。迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除
- Collection接口实现了Iterable接口,每个集合都通过实现Iterable接口中的iterator()方法返回Iterator接口的实例,然后对集合的元素进行迭代操作
守护线程是什么?
- 守护线程,是个服务线程,准确地来说就是服务其他的线程,这是它的作用——而其他的线程只有一种,那就是用户线程。所以java里线程分2种,守护线程,比如垃圾回收线程,就是最典型的守护线程。用户线程,就是应用程序里的自定义线程。
创建线程池有哪几种方式?
- newSingleThreadExecutor: 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
- newFixedThreadPool: 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
- newCachedThreadPool: 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
- newScheduledThreadPool: 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
线程池中 submit()和 execute()方法有什么区别?
- 线程池中的submit()和 execute()方法都是开启线程执行池中的任务,区别在于接收的参数不一样,submit有返回值,而execute没有,submit方便Exception处理
.ThreadLocal 是什么?有哪些使用场景?
- ThreadLocal是用来解决多线程程序的并发问题的,它并不是一个Thread,而是Thread的局部变量。
- ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
- 对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。
jsp 和 servlet 有什么区别?
- jsp经编译后就变成了Servlet.
- jsp更擅长表现于页面显示,servlet更擅长于逻辑控制
- Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
jsp的内置对象有哪些?
- request,response,out,session,application,pageContext,config,cookie,exception
说一下 jsp 的 4 种作用域?
- page,当前页面,request,当前请求,session,整个会话期间,application,整个应用程序。
session 和 cookie 有什么区别?
- cookie以文本格式存储在浏览器上,存储量有限;而会话存储在服务端,可以无限量存储多个变量并且比cookie更安全
- cookie的存储限制了数据量,只允许4KB,而session是无限量的
- 设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
禁用cookie,session还能用?
- 不能用了,因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。
什么是跨域,如何实现跨域?
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
JSONP,apache设置反向***(设置url映射解决跨域)