面试题总结

一.集合框架

1.介绍一下JAVA的集合框架 
集合框架分为三类:list列表,set集合、map映射 list

2.HashMap遇到哈希冲突会如何怎么办?HashMap是线程安全的吗?HashMa在高并发下会发生什么问题?然后引入ConcurrentHashMap的原理?

3.Hashtable和concurrentHashMap的区别
区别是hashtable是当新增和删除时把整个map都加了锁,读取和其余新增和修改也会受影响。而concurrentHashMap是采用了分段式群默认16个分段,当新增和删除时,根据key的hash值找到table[i]的位置,个当前段技能加锁,其余数据不加锁,所以可以支持高并发查询和其余修改不受影响。
4.数组和ArrayList的区别?ArrayList是如何扩容的
Array可以存储数据类型和对象,ArrayList只能存储对象。
数组可以指定大小,arraylist是自动扩转展的。
Array内置方法没有ArrayList多,比如addAll、removeAll、iterantion等方法ArrayList有
Arraylist每次扩容50%。
5.线程池中的阻塞队列一般会选择那种队列?为什么?

6.RetreenLock的原理?AQS的原理?
 ReentrantLock使用内部类Sync来实现加解锁,Sync是AbstractQueuedSynchronizer(下面简称AQS)的子类。 
 AQS,人如其名抽象队列同步器。
7.HashMap的容量为什么推荐是2的幂次方?

二·框架类

1.mabatis的二级缓存有什么问题?
mybatis二级缓存对于细粒度的数据级别的缓存实现不好。
2,mabatis中的mapper的#{}和${}有什么区别?哪一种可以防止sql注入?
#{}:代表占位符用来传递参数,${}用来拼接sql语句,譬如:把数据库中的表名作为参数拼接在 sql 语句中,必须使用 $,#{}可以防止sql注入
3.我们知道mabatis的mapper和接口之间是没有对象的,那他是如何映射的?

4.说一说springMVC的注解有哪些?他们的原理是什么?

1、@Controller

@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。
2、@RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明(下面有相应示例)。

1、 value, method;

value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method:  指定请求的method类型, GET、POST、PUT、DELETE等;

2、consumes,produces
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers

params: 指定request中必须包含某些参数值是,才让该方法处理。

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

 
3、@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

 
4、@ModelAttribute和 @SessionAttributes

 

代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

 

 @SessionAttributes即将值放到session作用域中,写在class上面。

 

具体示例参见下面:使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据

 
5、@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数
6、@requestParam

@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
7、@ResponseBody

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;
8、@Component

相当于通用的注解,当不知道一些类归到哪个层时使用,但是不建议。
9、@Repository

用于注解dao层,在daoImpl类上面注解。



5.sprinMVC的控制器是单例吗?是线程安全的吗?

方法一、使用ThreadLocal,ThreadLocal会为每一个线程提供一个独立的变量副本,这样在多线程对数据访问就不会出现冲突。因为每一个线程都拥有自己的变量副本,因此也就不需要同步该变量。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
方法二、如果时web应用,可以使用Spring Bean的作用域中的request,在controller类前面加上@Scope("****"),表明每次请求都会生成一个新的Bean对象。这样也能起到线程安全的作用。
方法三、使用线程同步,关键字synchronized

当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要block ,多线程并发量大的时候会对性能有一定的影响。

6.是struts1和struts2的区别?

7.spring如何解析它的xml文件?

8.spring的核心是什么?Aop的原理是什么?

Spring的核心是IOC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)

request和response的常用方法
一、request
1.setAttribute()在Request域中存储数据
2.setCharacterEncoding()设置请求参数的编码方式,只对post请求有效
3.getMethod()获取请求类型
4.getParameter()获取指定请求参数值
5.getParameterNames()获取所有请求参数,返回一个Enumeration枚举类
6.getAttribute()获取域中存储的数据
7.getAttributeNames()获取域中所有数据,返回一个Enumeration枚举类
8.getContextPath()返回当前WEB项目相对路径
9.getCookies()获取所有Cookie,返回一个Cookie数组
10.getRequestDispatcher()获取转发器,参数路径以/打头,代表WebRoot(当前WEB项目根目录)
11.getSession()获取Session对象

 二、response
1.setContentType()告知浏览器数据类型
2.setCharacterEncoding设置Response的编码方式
3.setHeader()设置消息头
4.setStatus()设置状态
5.addCookie()添加Cookie
6.sendRedirect()重定向
7.getOutputStream()获取通向浏览器的字节流(同一次请求处理中,字节流和字符流不能同时存在)
8.getWriter()获取通向浏览器的字符流(同一次请求处理中,字节流和字符流不能同时存在)

三、redis相关:

1:redis数据类型有哪些?

2:zset数据类型是如何排序的?

3:redis如何做项目的中间缓存层?

4:redis的Hash的时间复杂度是多少?

数据库:

1:数据库索引分为哪几种?组合索引有什么要注意的问题?

2:什么是悲观锁 什么是乐观锁?如何实现悲观锁?

3: 数据库关键字的执行顺序是什么?

1、FROM 2、ON 3、JOIN 4、WHERE 5、GROUP BY 6、WITH 7、HAVING 8、SELECT 9、DISTINCT 10、ORDER BY

4:如何进行sql优化?
数据类型

数据类型的选择原则:更简单或者占用空间更小。

如果长度能够满足,整型尽量使用tinyint、smallint、medium_int而非int。
如果字符串长度确定,采用char类型。
如果varchar能够满足,不采用text类型。
精度要求较高的使用decimal类型,也可以使用BIGINT,比如精确两位小数就乘以100后保存。
尽量采用timestamp而非datetime。

MySQL中字段为NULL时依然占用空间,会使索引、索引统计更加复杂。从NULL值更新到非NULL无法做到原地更新,容易发生索引分裂影响性能。尽可能将NULL值用有意义的值代替,也能避免SQL语句里面包含is not null的判断

连接的表越多,性能越差
可能的话,将连接拆分成若干个过程逐一执行
优先执行可显著减少数据量的连接,既降低了复杂度,也能够容易按照预期执行
如果不可避免多表连接,很可能是设计缺陷
外链接效果差,因为必须对左右表进行表扫描
尽量使用inner join查询

5:有没有进行过分库分表操作?分库之后如何保持事务一致?

通过在主库中创建一个流水表,把操作数据库的逻辑映射为一条流水记录。当整个大事务执行完毕后(流水被插入到流水表),然后通过其他方式来执行这段流水,保证最终一致性。

分布式和微服务:

1:微服务要克服那些问题?微服务系统是怎样通信的?

2:分布式环境下如何解决session不一致的问题?

session同步法:多台web-server相互同步数据

客户端存储法:一个用户只存储自己的数据

反向代理hash一致性:四层hash和七层hash都可以做,保证一个用户的请求落在一台web-server上

后端统一存储:web-server重启和扩容,session也不会丢失


3:分布式下如何保证id一致?

4:你在dubbo的使用过程中遇到什么问题?

5: zookeeper的负载均衡算法有哪些?

jdk源码相关

1:synchronized的原理?它该怎么用?如何一个方法是synchronized的,其他的非synchronzied线程能进入吗?

2:cvs中的ABA问题如何解决?

3:volatile的原理是什么?volatile一定是线程安全的吗?

4:ThreadLocal是什么?它的原理是什么?

5:CountDowanLatch有没有用过?适合在什么样的场景下用?

设计模式相关:

1:实现两种单例模式

2:讲一下观察者模式

3:spring中都用到哪些设计模式?

4:动态代理模式是如何实现的?

5:你在项目中用到哪些设计模式了?讲解一下业务场景

算法相关:

1:快速排序的时间复杂度?手写快速排序(注意递归式和非递归式的实现方式)

2:手写二分查找

3:手写堆排序

4:一个int数组如何进行奇数和偶数分离?

5:用算法实现String转double

jvm相关:

1: jvm的垃圾回收算法有哪些?分别解释一下?

2: 新生代为什么要设置两个survior区?

3:如何通过一个.class文件获取它的jdk版本?
jdk版本区分

只看第一行的数据:

(1)前面8个字节CA FE BA BE是固定的。

(2)随后4个字节00 00是次版本号

(3)再后面的4个字节00 32是JDK的版本号(JDK1.6)。
34(对应十进制的50):JDK1.8
 33(对应十进制的50):JDK1.7
32(对应十进制的50):JDK1.6

在这里插入图片描述

4:jvm的内存模型?哪些是线程私有的?哪些是公共的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值