目录
1、Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
6、spring层面做事务和数据库层面做的区别,各种的实现方式
9、项目中的加密算法对比(DES,AES,RSA,MD5,SHA1,Base64)
10、Spring框架IOC和AOP的实现原理,AOP在Spring框架中的应用
15、为什么说Redis是单线程的以及Redis为什么这么快!
20、线程之间的通信(wait、notify、notifyAll进行线程之间的通信)
25、识别2的n次方,写个函数。(最快的是用位操作,大家应该都知道n&(n-1)可以去掉二进制最右的1,那2的n次幂&之后便为0)
29、Java中的IO、(同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO)
30、arraylist.sort怎么实现:(Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法)
31、100亿个数找最大1000个(说了分片,用堆,再归并)
34、线程池的实现原理(ThreadPoolExcuter)
35、算法:手写字符串的正则匹配,实现*和.的功能,用的递归(写了一半他说时间差不多了,思想大概了解了)。
36、举例说说在什么情况下会出现性能瓶颈,如何优化(答了用NIO的方式)
38、讲讲Spring中怎么对初始化的bean做其他操作。(这里有三种方式,@PostConstruct注解方式,init-method的XML配置方式,InitializingBean接口方式)
39、关于加密的私钥和公钥各自如何分配(客户端拿公钥,服务器拿私钥)
1、Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析
http://www.importnew.com/28263.html
2、Spring的AOP关于拦截private。
private方法 在Spring使用纯Spring AOP(只能拦截public/protected/包)都是无法被拦截的 因为子类无法覆盖;包级别能被拦截的原因是,如果子类和父类在同一个包中是能覆盖的。
在cglib代理情况下, execution(* *(..)) 可以拦截 public/protected/包级别方法(即这些方法都是能代理的)。
友情链接:https://www.cnblogs.com/protected/p/6652188.html
3、项目中的数据字典缓存实现方式:
1、通过全局HashMap实现:https://blog.csdn.net/bujibo/article/details/73811207
2、通过redis实现:http://www.cnblogs.com/leechenxiang/p/6115719.html
3、分布式系统缓存实现:https://blog.csdn.net/tangkund3218/article/details/50915007
4、一种基于“哨兵”的分布式缓存设计:http://blog.lichengwu.cn/architecture/2015/06/14/distributed-cache/
4、分布式缓存
友情链接:https://www.cnblogs.com/softidea/p/5555578.html
5、如何保证分布式数据最终一致性
友情链接:https://blog.csdn.net/hxpjava1/article/details/79409459
6、spring层面做事务和数据库层面做的区别,各种的实现方式
本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭,spring对数据库事务的包装,原理就是拿一个数据连接,根据spring的事务配置,操作这个数据连接对数据库进行事务开启,回滚或关闭操作.但是spring除了实现这些,还配合spring的传播行为对事务进行了更广泛的管理.其实这里还有个重要的点,那就是事务中涉及的隔离级别,以及spring如何对数据库的隔离级别进行封装.事务与隔离级别放在一起理解会更好些。
Spring事务的实现方式(三种:XML配置,注解,AOP实现):https://www.cnblogs.com/WJ-163/p/6035462.html
数据库事务的实现原理:https://www.cnblogs.com/takumicx/p/9998844.html
7、Spring事务管理(详解+实例)
友情链接:http://www.mamicode.com/info-detail-1248286.html
8、Mysql默认的事务隔离级别:可重复读
9、项目中的加密算法对比(DES,AES,RSA,MD5,SHA1,Base64)
加密技术通常分为两大类:"对称式"和"非对称式"。
对称性加密算法:对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。(AES、DES、3DES)
非对称算法:非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",它们两个必需配对使用,否则不能打开加密文件。发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。(RSA、DSA、ECC)
散列算法:散列算法,又称哈希函数,是一种单向加密算法。在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的"散列"或"消息摘要"(Message digest)。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。(MD5、SHA1、HMAC)
友情链接:https://www.cnblogs.com/sochishun/p/7028056.html
10、Spring框架IOC和AOP的实现原理,AOP在Spring框架中的应用
IoC(Inversion of Control)
AOP(Aspect Oriented Programming)
https://www.cnblogs.com/cyhzzu/p/6644981.html
11、Java动态代理之JDK实现和CGlib实现
二者的区别:
- cglib实现原理是通过集成被代理类来实现动态代理的,因而类的修饰符不能含有final修饰符,并且方法同样不能使用static和final等修饰符,若含有就不能实现增强方法
- jdk实现原理:代理对象和被代理对象必须同时实现同一接口(即含有同一套规范).
代理模式、JDK、CGlib:https://blog.csdn.net/qq_27717967/article/details/73561179
静态代理和动态代理、JDK动态代理与CGlib动态代理:http://www.cnblogs.com/ygj0930/p/6542259.html
Spring在选择用JDK还是CGLiB的依据:https://www.cnblogs.com/bigmonkeys/p/7823268.html
12、什么时候索引失效
https://www.cnblogs.com/areyouready/p/7802885.html
1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.
由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效.
错误的例子:select * from test where tu_mdn=13333333333;
正确的例子:select * from test where tu_mdn='13333333333';
2. 对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)
错误的例子:select * from test where id-1=9;
正确的例子:select * from test where id=10;
3. 使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.
错误的例子:select * from test where round(id)=10; 说明,此时id的索引已经不起作用了
正确的例子:首先建立函数索引,create index test_id_fbi_idx on test(round(id));然后 select * from test where round(id)=10; 这时函数索引起作用了
4. 以下使用会使索引失效,应避免使用;
a. 使用 <> 、not in 、not exist、!=
b. like "%_" 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)
c. 单独引用复合索引里非第一位置的索引列.应总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个列被where子句引用时,优化器才会选择使用该索引。
d. 字符型字段为数字时在where条件里不添加引号.
e. 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
5. 不要将空的变量值直接与比较运算符(符号)比较。
如果变量可能为空,应使用 IS NULL 或 IS NOT NULL 进行比较,或者使用 ISNULL 函数。
6. 不要在 SQL 代码中使用双引号。
因为字符常量使用单引号。如果没有必要限定对象名称,可以使用(非 ANSI SQL 标准)括号将名称括起来。
7. 将索引所在表空间和数据所在表空间分别设于不同的磁盘chunk上,有助于提高索引查询的效率。
8. Oracle默认使用的基于代价的SQL优化器(CBO)非常依赖于统计信息,一旦统计信息不正常,会导致数据库查询时不使用索引或使用错误的索引。
一般来说,Oracle的自动任务里面会包含更新统计信息的语句,但如果表数据发生了比较大的变化(超过20%),可以考虑立即手动更新统计信息,例如:analyze table abc compute statistics,但注意,更新 统计信息比较耗费系统资源,建议在系统空闲时执行。
9. Oracle在进行一次查询时,一般对一个表只会使用一个索引.
因此,有时候过多的索引可能导致Oracle使用错误的索引,降低查询效率。例如某表有索引1(Policyno)和索引2(classcode),如果查询条件为policyno = ‘xx’ and classcode = ‘xx’,则系统有可能会使用索 引2,相较于使用索引1,查询效率明显降低。
10. 优先且尽可能使用分区索引。
13、索引什么时候最高效
表的主关键字
自动建立唯一索引
如zl_yhjbqk(用户基本情况)中的hbs_bh(户标识编号)
表的字段唯一约束
ORACLE利用索引来保证数据的完整性
如lc_hj(流程环节)中的lc_bh+hj_sx(流程编号+环节顺序)
直接条件查询的字段
在SQL中用于条件约束的字段
如zl_yhjbqk(用户基本情况)中的qc_bh(区册编号)
select * from zl_yhjbqk where qc_bh=’<????甼曀???>7001’
查询中与其它表关联的字段
字段常常建立了外键关系
如zl_ydcf(用电成份)中的jldb_bh(计量点表编号)
select * from zl_ydcf a,zl_yhdb b where a.jldb_bh=b.jldb_bh and b.jldb_bh=’540100214511’
查询中排序的字段
排序的字段如果通过索引去访问那将大大提高排序速度
select * from zl_yhjbqk order by qc_bh(建立qc_bh索引)
select * from zl_yhjbqk where qc_bh=’7001’ order by cb_sx(建立qc_bh+cb_sx索引,注:只是一个索引,其中包括qc_bh和cb_sx字段)
查询中统计或分组统计的字段
select max(hbs_bh) from zl_yhjbqk
select qc_bh,count(*) from zl_yhjbqk group by qc_bh
14、Mysql中的char,varchar,text区别
友情链接:https://www.cnblogs.com/chenpingzhao/p/4714411.html
15、为什么说Redis是单线程的以及Redis为什么这么快!
https://www.cnblogs.com/qwangxiao/p/8535202.html
16、从内存划分说到了GC算法、分代思想,CMS和G1 collector,到类加载模型,tomcat的非双亲委派、线程上下文加载器,到JVM调优的策略,gc参数设置策略,如何找死锁,读快照,发现内存泄漏
17、tomcat类加载机制与JVM的类加载机制
https://www.cnblogs.com/aspirant/p/8991830.html
18、java并发编程时需要注意事项:
1、上下文切换会带来额外的开销
2、避免死锁的情况
3、计算机资源会限制并发(误区:不是线程越多越好)
https://www.cnblogs.com/ldq2016/p/9104218.html
19、线程同步方式(7种)及各个同步方式之间的区别
https://www.cnblogs.com/XHJT/p/3897440.html
1、synchronized修饰方法,修饰静态方法是同步整个类。
2、synchronized修饰代码块
3、使用特殊域变量(volatile)实现线程同步)
4、使用重入锁实现线程同步(ReentrantLock)
5、使用局部变量实现线程同步 (ThreadLocal )
6、使用阻塞队列实现线程同步(LinkedBlockingQueue等)
7、使用原子变量实现线程同步(AtomicInteger等)
20、线程之间的通信(wait、notify、notifyAll进行线程之间的通信)
https://www.cnblogs.com/Wenxu/p/7979023.html
https://blog.csdn.net/qq_42473704/article/details/81942347
21、悲观锁与乐观锁的区别,底层实现原理
https://blog.csdn.net/qq_34337272/article/details/81072874
22、单例的七种写法及多线程使用的时候注意
https://www.cnblogs.com/Sharley/p/5315959.html
23、常见的内存泄漏及防止
https://blog.csdn.net/wtt945482445/article/details/52483944
24、Java的内存调优
https://www.cnblogs.com/andy-zhou/p/5327288.html
25、识别2的n次方,写个函数。(最快的是用位操作,大家应该都知道n&(n-1)可以去掉二进制最右的1,那2的n次幂&之后便为0)
26、http的相关知识
https://www.cnblogs.com/TomSnail/p/6078395.html
27、redis底层实现
https://blog.csdn.net/wcf373722432/article/details/78678504
28、海量数据的查找最大、重复数据等
https://blog.csdn.net/u010601183/article/details/56481868/
29、Java中的IO、(同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO)
https://www.cnblogs.com/dolphin0520/p/3916526.html
https://www.cnblogs.com/dolphin0520/p/3919162.html
30、arraylist.sort怎么实现:(Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法)
https://blog.csdn.net/qq_22167989/article/details/79236654
31、100亿个数找最大1000个(说了分片,用堆,再归并)
32、hibernate 缓存 mybatis 缓存对比
https://blog.csdn.net/yechuan_smile/article/details/80886235
https://blog.csdn.net/qq441568267/article/details/79566246
33、SpringMVC和Struts对比
34、线程池的实现原理(ThreadPoolExcuter)
https://www.cnblogs.com/zhaojinxin/p/6668247.html
35、算法:手写字符串的正则匹配,实现*和.的功能,用的递归(写了一半他说时间差不多了,思想大概了解了)。
36、举例说说在什么情况下会出现性能瓶颈,如何优化(答了用NIO的方式)
37、NIO的实现netty(Netty实现原理浅析)
http://www.importnew.com/15656.html