2017秋招京东Java工程师面经

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类创建线程类

    1. 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
    2. 创建Thread子类的实例,即创建了线程对象。
    3. 调用线程对象的start()方法来启动该线程。
  • 通过Runnable接口创建线程类

    1. 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
    2. 创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
    3. 调用线程对象的start()方法来启动该线程。
  • 通过Callable和Future创建线程

    1. 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
    2. 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
    3. 使用FutureTask对象作为Thread对象的target创建并启动新线程。
    4. 调用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

为什么数据库表中需要主键

  • 主键的作用:唯一标识表中每一行
  • 便于对表中特定的行进行更新或删除
  • 表中任意列都可以作为主键,但是需要满足以下条件:
    1. 任何两行都不具有相同的主键值
    2. 每个行都必须具有一个主键值(主键列不允许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的生命周期:

    1. 启动服务器时加载Servlet的实例;
    2. 第一次访问时调用init()方法来初始化实例;
    3. 从第一次到以后的多次访问,都是只调用doGet()或doPost()方法;
    4. 停止服务器时调用destroy()方法,销毁实例。
  • 过滤器:
    过滤器的生命周期:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行)

    1. 启动服务器时加载过滤器的实例,并调用init()方法来初始化实例;
    2. 每一次请求时都只调用方法doFilter()进行处理;
    3. 停止服务器时调用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/passwd
46   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;iif(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

你可能感兴趣的:(面试)