Java面试题收集(三)

目录

1、Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

2、Spring的AOP关于拦截private。

3、项目中的数据字典缓存实现方式:

4、分布式缓存

5、如何保证分布式数据最终一致性

6、spring层面做事务和数据库层面做的区别,各种的实现方式

7、Spring事务管理(详解+实例)

8、Mysql默认的事务隔离级别:可重复读

9、项目中的加密算法对比(DES,AES,RSA,MD5,SHA1,Base64)

10、Spring框架IOC和AOP的实现原理,AOP在Spring框架中的应用

扫描二维码关注公众号,回复: 5532520 查看本文章

11、Java动态代理之JDK实现和CGlib实现

12、什么时候索引失效

13、索引什么时候最高效

14、Mysql中的char,varchar,text区别

15、为什么说Redis是单线程的以及Redis为什么这么快!

16、从内存划分说到了GC算法、分代思想,CMS和G1 collector,到类加载模型,tomcat的非双亲委派、线程上下文加载器,到JVM调优的策略,gc参数设置策略,如何找死锁,读快照,发现内存泄漏

17、tomcat类加载机制与JVM的类加载机制

18、java并发编程时需要注意事项:

19、线程同步方式(7种)及各个同步方式之间的区别

20、线程之间的通信(wait、notify、notifyAll进行线程之间的通信)

21、悲观锁与乐观锁的区别,底层实现原理

22、单例的七种写法及多线程使用的时候注意

23、常见的内存泄漏及防止

24、Java的内存调优

25、识别2的n次方,写个函数。(最快的是用位操作,大家应该都知道n&(n-1)可以去掉二进制最右的1,那2的n次幂&之后便为0)

26、http的相关知识

27、redis底层实现

28、海量数据的查找最大、重复数据等

29、Java中的IO、(同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO)

30、arraylist.sort怎么实现:(Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法)

31、100亿个数找最大1000个(说了分片,用堆,再归并)

32、hibernate 缓存 mybatis 缓存对比

33、SpringMVC和Struts对比

34、线程池的实现原理(ThreadPoolExcuter)

35、算法:手写字符串的正则匹配,实现*和.的功能,用的递归(写了一半他说时间差不多了,思想大概了解了)。

36、举例说说在什么情况下会出现性能瓶颈,如何优化(答了用NIO的方式)

37、NIO的实现netty(Netty实现原理浅析)

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实现

二者的区别:

  1. cglib实现原理是通过集成被代理类来实现动态代理的,因而类的修饰符不能含有final修饰符,并且方法同样不能使用static和final等修饰符,若含有就不能实现增强方法
  2. 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

38、讲讲Spring中怎么对初始化的bean做其他操作。(这里有三种方式,@PostConstruct注解方式,init-method的XML配置方式,InitializingBean接口方式)

39、关于加密的私钥和公钥各自如何分配(客户端拿公钥,服务器拿私钥)

猜你喜欢

转载自blog.csdn.net/gangsijay888/article/details/88531550
今日推荐