一.集合框架
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的注解有哪些?他们的原理是什么?
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 面向切面编程)
三、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的内存模型?哪些是线程私有的?哪些是公共的?



