大名鼎鼎互联网商家校招 Java 开发岗面试知识点解析

天之道,损有余而补不足,是故虚胜实,不足胜有余。

本文作者在一年之内参与过多场地试,应聘岗位均为 Java
开发方向。在不停的面试中,分类总计了 Java 开发岗位面试中的一些知识点。

最重要概括以下多少个部分:

  1. Java 基础知识点
  2. Java 常见集合
  3. 高并发编程(JUC 包)
  4. JVM 内存管理
  5. Java 8 知识点
  6. 网络协议相关
  7. 数据库相关
  8. MVC 框架相关
  9. 大数量相关
  10. Linux 命令相关

面试,是我们从该校走向社会的率先步。

互联网商家的高校招聘,从样式上说,面试一般分为 2-3 轮技术面试 +1 轮 HR
面试。不过有的店家真的是不曾 HR 面试的,直接就是三轮技术面。

技能面试中,面试官一般会先就你所应聘的职位开展相关文化的考察,也叫基础知识和作业逻辑面试。只要你回复的不是特别差,面试官通常会说:“我们写个代码吧”,这多少个时候就开头了算法面试。

也就是说,一轮技术面试 = 基础知识和业务逻辑面试 + 算法面试。

在本篇作品中,我们重点从技术面试聊起。技术面试包括:业务逻辑和基础知识面试。

率先是业务逻辑面试 ,也就是讲项目。

面试官会对你简历上写的多少个项目里面之一拿出去和您聊天。在里头,会针对你所做的东西举行深度挖掘。

概括:为何要如此做?优缺点分析,即便重新让你做一遍,你打算肿么办?
等等。这多少个环节重要考察大家对团结做过的项目(实习项目仍然校内项目)是否有一个清晰的认识。

有关业务逻辑面试的预备,提议在平常多多考虑总括,对项目的多少来源于、全体运行框架都应该熟练明白。

例如你在某商行见习过程中,就足以展开总计,而不必等到快离职的时候慌慌张张的去下结论该类型。

接下去是基础知识面试。

Java
开发属于后台开发方向,有人说后台开发很坑,因为急需上学的东西太多了。没错,那多少个职位就是索要学习好多东西。包括:本语言(Java/C++/PHP)基础、数据库、网络协议、Linux
系统、总括机原理甚至前端相关文化都可以观测你,而且,并不超纲 。

奇迹,你报的是后台开发岗,并且熟识的是 Java 语言,但是面试官却是 C++
开发方向的,就是如此无奈~

好了,闲话少说,让我们开首分类讲解常会面试知识点。

(一) Java 基础知识点

1)面向对象的特点有什么?

答:封装、继承和多态。

2)Java 中覆盖和重载是哪些看头?

剖析:覆盖和重载是比较重大的根底知识点,并且容易混淆视听,所以面试中常见。
答:覆盖(Override)是指子类对父类方法的一种重写,只好比父类抛出更少的特别,访问权限无法比父类的小。

被遮盖的点子不可以是 private
的,否则只是在子类中再次定义了一个艺术;重载(Overload)表示同一个类中得以有四个称呼一致的方法,但这个方法的参数列表各不相同。

面试官: 那么结合重载的规则有什么样?

答:参数类型不同、参数个数不同、参数顺序不同。

面试官: 函数的重回值不同足以组合重载吗?为何?

答:不得以,因为 Java 中调用函数并不需要强制赋值。举例如下:

正如六个模式:

    void f(){}
    int f(){ return 1;}

比方编译器能够依据语境明确判断出语义,比如在 int x =
f();中,那么的确可以据此区分重载方法。但是,
有时你并不关注方法的再次来到值,你想要的是方法调用的此外功用 (这常被称为
“为了副效用而调用”),这时你可能会调用方法而忽视其重返值,所以只要像下边的调用:

    fun();

此刻 Java 咋样才能判断调用的是哪一个 f()呢?别人怎么通晓这种代码呢?所以,按照办法重返值来区分重载方法是不行的。

3)抽象类和接口的分别有什么样?

答:

  1. 抽象类中得以没有抽象方法;接口中的方法必须是空泛方法;
  2. 抽象类中可以有一般的分子变量;接口中的变量必须是 static final
    类型的,必须被开头化 , 接口中唯有常量,没有变量。
  3. 抽象类只可以单继承,接口可以继续五个父接口;
  4. Java8 中接口中会有 default 方法,即方法可以被实现。

面试官:抽象类和接口咋样抉择?

答:

  1. 假若要创建不带任何形式定义和分子变量的基类,那么就应当采纳接口而不是抽象类。
  2. 只要明白某个类应该是基类,那么首先个挑选的应当是让它变成一个接口,只有在必须要有办法定义和分子变量的时候,才应该拔取抽象类。因为抽象类中允许存在一个或四个被具体实现的章程,只要方法没有被整个落实该类就仍是抽象类。

4)Java 和 C++ 的区别:

浅析:即使我们不太懂
C++,不过就是会如此问,尤其是三面(首席执行官级别)面试中。

答:

  1. 都是面向对象的言语,都帮忙封装、继承和多态;
  2. 指南针:Java 不提供指针来直接访问内存,程序更为安全;
  3. 接轨: Java 的类是单继承的,C++ 辅助多重继承; Java
    通过一个类实现五个接口来贯彻 C++ 中的多重继承; Java
    中类不可以多延续,不过!!!接口可以多延续;
  4. 内存: Java 有活动内存管理机制,不需要程序员手动释放无用内存。

5)Java 中的值传递和引用传递

解析:这类题目,面试官会手写一个事例,让您说出函数执行结果,详细举例请查阅自己的博客:Java
值传递和引用传递基础分析。

答:值传递是指目的被值传递,意味着传递了目的的一个副本,即使副本被改变,也不会影响源对象。引用传递是指目的被引述传递,意味着传递的并不是实在的对象,而是对象的引用。

于是,外部对引用对象的更改会反映到持有的目的上。

6)JDK 中常用的包有哪些?

答:java.lang、java.util、http://java.iohttp://java.net、java.sql。

7)JDK,JRE 和 JVM 的互换和界别:

答:JDK 是 java 开发工具包,是 java
开发环境的着力组件,并提供编译、调试和运作一个 java
程序所需要的所有工具,可执行文件和二进制文件,是一个平台特定的软件。

JRE 是 java 运作时环境,是 JVM 的进行实现,提供了运转 java
程序的阳台。JRE 包含了 JVM,不过不带有 java 编译器 /
调试器之类的开发工具。

JVM 是 java 虚拟机,当大家运行一个先后时,JVM
负责将字节码转换为一定机器代码,JVM 提供了内存管理 /
垃圾回收和雅安机制等。

这种独立于硬件和操作系统,正是 java 程序可以一遍编写多处实施的原因。

区别:

  1. JDK 用于支付,JRE 用于运行 java 程序;
  2. JDK 和 JRE 中都含有 JVM;
  3. JVM 是 java 编程语言的骨干并且拥有平台独立性。

Others:限于篇幅,面试中 Java 基础知识点还有:反射、泛型、表明等。

小结:本节关键演讲了 Java
基础知识点,这一个题材紧固然一面面试官在察看,难度不大,适当复习下,应该没什么问题。

(二)Java 中常见集合

晤面这上头的洞察非凡多,这一部分是面试中必考的知识点。

1)说说普遍的聚众有哪些吧?

答:Map 接口和 Collection 接口是装有集合框架的父接口:

  1. Collection 接口的子接口包括:Set 接口和 List 接口;
  2. Map
    接口的贯彻类首要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap
    以及 Properties 等;
  3. Set 接口的落实类重点有:HashSet、TreeSet、LinkedHashSet 等;
  4. List 接口的落实类首要有:ArrayList、LinkedList、Stack 以及 Vector
    等。

(2)HashMap 和 Hashtable 的区分有咋样?(必问)

答:

  1. HashMap 没有设想共同,是线程不安全的;Hashtable 使用了 synchronized
    关键字,是线程安全的;
  2. 前者允许 null 作为 Key;后者不容许 null 作为 Key。

3)HashMap 的最底层实现您通晓吧?

答:在 Java8 在此之前,其底层实现是数组 + 链表实现,Java8 使用了数组 + 链表

  • 红黑树实现。此时您可以简单的在纸上图案分析:

图片 1

4)ConcurrentHashMap 和 Hashtable 的区别? (必问)

答:ConcurrentHashMap 结合了 HashMap 和 HashTable 二者的优势。HashMap
没有设想共同,hashtable 考虑了一道的题材。不过 hashtable
在每便同步施行时都要锁住整个结构。 ConcurrentHashMap
锁的办法是有点细粒度的。 ConcurrentHashMap 将 hash 表分为 16
个桶(默认值),诸如 get,put,remove 等常用操作只锁当前亟待运用的桶。

面试官:ConcurrentHashMap 的现实贯彻知道啊?

答:

  1. 此类包含六个静态内部类 HashEntry 和
    Segment;前者用来封装映射表的键值对,后者用来充当锁的角色;
  2. Segment 是一种可重入的锁 ReentrantLock,每个 Segment 守护一个
    HashEntry 数组里得元素,当对 HashEntry
    数组的数目开展改动时,必须首先取得相应的 Segment 锁。

5)HashMap 的长度为何是 2 的幂次方?

答:

  1. 通过将 Key 的 hash 值与 length-1 举行 & 运算,实现了当前 Key
    的固定,2 的幂次方可以收缩争论(碰撞)的次数,提升 HashMap
    查询效能;
  2. 只要 length 为 2 的次幂 则 length-1 转化为二进制必定是
    11111……的款型,在于 h 的二进制与操作功能会丰富的快,而且空间不浪费;
  3. 比方 length 不是 2 的次幂,比如 length 为 15,则 length-1 为
    14,对应的二进制为 1110,在于 h 与操作,最后一位都为 0,而
    0001,0011,0101,1001,1011,0111,1101
    这个职务永远都不可以存放元素了,空间浪费分外大。

更糟的是这种情形中,数组可以利用的职务比数总监度小了众多,那象征进一步增添了磕碰的几率,减慢了询问的效率!这样就会招致空间的浪费。

6)List 和 Set 的区分是啥?

答:List 元素是板上钉钉的,可以另行;Set 元素是无序的,不可以重新。

7)List、Set 和 Map 的发端容量和加载因子

答:

  1. List
  • ArrayList 的上马容量是 10;加载因子为 0.5; 扩容增量:原容量的 0.5
    倍 +1;一回扩容后长度为 16。
  • Vector 起初容量为 10,加载因子是 1。扩容增量:原容量的 1 倍,如
    Vector 的容量为 10,两遍扩容后是容量为 20。
  1. Set

HashSet,开首容量为 16,加载因子为 0.75; 扩容增量:原容量的 1 倍; 如
HashSet 的容量为 16,一遍扩容后容量为 32

  1. Map

HashMap,开头容量 16,加载因子为 0.75; 扩容增量:原容量的 1 倍; 如
HashMap 的容量为 16,一遍扩容后容量为 32

8)Comparable 接口和 Comparator 接口有哪些分别?

答:

  1. 前者简单,不过假如需要重新定义相比类型时,需要修改源代码。
  2. 后者不需要修改源代码,自定义一个比较器,实现自定义的可比艺术。
    实际分析参考我的博客:Java 集合框架—Set

9)Java 集合的很快败北机制 “fail-fast”

答:它是 java
集合的一种错误检测机制,当多少个线程对聚集进行布局上的变动的操作时,有可能会生出
fail-fast 机制。

例如 :即使存在多少个线程(线程 1、线程 2),线程 1 通过 Iterator
在遍历集合 A 中的元素,在某个时候线程 2 修改了汇聚 A
的协会(是布局方面的改动,而不是简简单单的修改集合元素的内容),那么这一个时候程序就会抛出
ConcurrentModificationException 异常,从而发出 fail-fast 机制。

原因: 迭代器在遍历时直接访问集合中的内容,并且在遍历过程中利用一个
modCount 变量。集合在被遍历期间固然情节爆发变化,就会变动 modCount
的值。

每当迭代器使用 hashNext()/next() 遍历下一个因素往日,都会检测 modCount
变量是否为 expectedmodCount
值,是的话就回到遍历;否则抛出分外,终止遍历。

解决办法:

  1. 在遍历过程中,所有涉及到改变 modCount 值得地点全部增长
    synchronized;
  2. 使用 CopyOnWriteArrayList 来替换 ArrayList。

总计:本小节是 Java 中有关集合的洞察,是 Java
岗位面试中必考的知识点,除了应该精通以上的题材,包括各种集合的最底层实现也提出各位同学阅读,加深领悟。

(三)高并发编程-JUC 包

在 Java 5.0 提供了 java.util.concurrent(简称 JUC
)包,在此包中加进了在现身编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步
IO 和轻量级任务框架。

1)多线程和单线程的分别和交流:

答:

  1. 在单核 CPU 中,将 CPU
    分为很小的时日片,在每一时刻只可以有一个线程在实施,是一种微观上轮番占用
    CPU 的机制。
  2. 多线程会存在线程上下文切换,会招致程序执行速度变慢,即拔取一个怀有两个线程的长河执行所需要的年华比一个线程的过程执行两遍所急需的年月要多一些。

敲定:即采用多线程不会增长程序的执行进度,反而会下降速度,然则对于用户来说,可以削减用户的响应时间。

2)咋样指定四个线程的举办各类?

解析:面试官会给你举个例子,怎么着让 10 个线程遵照顺序打印
0123456789?(写代码实现)

答:

  1. 设定一个 orderNum,每个线程执行完毕之后,更新
    orderNum,指明下一个要履行的线程。并且唤醒所有的等待线程。
  2. 在每一个线程的始发,要 while 判断 orderNum
    是否等于自己的要求值!!不是,则 wait,是则履行本线程。

3)线程和经过的界别:(必考)

答:

  1. 经过是一个 “执行中的程序”,是系统开展资源分配和调度的一个单身单位;
  2. 线程是过程的一个实体,一个进程中兼有六个线程,线程之间共享地址空间和任何资源(所以通信和协同等操作线程比进程进一步容易);
  3. 线程上下文的切换比进程上下文切换要快很多。
  • (1)进程切换时,涉及到眼前进程的 CPU 环境的保留和新被调度运行过程的
    CPU 环境的设置。
  • (2)线程切换仅需要保留和设置少量的寄存器内容,不关乎存储管理方面的操作。

4)多线程发生死锁的 4 个必要条件?

答:

  1. 互斥条件:一个资源每一遍只好被一个线程使用;
  2. 伸手与保障标准:一个线程因请求资源而堵塞时,对已取得的资源保持不放;
  3. 不剥夺条件:进程已经赢得的资源,在未利用完从前,不可以强行剥夺;
  4. 巡回等待条件:若干线程之间形成一种头尾相接的循环等待资源事关。

面试官:如何制止死锁?(通常接着问这么些问题啊~)

答:指定获取锁的各种,举例如下:

  1. 比如说某个线程唯有拿到 A 锁和 B
    锁才能对某资源举办操作,在多线程条件下,怎么样制止死锁?
  2. 赢得锁的各样是自然的,比如规定,唯有得到 A 锁的线程才有身份拿到 B
    锁,按顺序获取锁就可以避免死锁!!!

5)sleep( ) 和 wait( n)、wait( ) 的区别:

答:

  1. sleep 方法:是 Thread 类的静态方法,当前线程将睡眠 n
    皮秒,线程进入阻塞状态。当睡眠时间到了,会去掉阻塞,举办可运行境况,等待
    CPU 的过来。睡眠不释放锁(如若部分话);
  2. wait 方法:是 Object 的主意,必须与 synchronized
    关键字一起行使,线程进入阻塞状态,当 notify 或者 notifyall
    被调用后,会消除阻塞。然则,只有重新占用互斥锁之后才会进入可运行状态。睡眠时,释放互斥锁。

6)synchronized 关键字:

答:底层实现:

  1. 进入时,执行 monitorenter,将计数器 +1,释放锁 monitorexit
    时,计数器-1;
  2. 当一个线程判断到计数器为 0
    时,则当前锁空闲,能够占据;反之,当前线程进入等待意况。

含义:(monitor 机制)

Synchronized
是在加锁,加对象锁。对象锁是一种重量锁(monitor),synchronized
的锁机制会依据线程竞争境况在运作时会有偏向锁(单一线程)、轻量锁(两个线程访问
synchronized
区域)、对象锁(重量锁,三个线程存在竞争的事态)、自旋锁等。

该重大字是一个三种锁的卷入。

7)volatile 关键字

答:该重大字可以保证可见性不保证原子性。

功能:

  1. 主内存和办事内存,直接与主内存发生交互,举行读写操作,保证可见性;
  2. 取缔 JVM 举行的指令重排序。

分析:关于指令重排序的题目,可以查看 DCL 双检锁失效相关资料。

8)ThreadLocal(线程局部变量)关键字:

答:当使用 ThreadLocal
维护变量时,其为各类使用该变量的线程提供单身的变量副本,所以每一个线程都得以单独的改变自己的副本,而不会潜移默化其余线程对应的副本。

ThreadLocal 内部贯彻机制:

  1. 每个线程内部都会维护一个类似 HashMap 的对象,称为
    ThreadLocalMap,里边会含有若干了 Entry(K-V
    键值对),相应的线程被称呼这一个 Entry 的属主线程;
  2. Entry 的 Key 是一个 ThreadLocal 实例,Value
    是一个线程特有对象。Entry 的效果即是:为其属主线程建立起一个
    ThreadLocal 实例与一个线程特有对象期间的对应关系;
  3. Entry 对 Key 的引用是弱引用;Entry 对 Value 的引用是强引用。

图片 2

9)Atomic 关键字:

答:能够使基本数据类型以原子的主意实现自增自减等操作。参考我的博客:concurrent.atomic
包下的类 AtomicInteger 的采纳。

10)线程池有打探吗?(必考)

答:java.util.concurrent.ThreadPoolExecutor 类就是一个线程池。客户端调用
ThreadPoolExecutor.submit(Runnable task)
提交任务,线程池内部维护的劳重力线程的数目就是该线程池的线程池大小,有 3
种形态:

  • 此时此刻线程池大小 :表示线程池中实际上工作者线程的数额;
  • 最大线程池大小
    (maxinumPoolSize):表示线程池中允许存在的工作者线程的多少上限;
  • 着力线程大小 (corePoolSize
    ):表示一个不超出最大线程池大小的劳重力线程数量上限。
  1. 假诺运行的线程少于 corePoolSize,则 Executor
    始终首选添加新的线程,而不开展排队;
  2. 如若运行的线程等于依旧多于 corePoolSize,则 Executor
    始终首选将呼吁进入队列,而不是添加新线程;
  3. 如若不可能将呼吁进入队列,即队列已经满了,则开改进的线程,除非创设此线程超出
    maxinumPoolSize, 在这种情况下,任务将被拒绝。

总括:本小节内容提到到 Java
中多线程编程,线程安全等知识,是面试中的重点和难点。

(四)JVM 内存管理

既然如此是 Java 开发面试,那么对 JVM
的观望当然也是必须的,面试官一般会问你对 JVM 有精晓呢?

本人通常都会把我所精通的都说两次,包括:JVM 内存划分、JVM
垃圾回收的意义,有怎么样 GC 算法,年轻代和老年代各自的特性统统演讲一遍。

1)JVM 内存划分:

  1. 方法区(线程共享):常量、静态变量、JIT(即时编译器)
    编译后的代码也都在方法区;
  2. 堆内存(线程共享):垃圾回收的重大场面;
  3. 次第计数器: 当前线程执行的字节码的岗位指示器;
  4. 虚构机栈(栈内存):保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量;
  5. 本地点法栈 :为 JVM 提供使用 native 方法的劳动。

2)类似-Xms、-Xmn 这一个参数的含义:

答:

堆内存分配:

  1. JVM 先河分配的内存由-Xms 指定,默认是情理内存的 1/64;
  2. JVM 最大分配的内存由-Xmx 指定,默认是大体内存的 1/4;
  3. 默认空余堆内存小于 40% 时,JVM 就会附加堆直到-Xmx
    的最大范围;空余堆内存大于 70% 时,JVM 会减弱堆直到 -Xms
    的纤维限制;
  4. 从而服务器一般设置-Xms、-Xmx 相等以防止在每一回 GC
    后调整堆的轻重。对象的堆内存由称为垃圾回收器的活动内存管理系列回收。

非堆内存分配:

  1. JVM 使用-XX:PermSize 设置非堆内存初始值,默认是物理内存的 1/64;
  2. 由 XX:马克斯(Max)PermSize 设置最大非堆内存的轻重缓急,默认是物理内存的 1/4;
  3. -Xmn2G:设置年轻代大小为 2G;
  4. -XX:Sur金立rRatio,设置年轻代中 艾登 区与 Sur红米r 区的比值。

3)垃圾回收算法有怎么样?

答:

  1. 引用计数
    :原理是此目的有一个引用,即扩展一个计数,删除一个引用则缩减一个计数。垃圾回收时,只用收集计数为
    0 的对象。此算法最致命的是无能为力处理循环引用的题目;
  2. 标记-清除
    :此算法执行分两等级。第一等级从引用根节点开端标记所有被引用的目的,第二阶段遍历整个堆,把未标记的对象清除;

此算法需要暂停一切应用,同时,会时有发生内存碎片;

  1. 复制算法
    :此算法把内存空间划为五个优异的区域,每一遍只行使其中一个区域。垃圾回收时,遍历当前使用区域,把正在利用中的对象复制到此外一个区域中;

此算法每一回只处理正在利用中的对象,因此复制成本相比小,同时复制过去之后还是能展开相应的内存整理,不会产出
“碎片” 问题。当然,此算法的欠缺也是很显明的,就是索要两倍内存空间;

  1. 标记-整理 :此算法结合了 “标记-清除” 和 “复制”
    多少个算法的助益。也是分两品级,第一阶段从根节点开始标记所有被引述对象,第二等级遍历整个堆,把消除未标记对象并且把现有对象
    “压缩” 到堆的中间一块,按梯次排放。

此算法避免了 “标记-清除” 的零散问题,同时也避免了 “复制”
算法的半空中问题。

4)root 搜索算法中,哪些可以用作 root?

答:

  • 被启动类(bootstrap 加载器)加载的类和成立的对象;
  • JavaStack 中的引用的靶子 (栈内存中引用的对象);
  • 方法区中静态引用指向的靶子;
  • 方法区中常量引用指向的对象;
  • Native 方法中 JNI 引用的对象。

5)GC 几时开首?

答:GC
平日发出的区域是堆区,堆区还足以细分为新生代、老年代,新生代还分为一个
Eden 区和五个 Sur小米r 区。

  1. 对象优先在 Eden 中分配,当 Eden 中并未丰硕空间时,虚拟机将发出一次Minor GC,因为 Java 大多数目标都是朝生夕灭,所以 Minor GC
    异常频繁,而且速度也迅速;
  2. Full GC,暴发在老年代的 GC,当老年代没有充分的空中时即发生 Full
    GC,发生 Full GC 一般都会有五次 Minor GC。

大目的间接进入老年代,如很长的字符串数组,虚拟机提供一个;XX:PretenureSizeThreadhold
参数,令大于这一个参数值的目标直接在老年代中分配,防止在 艾登 区和两个SurHUAWEIr 区暴发大气的内存拷贝;

  1. 发出 Minor GC
    时,虚拟机会检测往日每一次升迁到老年代的平均大小是否超过老年代的剩余空间大小,假如超越,则开展五遍Full GC,若是低于,则查看 HandlePromotionFailure
    设置是否同意保险败北,假设允许,这只会进行一回 Minor
    GC,倘使不容许,则改为开展两回 Full GC。

6)内存泄漏和内存溢出

答:

概念:

  1. 内存溢出指的是内存不够用了;
  2. 内存泄漏是指目的可达,但是无济于事了。即应当被 GC
    回收的靶子并从未被回收;
  3. 内存泄露是引致内存溢出的原委之一;内存泄露积累起来将导致内存溢出。

内存泄漏的因由剖析:

  1. 长生命周期的靶子引用短生命周期的目的;
  2. 从不将于事无补对象置为 null。

小结:本小节波及到 JVM
虚拟机,包括对内存的管制等知识,相对较深。除了以上问题,面试官会继续问您有的比较深的题材,可能也是为着看看你的终端在什么地方啊。
譬如说:内存调优、内存管理,是否遇到过内存泄漏的其实案例、是否真正关注过内存等。由于自身其实项目经验不足,这些深层次问题并没有接触过,各位有需要可以上网查阅。

(五)Java 8 相关知识点

关于 Java8 中新知识点,面试官会让您说说 Java8
你领悟多少,下面重要演说自己所领会,并且在面试中应对的 Java8 新增知识点。

1)HashMap 的底层实现有生成:HashMap 是数组 + 链表 + 红黑树(JDK1.8
增添了红黑树部分)实现。

2)JVM 内存管理方面,由元空间代替了不可磨灭代。

区别:

  1. 元空间并不在虚拟机中,而是利用当地内存;
  2. 默认情状下,元空间的分寸仅受本地内存限制;
  3. 也足以因而-XX:MetaspaceSize 指定元空间大小。

3)Lambda
表明式(也叫做闭包),允许我们将函数当成参数传递给某个方法,或者把代码本身作为数据处理。

4)函数式接口:指的是唯有一个函数的接口,java.lang.Runnable 和
java.util.concurrent.Callable 就是函数式接口的例证;java8
提供了一个新鲜的注释 @Functionallnterface 来声明该接口是一个函数式接口。

5)引入重复声明:Java 8 中运用 @Repeatable 阐明定义再一次表明。

6)接口中得以兑现形式 default 方法。

7) 阐明的利用情状拓宽:
声明几乎可以采用在另外因素上:局部变量、接口类型、超类和接口实现类,甚至足以用在函数的丰裕定义上。

8) 新的包 java.time 包

  1. 包含了所有关于日期、时间、时区、持续时间和时钟操作的类;
  2. 这一个类都是不可变的、线程安全的。

小结:Java8
的有的新特性,面试官一般景象下不要求你有多么领悟,首假设看看您有没有一对摸底。

(六)网络协议相关

网络协议方面,考察最多的概括服务器和客户端在三回握手、四遍挥手过程中的状态变化;还有网络不通控制,及其解决办法等。

1)两次握手、一次挥手示意图:

图片 3

一起有四种情况:主动建立连接、主动断开连接、被动建立连和消沉断开连接

两两组合依旧 4 种组合:

  1. 当仁不让建立连接、主动断开连接会经历的事态:
    SYNC_SENT——ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT
  2. 再接再厉建立连接、被动断开连接会经历的处境:
    SYNC_SENT——ESTABLISHED—-CLOSE_WAIT—-LAST_ACK
  3. 被动建立连接、主动断开连接会经历的动静:
    LISTEN—-SYN_RCVD—-ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT
  4. 被动建立连接、被动断开连接会经历的图景:
    LISTEN—-SYN_RCVD—-ESTABLISHED—-CLOSE_WAIT—-LAST_ACK

2)滑动窗口机制

由发送方和接收方在一次握手阶段,相互将团结的最大可收取的数据量告诉对方。也就是祥和的数据接受缓冲池的大小。这样对方可以遵照已发送的数据量来计量是否足以随着发送。

在处理过程中,当接到缓冲池的分寸爆发变化时,要给对方发送更新窗口大小的通知。

3)拥塞制止编制

闭塞:对资源的需要超越了可用的资源。若网络中过多资源同时供应不足,网络的性质就要显著变坏,整个网络的吞吐量随着负荷的叠加而降落。

堵塞控制:避免过多的多少注入到网络中,使得网络中的路由器或链路不致过载。

堵塞控制措施:

  • 慢起头 + 拥塞避免;
  • 快重传 + 快恢复。

图片 4图片 5

4)浏览器中输入:“www.xxx.com” 之后都发出了咋样?请详细讲演。

解析:经典的网络协议问题。

答:

  1. 由域名→IP 地址
    查找 IP 地址的进程依次通过了浏览器缓存、系统缓存、hosts
    文件、路由器缓存、 递归搜索根域名服务器。
  2. 树立 TCP/IP 连接(三遍握手具体经过)
  3. 由浏览器发送一个 HTTP 请求
  4. 由此路由器的转会,通过服务器的防火墙,该 HTTP 请求到达了服务器
  5. 服务器处理该 HTTP 请求,重返一个 HTML 文件
  6. 浏览器解析该 HTML 文件,并且出示在浏览器端
  7. 此地需要专注:
  • HTTP 协议是一种基于 TCP/IP 的应用层协议,举行 HTTP
    数据请求必须先创设 TCP/IP 连接
  • 可以这样敞亮:HTTP 是小轿车,提供了包装或者呈现数据的切实格局;Socket
    是发动机,提供了网络通信的能力。
  • 四个电脑之间的交换无非是五个端口之间的多少通信 ,
    具体的数据会以什么样的花样展现是以不同的应用层协议来定义的。

5)常见 HTTP 状态码

  1. 1xx(临时响应)
  2. 2xx(成功)
  3. 3xx(重定向):表示要到位请求需要进一步操作
  4. 4xx(错误):表示请求可能出错,妨碍了服务器的处理
  5. 5xx(服务器错误):表示服务器在品味处理请求时暴发内部错误
  6. 常见状态码:
  • 200(成功)
  • 304(未修改):自从上次呼吁后,请求的网页未修改过。服务器重返此响应时,不会回去网页内容
  • 401(未授权):请求要求身份验证
  • 403(禁止):服务器拒绝请求
  • 404(未找到):服务器找不到请求的网页

6)TCP 和 UDP 的区别:

答:

  1. 应对发送数据前是否留存建立连接的经过;
  2. TCP过认可机制,丢包可以重发,保证数据的正确性;UDP不保证科学,只是单纯的负责发送数据包;
  3. UDP 是面向报文的。发送方的 UDP
    对应用程序交下来的报文,在抬高首部后就向下交付给 IP
    层。既不拆分,也不合并,而是保存这多少个报文的界线,因而,应用程序需要采纳万分的报文大小;
  4. UDP 的头部,只有 8 个字节,相对于 TCP 头部的 20
    个字节音信包的额外开销很小。

防止篇幅,更多网络协议相关文化,请参阅我的博客:TCP/IP
琢磨面试常问知识点,倾心总计

总计:必须熟谙精晓 TCP 和 UDP
的区别、五次握手和三次挥手的情状切换,必考。

(七)数据库知识点

既然如此是后端开发,那么与数据库相关的知识点也是必要的。

1)MySQL 和 MongoDB 的区分有怎么着?怎么样挑选?

2)MongoDB 的优缺点有哪些?

(ps
本人对这一块不是很熟知,就不依附参考答案了,请各位小伙伴自行学习哈~)

3)听说过工作吗?(必考)

答:作为单个逻辑工作单元执行的一文山会海操作,满意四大特色:

  1. 原子性(Atomicity):事务作为一个完完全全被执行
    ,要么全部履行,要么全体不实施;
  2. 一致性(Consistency):保证数据库状态从一个一模一样状态转变为另一个一如既往状态;
  3. 隔离性(Isolation):六个事情并发执行时,一个政工的实施不应影响其他工作的实施;
  4. 持久性(Durability):一个事务一旦付出,对数据库的修改应该永久保存。

4)事务的面世问题有哪两种?

答:丢失更新、脏读、不可重复读以及幻读。

5)数据库中的锁有哪两种?
答:独占锁、排他锁以及改进锁。

6)事务的割裂级别有哪三种?

答:读未提交、读已交给、可重复读和连串化。

增添问题:MySQL 事务默认隔离级别是哪位?

答:可重新读。

剖析:关于问题(4)(5)(6)的事无巨细解答,请参阅我的博客:数据库并发机制和作业的隔离级别详解

(ps,关于数据库事务方面的深层次考察还有分布式事务即两段提交和三段提交等,限于自家水平,请各位自行学习)

7)数据库的目录有怎么着效劳?(必考)
底层数据结构是咋样,为何采用这种数据结构?

答:

  1. 索引
    是对数据库表中一列或多列的值举办排序的一种结构,使用索引可快捷访问数据库表中的一定新闻;
  2. 底层数据结构是 B+ 树;
  3. 应用 B+
    树的原由:查找速度快、功能高,在追寻的进程中,每一遍都能遗弃掉一部分节点,收缩遍历个数。(
    此时,你应当在白纸上画出什么样是 B+ 树 )

扩大问题:聚簇索引和非聚簇索引的区分?

8)MyISAM 和 InnoDB 的界别有哪些?

答:

  • MyISAM 不帮忙工作,InnoDB 是事情类型的仓储引擎;
  • MyISAM 只襄助表级锁,BDB 扶助页级锁和表级锁,默认为页级锁;而 InnoDB
    扶助行级锁和表级锁,默认为行级锁;
  • MyISAM 引擎不协理外键,InnoDB 补助外键;
  • MyISAM 引擎的表在大方高并发的读写下会平时出现表损坏的情景;
  • 对此 count( ) 查询来说 MyISAM 更有优势;
  • InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU
    效用可能是其他其他基于磁盘的关周到据库引擎所不可能媲美的;
  • MyISAM 匡助全文索引(FULLTEXT),InnoDB 不帮忙;
  • MyISAM 引擎的表的查询、更新、插入的频率要比 InnoDB 高。

最要紧的区别是:MyISAM 表不辅助工作、不辅助行级锁、不襄助外键。 InnoDB
表帮忙工作、扶助行级锁、协助外键。(可直接回答这么些)

9)数据库中 Where、group by、having 关键字:

答: 关键字功能:

  1. where 子句用来筛选 from 子句中指定的操作所爆发的的行;
  2. group by 子句用来分组 where 子句的出口;
  3. having 子句用来从分组的结果中筛选行;

having 和 where 的区别:

  1. 语法类似,where 搜索条件在举行分组操作从前运用;having
    搜索条件在进展分组操作之后拔取;
  2. having 可以分包聚合函数 sum、avg、max 等;
  3. having 子句限制的是组,而不是行。

当同时涵盖 where 子句、group by 子句 、having
子句及聚集函数时,执行各样如下:

  1. 执行 where 子句查找符合条件的多少;
  2. 行使 group by 子句对数据举办分组;对 group by
    子句形成的组运行聚集函数总括每一组的值;最终用 having
    子句去掉不符合条件的组。

10)还有一部分题材,如 MySQL 和 SQL Server 用法上的界别、limit
关键字的选取等题材。

小结:数据库方面依然业务机制、隔离级别相比重要,当然了数据库索引是必考的题材。偶尔也会给你多少个表,让你现场写
SQL 语句,首要考察 group by 和 having 等重要字。

(八)MVC 框架相关知识点

自己在品种中利用的框架有 Spring MVC 和
MyBatis,所以在简历上只写了那两种框架,面试官重要针对这三种框架举行咨询。以下问题供小伙伴们参考。

JavaWeb 开发经典的 3 层框架:Web 层、瑟维斯(Service) 层(业务逻辑层)和 Dao
层(数据访问层)

  • Web 层:包含 JSP 和 Servlet 等与 Web 相关的始末;
  • 业务层:只关心业务逻辑;
  • 数据层:封装了对数据库的拜访细节。

Spring 知识点

1)Spring 的 IOC 和 AOP 有打探吗?

答:

  • IOC:控制反转,(解耦合)将对象间的倚重性关系交给 Spring
    容器,使用安排文件来成立所依靠的靶子,由主动创立对象改为了被动形式;
  • AOP:面向切面编程,将功效代码从工作逻辑代码中分离出来。

2)AOP 的落实格局有哪二种?咋样采取?(必考)

答:JDK 动态代理实现和 cglib 实现。

选择:

  1. 如若目的对象实现了接口,默认情状下会利用 JDK 的动态代理实现
    AOP,也得以强制行使 cglib 实现 AOP;
  2. 比方目标对象没有落实接口,必须拔取 cglib 库,Spring 会自动在 JDK
    动态代理和 cglib 之间变换。

恢宏:JDK 动态代理如何促成?(加分点)

答:JDK
动态代理,只可以对促成了接口的类生成代理,而不是针对类,该对象项目实现的接口都将被代理。原理是透过在运行期间创立一个接口的落实类来形成对目的对象的代办。

  1. 概念一个贯彻接口 InvocationHandler 的类;
  2. 通过构造函数,注入被代理类;
  3. 实现 invoke( Object proxy, Method method, Object[] args)方法;
  4. 在主函数中赢得被代理类的类加载器;
  5. 利用 Proxy.newProxyInstance( ) 暴发一个代理对象;
  6. 通过代办对象调用各个模式。

解析:关于 IOC 和 AOP 的详细演讲,请各位参阅我的博客:Spring 主题AOP(面向切面编程)总计,Spring 框架学习—控制反转(IOC)

3)Spring MVC 的核心控制器是何许?信息处理流程有什么?

答:要旨控制器为 DispatcherServlet。音讯流程如下:

图片 6

4)其他题材包括:重定向和转账的界别、动态代理和静态代理的区分等。

Mybatis 知识点

关于 MyBatis 首要考察占位符#和 $ 的区别,区别如下:

  1. 标记将盛传的数据都当做一个字符串,会对机动传入的数量加一个双引号;
  2. $ 符号将盛传的数额直接体现生成 SQL 中;
  3. 标志存在预编译的经过,,对问号赋值,制止 SQL 注入;
  4. $ 符号是直译的不二法门,一般用在 order by ${列名}语句中;
  5. 能用#号就绝不用 $ 符号。

总计:限于作者水平,MVC
框架方面了解不是太多,实战能力不足。面试官偶尔问框架底层实现原理等都知之甚少,有能力的伴儿可以多加学习。

(九)大数额相关知识点

大数额相关是因为我的简历上写了 KafKa 相关项目,所以面试官会举办提问
KafKa
相关知识点,我也进展了有些简约概念总计,深层次的实现原理因为并从未专门多的实战经验,所以并不明白。

以下概念总括供小伙伴参考。

1)KafKa 基本特点:

答:急速持久化、协助批量读写音信、帮忙信息分区,提升了产出能力、帮助在线增添分区、协助为各种分区创设四个副本。

扩充:为何可以兑现神速持久化?

答:KafKa
将音讯保存在磁盘中,并且读写磁盘的法子是逐一读写,制止了任性读写磁盘(寻道时间过长)导致的特性瓶颈;磁盘的顺序读写速度超越内存随机读写。

2)焦点概念:

答:

  • 劳动者(Producer): 生产音信,并且遵照一定的规则推送到 Topic
    的分区中。
  • 买主(Consumer): 从 Topic 中拉去消息,并且展开消费。
  • 主旨(Topic): 用于储存音讯的逻辑概念,是一个信息集合。
  • 分区(partition):
  1. 每个 Topic 可以分开为六个分区,每个信息在分区中都会有一个唯一编号
    offset
  2. kafka 通过 offset 保证信息在分区中的顺序
  3. 同一 Topic 的不比分区可以分配在不同的 Broker 上
  4. partition 以文件的款式储存在文件系统中。

副本(replica):

  1. KafKa
    对信息举行了冗余备份,每个分区有多少个副本,每个副本中蕴藏的音信是
    “一样” 的。
  2. 各种副本中都会选举出一个 Leader 副本,此外为 Follower 副本,Follower
    副本仅仅将数据从 Leader 副本拉去到地点,然后一并到自己的 Log 中。

消费者组(Consumer Group): 每个 consumer 都属于一个 consumer
group,每条信息只可以被 consumer group 中的一个 Consumer
消费,但足以被六个 consumer group 消费。

Broker:

  1. 一个独立的 server 就是一个 Broker;
  2. 着重办事:接收生产者发过来的新闻,分配 offset,并且保留到磁盘中;

Cluster&Controller:

  1. 四个 Broker 可以组成一个 Cluster,每个集群选举一个 Broker 来作为
    Controller,充当指挥为主
  2. Controller 负责管理分区的意况,管理每个分区的副本状态,监听
    ZooKeeper 中数量的生成等工作

保存策略和日志压缩:

  1. 任凭消费者是否早已花费了信息,KafKa
    都会一向保留这么些信息(持久化到磁盘);
  2. 因而保留策略,定时删除陈旧的音讯;
  3. 日记压缩,只保留最新的 Key-Value 对。

至于副本机制:(加分点)

ISR 集合 :表示近来 “可用” 且信息量与 Leader
相差不多的副本集合。满足条件如下:

  1. 副本所在节点必须维持着与 ZooKeeper 的连年;
  2. 副本最后一条音讯的 offset 与 Leader 副本的结尾一条音讯的 offset
    之间的差值不可能跨越指定的阈值。

HW&LEO:

  1. HW 标记了一个破例的 offset,当顾客处理音信的时候,只可以拉取到 HW
    往日的信息;
  2. HW 也是由 Leader 副本管理的;
  3. LEO(Log End Offset)是有着副本都会有的一个 offset 标记。

ISR、HW 和 LEO 的做事配合:

  1. producer 向此分区中推送消息;
  2. Leader 副本将音讯追加到 Log 中,并且递增其 LEO;
  3. Follower 副本从 Leader 副本中拉撤信息举行协同;
  4. Follower 副本将信息更新到地点 Log 中,并且递增其 LEO;
  5. 当 ISR 集合中的所有副本都完成了对 offset 的音讯同步,Leader
    副本会递增其 HW

KafKa 的容灾机制: 通过分区的副本 Leader 副本和 Follower
副本来提升容灾能力。

小结:请小伙伴依照自己的简历自动准备攻读大数额相关知识点。

(十)Linux 常见命令

笔者对这一面不是很精晓,知识点来源于网络总括以及面试官的咨询,仅供小伙伴参考。

1)grep、sed 以及 awk 命令

解析:awk 命令如果可以了解,是面试中的一个 加分点。

2)文件和目录:

pwd 显示当前目录

ls 展现当前目录下的文书和目录:

  1. ls -F 可以区分文件和目录;
  2. ls -a 可以把潜伏文件和一般文书一起显示出来;
  3. ls -R 可以递归显示子目录中的文件和目录;
  4. ls -l 展现长列表;
  5. ls -l test 过滤器,查看某个特定文件音信。可以只查看 test
    文件的音讯。

3)处理文件上边的授命有:touch、cp、 In、mv、rm、

4)处理目录方面的下令:mkdir

5)查看文件内容:file、cat、more、less、tail、head

6)监测程序命令:ps、top

eg. 找出过程名中包括 java 的有所进程:ps -ef | grep java

top 命令 实时监测进程

top 命令输出的首先部分:展现系统的不外乎。

  1. 首先行显示了当下光阴、系统的运作时刻、登录的用户数和体系的平分负载(平均负载有
    3 个值:近期 1min 5min 15min);
  2. 第二行展现了经过的将官信息,有稍许进程处于运行、休眠、截止或者僵化状态;
  3. 其三行是 CPU 的大概信息;
  4. 第四行是系统内存的情景。

7)ps 和 top 命令的区分:

  1. ps 看到的是命令执行瞬间的进程信息 , 而 top 可以不停的监视;
  2. ps 只是查看过程 , 而 top 还足以监视系统性能 , 如平均负载 ,cpu
    和内存的损耗;
  3. 除此以外 top 还足以操作过程 , 如改变优先级 (命令 r) 和关闭进程 (命令
    k);
  4. ps 紧即使查看过程的,关注点在于查看需要查阅的历程;
  5. top 首要看 cpu,
    内存使用情形,及占用资源最多的长河由高到低排序,关注点在于资源占用情况。

8) 压缩数量

  1. tar -xvf 文件名;
  2. tar -zxvf 文件名;
  3. tar -cvzf 文件名。

9)截至进程:kill PID 或者 kill all

至此,从十个例外的地点讲演了 Java
开发面试岗位中所涉及到的重点知识点。加上我上次发表的 关于算法面试的
chat,我大体将多年来一年的日子内的面试笔试经验给我们做了总计分享。

接下去,为了给我们提供更多的相助,我想针对简历方面和豪门拉家常,重要概括:
制作简历和投递简历两地点。

打造简历:

首先,我想先介绍下自家的简历都囊括什么样部分:

  1. 个人音信
  2. 有教无类背景
  3. 村办亮点
  4. 见习项目
  5. 校内项目
  6. 奖励、语言及 IT 能力
  7. 个体综述

简历应该特出显现和谐优良的地点,所以我将民用技术博客和 github
地址放到了相对靠前的地方,使面试官或者 HR 可以一眼看出。

各位小伙伴假使在校期间出席过怎么样大型比赛并且获奖,也得以写在显眼的职务。

给我们一个小指示,这就是必须对简历上所写的知识点有一定明白,不懂的就绝不写上去了,因为你会被问的很惨(尽管一面面试官不问,三面面试官也会问的)。

譬如说你在简历上写了一个技术 A,说自己在项目中应用过技术
A,那么面试官就会问该技术 A 的最底层实现、原理等等。

万一你回复出来,确实,这是加分项,可是洋洋时候大家是回复不出去的。

投递简历

投递简历同样很关键,对于并不是出身名校的同伴来说,在递送一些互联网公司的时候,可能相会临着简历被刷的可能。这时候内推的主要就反映出来了。

内推是内部推荐的意味, 内推的裨益一般有三种:

  1. 内推免简历筛选,直接进入笔试环节;
  2. 内推可以直接得到面试资格,面试失利可以持续参预继续校招大流程。

内推时间点:

  1. 暑期实习学校招聘的内推一般从每年 3 月份始发;
  2. 秋招的内推从历年 8 月份初叶,持续到二月份。

怎么内推?

内推,意味着你要找到商店内部人员举行推荐,内推渠道重点是找自己的师兄师姐。此外可以日常关注号称
“全国最大的高校论坛”- 北邮人论坛 。

北邮人论坛资源非常充足,每年招聘季的内推帖子数不胜数,各位假如有需要,可以关心一下。在牛客网以及赛码网的商量区内也设有着大量的内推新闻,我们可以关心。

结束语

这是一篇很长的稿子,然则,再长的著作也道不尽我这一年中面试笔试的有所经历。找工作是一场持久战,坚韧不拔到最终的才是胜利者。

对于各位志在置身 Java
开发岗位的伴儿们来说,本文所涉嫌的知识点相对是面试中的重点,希望各位可以使得控制。

(限于作者水平,文中如有错误之处,烦请各位提议,我们一道前进。)

本身有一个微信公众号,平时会分享部分Java技术相关的干货。尽管您欣赏我的享受,可以用微信搜索“Java少校”或者“javatuanzhang”关注。

网站地图xml地图