JAVA开发工程师 面试经验( 成都 ) - 京东商城
发布时间: 2018-08-29 来源:职朋网友分享
面试过程:

电话面试,首先微信询问了为什么离职,我说是因为出差不能 接受,最好不要说其他体现自己缺点的原因。然后就让我等电话面试,当天下班7点就来电话开始面试了,面试一共就问了10个问题左右,当时聊的挺轻松的。

面试官问的面试题:

京东商城JAVA开发工程师面试题

1. LinkedList和ArrayList的数据原理?
a) LinkedList:链表结构,增删快,读取慢。
b) ArrayList:数组结构,读取快,增删慢。
2. ArrayList的默认初始化长度,在add时的源码实现?
a) 默认长度10,add时如果满了会使用arrays.copy()到一个新建的长度为1.5倍的数组。
3. HashMap的底层实现,在高并发时会出现的问题,是否有序的,解释无序的原因?
a) Entry数组,hash碰撞时会形成链表。
b) 并发put时会在扩容时形成链表环,下一次get时内容溢出。
c) 无序,数组下标是根据key的hash值计算的,和放入顺序无关。
4. HashSet内部实现,如何实现的无重复?
a) 内部就是包了一个hashMap,使用key的hash值来存放到map里面,如果相同就覆盖。
5. String的内部结构?
a) Char数组,定义为final类不可变,每一次字符串拼接都是new stringBuilder.append(),每一次的replace/substring都是new String()。
6. 线程池的参数含义,线程池执行新情求的流程?
a) 流程:
i. 核心数未满就创建线程,即使有空闲的;
ii. 核心数满了队列未满,就放入队列;
iii. 队列满了,就新建线程直至最大数满;
iv. 最大数满了就根据拒绝处理策略处理;
b) corePollSize:核心线程数
c) maximumPoolSize:最大线程数
d) keepAliveTime:空闲线程保留时间
e) TimeUnit:保留时间单位
f) BlockingQueue:阻塞队列(有限队列ArrayBlockingQueue,无限队列LinkedBlockingQueue)
g) ThreadFactory:线程工厂
h) RejectedExeutionHandler:队列满时的拒绝处理策略
7. Runable和Callable区别?
a) 都是任务,后者可以有返回值或者抛出异常,使用get获取返回值时要阻塞当前线程。
8. volatile关键字的作用?
a) 防止指令重排,对所有线程的可见性;
b) 可见性是基于内容屏障实现的,保证每个线程总能拿到内存中的最新值。
9. 事务的理解,事务的传播性,传播级别,隔离性,隔离级别?
a) 事务分为编程式和声明式。编程式更加灵活,声明式方便管理。
b) 传播级别定义的是事务的控制范围,事务隔离级别定义的是事务在数据库读写方面的控制范围。
c) 传播级别:
i. REQUIRED:上下文已存在事务,则加入到事务中,若不存在,则创建事务
ii. NESTED:嵌套上下文中的事务,不存在就新建
iii. SUPPORTS:上下文已存在事务,则加入到事务中,若不存在,则不使用事务
iv. NOT_SUPPORTED:不支持事务,如果在事务中,就挂起直至逻辑完成后恢复
v. REQUIRES_NEW:每次都新建一个事务,挂起上下文的事务直至本事务完成后恢复
vi. MANDATORY:要求上下文必须存在事务,否则抛出异常
vii. NERVER:要求上下文不允许存在事务,否则抛出异常
d) 隔离级别:
i. Serializable:事务串行执行,影响性能
ii. Repeatable read:避免了不可重复读取,保证一个事务不会修改已经由另一个事务读取但未提交的数据
iii. Read committed:默认级别,保证一个事务不会读取已经由另一个事务读取但未提交的数据
iv. Read uncommitted:保证不会读取非法数据
10. SQL优化的例子?
a) 添加索引
i. 联合索引,谁在前谁可以单独用索引
ii. is null 和 is not null 不会使用索引
iii. 对列进行操作,如||连接,不会使用索引
iv. Like 语句%在前面不会使用索引
v. Order by 里面使用表达式不会使用索引
b) 将不等于<>替换为大于or小于
c) Select避免使用*号
d) 使用EXISTS代替IN
e) Sql语句全部大写,因为执行时会转换为大写
f) 读写分离和分库分表,可以用mysql的主从同步实现分库
11. SQL注入方式?如何防止?
a) 方式:比如登录页面用户名输入 ‘ or 1=1 --。
b) 防止:
i. 使用预编译PreparedStatement;
ii. 正则表达式过滤sql关键字和符号;
12. 乐观锁 悲观锁?
a) 乐观锁:借助版本号或时间戳,更新前获取旧值,更新时判断值为旧值才更新,否则回滚重试。
i. 使用场景:业务中无法和数据库保持连接的情况。或获取锁失败几率小的情况。
b) 悲观锁:一锁二查三更新。Mysql的select for update如果没用索引会全表扫描都锁上。
13. redis 可存储的数据结构,如何实现分布式锁?
a) String字符串,hash哈希,list列表,set集合,zset散列
b) 分布式锁用setnx命令,如果锁不存在则set进去,如果锁存在则不做操作
c) Setnx结合expire一起使用,保证过期自动解锁,防止死锁。但是可能出现expire命令时突然崩溃导致过期时间设置失败
d) 高版本redis使用set命令,一次性设置所有参数
jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
e) 还可以使用lua脚本加eval命令实现加锁的原子操作(非原子性场景:解锁时锁突然过期,然后另一个客户端加锁成功,这时解锁就解到别人去了)
14. Autowire 和 Resource 区别?
a) Autowire是byType的,是spring提供的,设置required=false可以注入null,结合@Qualifier可以byName。
b) Resource是byName的,是jdk自带的。
i. 如果同时指定了name和type,则找不到就抛出异常;
ii. 如果指定了name,就只按name匹配,找不到抛出异常;
iii. 如果指定了type,就只按type匹配,找不到或找到多个抛出异常;
iv. 如果没有指定,先按name,找不到再按type;
15. Spring Boot、Spring MVC 和 Spring 有什么区别?
a) Spring:主要核心是IOC和AOP。
b) Spring MVC:用于web应用,借助mvc分层,核心是DispatcherServlet,ModleAndView,ViewResolver。
c) Spring Boot:只支持JDK8,简化大量配置,通过自动配置和一个启动类实现,默认是tomcat容器,可以通过pom配置修改为jetty。
(如省略了web.xml+servlet-mvc.xml+application.xml等配置文件)
16. 微服务?
a) 概念:根据业务拆分为多个服务,部署在不同服务器上,相互之间进行调用,使用dubbo或者springcloud;
b) Dubbo停止维护,只支持RPC,不支持分布式;
17. Spring Cloud 如何注册服务?断路器是什么?Eureka Server集群?
a) 在main方法加@EnableDisscoveryClient,就可以在服务发布时,将服务名+ip+port+域名注册到注册中心,一般通过zookeeper/Eureka注册。
b) 调用的时候通过ribbon和feign(整合了Ribbon和Hystrix):
i. Ribbon:@RibbonClient(value="服务名称"),要构建http请求;
ii. Feign:@FeignClient,以接口的方式调用,定义为抽象方法,注解写在方法上;
c) 断路器:处理多个请求等待响应的问题,有三种状态:
i. 完全打开:上一次请求没有响应,下一次请求就被拦截。
ii. 半开:短时间内检测到服务有恢复迹象,就会放过请求,如果能调用成功,则关闭断路器。
iii. 关闭:服务能正常调用。
d) Eureka Server集群:采用去中心化的架构,每一个节点都保存其他节点的副本,新建节点后,会从附近节点请求注册信息做初始化,并且以心跳检测所有节点是否正常运行,如果超时没有收到心跳就会注销该节点。如果丢失心跳过多,就会自我保护。
18. kafka?activeMQ?RabbitMQ?
a) Kafka:处理发布-订阅的模式,高吞吐量,大数据量,支持批量写入,消息写入磁盘,减少IO;
b) ActiveMQ:
c) RabbitMQ:支持miror queue,不支持批量写入
19. JVM内存区域划分,内存模型,JVM调优?
a) 内存区域:
i. 堆:所有线程共享,存放对象和数组。
ii. 栈:每个线程有独立的栈,存放局部变量,操作数栈,常量池的引用,方法返回地址(递归会导致栈内存溢出) 。
iii. 方法区:所有线程共享,存放类信息,静态变量,编译后的代码。
iv. 本地方法栈:用于调用native方法服务的。
v. 程序计数器:每个线程有独立的计数器,保存的当前执行的指令的地址,用于多线程中切换线程后恢复之前的执行位置。
b) 内存模型:
i. 堆(Heap space分为年轻代和老年代。年轻代分为Eden和两个Survivor区)
1. 年轻代是新对象的产生地方,主要位于Eden区,Eden区被用完就会触发Minor GC,存活的放入From Survivor区,FS区满后触发GC,存活的放入To Survivor区。多次GC后仍然存活的放入老年代。
2. 老年代存放长久存活的对象,满后触发Major GC,这会让所有线程停止直到回收完成。
ii. 永久代(Permanent Generation)(Java8中已经用metaspace完全替代了永久代。jvm参数-XX:PermSize 和 -XX:MaxPermSize选项会被忽略)
iii. Native Area(程序计数器+本地方法栈)
c) 内存调优:
i. -Xmx/Xms:最大/初始堆内存 -XX:MaxNewSize/NewSize:最大/初始年轻内存(通常为 Xmx 的 1/3 或 1/4)
ii. 回收算法:引用计数,标记清除(碎片问题),复制(空间问题),标记整理(最优)
20. 设计模式,使用场景?
a) 观察者模式:如android的各种listener监听,借助接口通知观察者做出响应
b) 装饰者模式:如IO流的各种包装new BufferedInputStream(new FileInputStream(new File()))
c) 适配器模式:如Java.util.Arrays#asList(),java.io.InputStreamReader(InputStream)
d) 桥接模式:减耦合,如Collections类中的sort(),JDBC数据库访问接口API

查看面试题参考答案>>

面试相关细节(职业圈独家调查):

你是通过何种渠道获得这次面试机会的?
答:网上申请
整个面试花费了多长时间?(从接到面试消息到得到结果)
答:5天
面试形式包括哪些?
答:电话面试
你觉得这次面试的难度如何?
答:难度一般
你对这次面试的整体感觉怎么样?
答:一般
这次面试的结果如何?
答:面试还未出结果

赞一下(17) 踩一下

以上信息仅代表发布者自己的观点,由于在职时间、职位以及个体本身的影响,和公司整体情况可能会有偏差,仅供参考!

评论

还需查看京东商城 更多信息?

相关公司面试经验