京东Java面试题(共现场4面)
一面(基础面:约1个小时)
- 自我介绍,主要讲讲做了什么和擅长什么
- springmvc和spring-boot区别
- @Autowired的实现原理
- Bean的默认作用范围是什么?其他的作用范围?
- 索引是什么概念有什么作用?MySQL里主要有哪些索引结构?哈希索引和B+树索引比较?
- Java线程池的原理?线程池有哪些?线程池工厂有哪些线程池类型,及其线程池参数是什么?
- hashmap原理,处理哈希冲突用的哪种方法?
- 还知道什么处理哈希冲突的方法?
- Java GC机制?GC Roots有哪些? 10.Java怎么进行垃圾回收的?什么对象会进老年代?垃圾回收算法有哪些?为什么新生代使用复制算法?
- HashMap的时间复杂度?HashMap中Hash冲突是怎么解决的?链表的上一级结构是什么?Java8中的HashMap有什么变化?红黑树需要比较大小才能进行插入,是依据什么进行比较的?其他Hash冲突解决方式?
- hash和B+树的区别?分别应用于什么场景?哪个比较好?
- 项目里有个数据安全的,aes和md5的区别?详细点
二面(问数据库较多:约1个小时)
- 自我介绍
- 为什么MyISAM查询性能好?
- 事务特性(acid)
- 隔离级别
- SQL慢查询的常见优化步骤?
- 说下乐观锁,悲观锁(select for update),并写出sql实现
- TCP协议的三次握手和四次挥手过程?
- 用到过哪些rpc框架
- 数据库连接池怎么实现
- Java web过滤器的生命周期
三面(综合面,约五十分钟)
- 自我介绍。
- ConcurrentHashMap 在Java7和Java8中的区别?为什么Java8并发效率更好?什么情况下用HashMap,什么情况用ConcurrentHashMap?
- 加锁有什么机制? ThreadLocal?应用场景?
- 数据库水平切分,垂直切分的设计思路和切分顺序
- Redis如何解决key冲突
- soa和微服务的区别?
- 单机系统演变为分布式系统,会涉及到哪些技术的调整?请从前面负载到后端详细描述。
- 设计一个秒杀系统?
四面:(HR面)
- 你自己最大优势和劣势是什么
- 平时遇见过什么样的挑战,怎么去克服的
- 工作中遇见了技术解决不了的问题,你的应对思路?
- 你的兴趣爱好?
- 未来的职业规划是什么?
遇到过的难题
遇到的难题:
- 正则表达式/g引发的灾难
- @JsonFormat在返回ModelAndView时无效
- 运维人员迁移项目的之后,更新了Tomcat,忘记设置Tomcat的JAVA_OPTS,内存不足,导致下载文件90%的情况下无法下载,进而导致程序挂掉
- 使用POI获取Excel数据的时候,虽然没有数据,但是格式改变了,就会导致POI读取到空行,解决方案是嵌套类似于冒泡排序,嵌套For循环,当有一行不全为空,则直接返回index+1作为行数
- Oracle数据库存储过程不执行的问题
- 报表导出,数据不是一行一行的,而是左边是一行一行从数据库读取的数据,右边则是计算出来的数据
- partiontan by
- jsxl读取Excel表格的时候使用默认的getPhysicalNumberOfRows不能准确读取行数,这个方法会把带有格式的空行也算进去,所以要倒序检验每一行是否为空来测试准确的行数。
Spring Mvc和Spring Boot区别
- Spring包含了SpringMVC,而SpringBoot又包含了Spring或者说是在Spring的基础上做得一个扩展。
- springMVC是Spring的一个模式,是一个Web框架,提供了一个轻度耦合的方式来开发Web应用;
- SpringBoot是约定优于配置,降低了项目搭建的难度;
- springMVC需要使用到TomCat服务器,SpringBoot的话是内嵌了Tomcat服务器的;
数据库索引有什么优缺点
优点:
- 大大加快数据的检索速度;
- 创建唯一性索引,保证数据库表中每一行数据的唯一性;
- 加速表和表之间的连接;
- 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;
- 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;
- 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大;
- 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
记一次灾难性的Bug
Tomcat未设置JAVA_OPTS
以下设置仅供参考
1G内存环境下 Java JVM 的参数设置: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true"
@Transaction 失效的场景
- protected、 private方法上使用。不会报错,也不会生效。
- @Transaction注解属性propagation设置错误,详细可查看此属性的三个枚举值
- @Transaction注解属性rollbackFor设置错误,指定异常类型错误。
- 同一个类中方法调用。B方法标注注解,A方法调用B方法,且两个方法在同一个类中
- 方法中有catch。
- 数据库引擎不支持。
spring的常用注解有哪些?
- @Value:属性赋值
- @Component:与业务层、dao层、控制层不相关的类需要在spring容器中创建使用
- @Repository:dao层对象的创建
- @Service:业务层对象的创建
- @Controller:控制层对象的创建
- @Autowired:引用类型赋值,支持byName。默认是byType
Spring Boot的约定优于配置,你的理解是什么?
我从4个点方面来回答。
- 首先, 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。
- Spring Boot就是约定优于配置这一理念下的产物,它类似于Spring框架下的一个脚手架,通过Spring Boot,我们可以快速开发基于Spring生态下的应用程序。
- 基于传统的Spring框架开发web应用,我们需要做很多和业务开发无关并且只需要做一次的配置,比如
- 管理jar包依赖
- web.xml维护
- Dispatch-Servlet.xml配置项维护
- 应用部署到Web容器
- 第三方组件集成到Spring IOC容器中的配置项维护
而在Spring Boot中,我们不需要再去做这些繁琐的配置,Spring Boot已经自动帮我们完成了,这就是约定由于配置思想的体现。
- Spring Boot约定由于配置的体现有很多,比如
- Spring Boot Starter启动依赖,它能帮我们管理所有jar包版本
- 如果当前应用依赖了spring mvc相关的jar,那么Spring Boot会自动内置Tomcat容器来运行web应用,我们不需要再去单独做应用部署。
- Spring Boot的自动装配机制的实现中,通过扫描约定路径下的spring.factories文件来识别配置类,实现Bean的自动装配。
- 默认加载的配置文件application.properties 等等。
总的来说,约定优于配置是一个比较常见的软件设计思想,它的核心本质都是为了更高效以及更便捷的实现软件系统的开发和维护。
以上就是我对这个问题的理解。