2017秋招京东Java工程师面经
来源:互联网 发布:淘宝禁售商品奶粉 编辑:程序博客网 时间:2024/05/22 12:58
1、面经分享链接
- java面经三:(京东三面+hr面) https://www.nowcoder.com/discuss/41305
- 京东美团Java研发暑期实习面经 https://www.nowcoder.com/discuss/25226
2、基础
Java8新特性
- Lambda表达式
- 接口的默认方法与静态方法
- 好文分享:http://www.cnblogs.com/pkufork/p/java_8.html
创建线程的三种方式
继承Thread类创建线程类
- 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
- 创建Thread子类的实例,即创建了线程对象。
- 调用线程对象的start()方法来启动该线程。
通过Runnable接口创建线程类
- 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
- 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
- 调用线程对象的start()方法来启动该线程。
通过Callable和Future创建线程
- 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
- 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
- 使用FutureTask对象作为Thread对象的target创建并启动新线程。
- 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
- 好文分享:http://blog.csdn.net/longshengguoji/article/details/41126119
- http://blog.csdn.net/ghsau/article/details/7451464
inner join,left join,rigth join的区别
- 好文分享:http://www.cnblogs.com/aaapeng/archive/2010/01/20/1652151.html
为什么数据库表中需要主键
- 主键的作用:唯一标识表中每一行
- 便于对表中特定的行进行更新或删除
- 表中任意列都可以作为主键,但是需要满足以下条件:
- 任何两行都不具有相同的主键值
- 每个行都必须具有一个主键值(主键列不允许NULL值)
- 好文分享:http://www.jianshu.com/p/33b7b6e0a396
索引的类型,怎么实现的?
- 好文分享:http://database.51cto.com/art/201005/202796.htm
- http://www.cnblogs.com/chenyang920/p/5268665.html
3、Spring框架
Spring是什么
- 内部最核心的就是IOC了,控制反转,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象和调用对象里的方法的 。
- Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过 配置类达到的。
- 好文分享:http://www.cnblogs.com/zhoudi/p/5820513.html
Hibernate对象的三种状态
- 好文分享:http://blog.csdn.net/fg2006/article/details/6436517/
4、设计模式,JVM
4.1 设计模式
装饰模式和适配器模式的区别?
答:从两个设计模式的实现功能、实现方式说
* 装饰模式是为能够动态的扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。
* 适配器就更好理解了,适配器是对其他对象接口的一种转换行为,将原接口转换为目标接口,以达到适配的效果。再从设计模式的实现方式来讲,具体的内容可以从这里得到,讲的很详细,本文中我就不再赘述了。
* 好文分享:http://blog.csdn.net/zhangerqing/article/details/8239539
4.2 JVM
重量级锁与轻量级锁的区别
首先简单说下先偏向锁、轻量级锁、重量级锁三者各自的应用场景:偏向锁:只有一个线程进入临界区;轻量级锁:多个线程交替进入临界区;重量级锁:多个线程同时进入临界区。还要明确的是,偏向锁、轻量级锁都是JVM引入的锁优化手段,目的是降低线程同步的开销。比如以下的同步代码块:synchronized (lockObject) {
// do something
}
- 重量级锁:线程同步过程中需要进行互斥开销的锁
- 轻量级锁:在没有多线程竞争的前提下,减少传统的重量级锁使用互斥量产生的性能消耗,即使用CAS操作消除同步使用的互斥量。
- 好文分享:http://www.cnblogs.com/charlesblc/p/5994162.html
悲观锁与乐观锁的区别
- 悲观锁:总是认为只要不去做正确的同步措施,就会出现线程不安全的问题,无论共享数据是否真的发生竞争,它都要加锁、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。
- 乐观锁:先不加锁进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果共享数据有争用,产生了冲突,那就采用其他的补偿措施。
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号或者时间戳等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。
- 好文分享:https://www.2cto.com/database/201605/507258.html
http://blog.csdn.net/z69183787/article/details/46779335
共享锁与排他锁的区别
- 共享锁:允许事务读一行数据
- 排他锁:允许事务删除或更新一行数据
4、WEB
4.1 Java web过滤器的生命周期
Servlet的生命周期:
- 启动服务器时加载Servlet的实例;
- 第一次访问时调用init()方法来初始化实例;
- 从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;
- 停止服务器时调用destroy()方法,销毁实例。
过滤器:
过滤器的生命周期:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行)- 启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
- 每一次请求时都只调用方法doFilter()进行处理;
- 停止服务器时调用destroy()方法,销毁实例。
4.2 HTTP与HTTPS的区别
简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
5、Linux,操作系统
5.1 linux统计一个文本中出现的单词数量
[root@jfht ~]# wc /etc/passwd46 66 2027 /etc/passwd行数 单词数 字符数 文件名-l 行数-w 单词数-c 字符数
6、算法
6.1 大数的加法
- 好文分享:http://www.cnblogs.com/leader/archive/2013/01/28/2880643.html
void Add(char s1[],char s2[]) //需要两个字符串参数&&无返回值 { int num1[M],nm2[M]; int i,j; len1=strlen(s1); len2=strlen(s2); for(i=len1-1,j=0;i>=0;i--)//num[0]保存的是低位 num1[j++]=s1[i]-'0'; for(i=len2-1,j=0;i>=0;i--) num2[j++]=s2[i]-'0'; for(i=0;i<M;i++) { num1[i]+=num2[i]; if(num1[i]>9) { num1[i]-=10; num1[i+1]++; } } for(i=M;(i>=0)&&(num1[i]==0);i--)//找到第一个不是零的数 { if(i>=0) for(;i>=0;i--) printf("%d",num1[i]); else printf("0\n") }
7、项目,大数据
高并发
- 好文分享:http://blog.csdn.net/suifeng3051/article/details/52607544?reload
- 2017秋招京东Java工程师面经
- 2017秋招美团Java工程师面经
- 2017 阿里实习 JAVA 研发工程师面经
- JAVA工程师面试题
- java工程师面试题
- Java工程师面试题
- java工程师面试题
- java工程师面试题
- JAVA工程师面试题
- php工程师面经
- java工程师面试题总汇
- 美团网Java工程师面试题
- java工程师常见面试题
- JAVA开发工程师面试题
- JAVA开发工程师面试题
- java工程师中兴面试题
- 高级java工程师面试题
- 中级java工程师面试题
- 教您用公式编辑器打恒不等于符号
- Face ID 上手体验信息汇总:面部解锁流畅,原理移植AR让人憧憬
- (五)Httpclient和HttpURLConnect
- 本地缓存(Guava Loading Cache)
- 关于Oryx推荐系统的文档- CSDN博客
- 2017秋招京东Java工程师面经
- Candy
- Linux文件属主和属组
- eclipse配置tomcat
- POI CSV方式处理大数据excel文件
- 回文最少分割数
- 请问JSP是用JAVA编写的吗?
- LeetCode 319 Bulb Switcher
- ECLIPSE下JAVA 项目配置动态WEB项目失败的解决