三年JAVA遇到的面试题目

本文只作为笔记记录在面试过程中遇到的一些题目。
万变不离其宗面试除了问你工作中用的,解决的。大部分还是一些基础的概念,比如说:
1.框架ssm
2.集合相关的map,list相关的
3.多线程相关的工作中怎么用的
4.java锁
5.缓存
6.异步消息队列
7.微服务(重点基本面试都要求会这个)
8.数据库相关的优化

一:HashMap和Hashtable的区别?和ConcurrentHashMap?

  1. HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口。
  2. 主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效率要高于Hashtable,Hashtable线程安全也是实现自sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
  3. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

ConcurrentHashMap

  1. 底层采用分段的数组+链表实现,线程安全
  2. 通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是volatile的,也能保证读取到最新的值。)
  3. Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术
  4. 有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁
  5. 扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容),插入前检测需不需要扩容,有效避免无效扩容。

为什么使用ConcurrentHashMap?
主要就是为了应对HashMap在并发环境下不安全而诞生的,ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS等lock-free技术来减少锁竞争对于性能的影响。ConcurrentHashMap避免了对全局加锁改成了局部加锁操作,这样就极大地提高了并发环境下的操作速度。

二:ArrayList和Vector的区别?
这两个类都实现了List接口(Collection是集合类的上级接口,List和set接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组。
同步性:Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
数据增长:Vector增长原来的一倍,ArrayList增加原来的0.5倍。

三:List 和 Map 区别?Set呢?
List是存储单列数据的集合。
Map是存储键和值这样的双列数据的集合。
List中存储的数据是有顺序,并且允许重复。
Map中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的。
Set和List一样,也继承于Collection,是集合的一种。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。

四:ArrayList,Vector, LinkedList的存储性能和特性?
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差。
LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。

缓存memcached和redis的区别?
如果简单的来比较两者的区别基本可以用一下几点来概述

  1. redis不仅仅支持k/v类型的数据,还支持hash list set sortedset类型数据结构的存储
  2. redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
  3. 它们在性能方面差别不是很大,读取方面尤其是针对批量读取性能方面memcached占据优势。当然redis也有他的优点,如持久性、支持更多的数据结构
  4. 分布式–设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从
  5. 存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)

memcached:
第一次显示的时候:判断memcached缓存中是否有该分类如果不存在执行SQL查询,然后放进memcached中,然后显示到界面
第二次显示的时候:判断memcached缓存中是否有该分类如果存在直接读取memcached缓存,然后显示到界面
若遇到更新的数据,找到memcached中与之对应的key值删除它,重新插入memcached缓存中。

readis:
redis要达到高并发,高可用,一个redis是不可行的,必须给redis建立集群,以一个master和多个slave的模式工作,主要是master写,多个salve读,即是读写分类的情况,以读多写少的标准,如果写多的话就以异步的形式展现服务。

基本数据类型有哪些?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类。

九大内置对象是哪些?

  1. request:用户端请求,此请求会包含来自GET/POST请求的参数(表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie,
    header, 和session数据的有用的方法。)
  2. response:网页传回用户端的回应(表示HttpServletResponse对象,并提供了几个用于设置送回
    浏览器的响应的方法(如cookies,头信息等))
  3. page:JSP网页本身(表示从该页面产生的一个servlet实例)
  4. pageContext:网页的属性是在这里管理(表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。)
  5. session:与请求有关的会话期(表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息)
  6. application:servlet正在执行的内容(表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息)
  7. out:用来传送回应的输出(是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。)
  8. config:servlet的构架部件(表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数。)
  9. exception:针对错误网页,未捕捉的例外

Servlet生命周期和执行流程?
Servlet的生命周期可以分为四个阶段:装载类及创建实例阶段,初始化阶段,服务阶段,实例销毁阶段
1、初始化阶段调用init()方法。
2、响应客户请求阶段。调用service()方法,由service()方法根据提交的方式选择执行doGet()或者doPost()方法。
3、终止阶段调用destroy()方法。
执行流程:浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名
①:第一步,浏览器输入访问路径后,携带了请求行,头,体
②:第二步,根据访问路径找到已注册的servlet名称,既图中的demo
③:第三步,根据映射找到对应的servlet名
③:第四步,根据根据servlet名找到我们全限定类名,既我们自己写的类

JVM简述java垃圾回收机制?
在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

JVM简述java类加载机制?
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值