一.集合框架
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的内存模型?哪些是线程私有的?哪些是公共的?