语言基础
    堆/栈区别
    - 栈是系统编译器启动管理,不需要程序员手动管理
    - 堆的释放由程序员手动管理,不及时回收容易产生内存泄露


    - 栈有两种分配方式:静态分配和动态分配
    - 堆是动态分配和回收内存的,没有静态分配的堆


    - 栈是向低地址扩展的数据结构,是一块连续的内存区域
    - 堆是向高地址扩展的数据结构,是不连续的内存区域
    多态与重载的区别 多态也叫polymorphism,

    它是指某一抽象的类可以有多种实装类的结构.
    重载OVERLOADING则是另外一种关系啦, 它是指类在不断细分的过程中(所谓继承关系), 子类对父类的方法可以改造的关系, | | | Java基础几大特点,多态,抽象。抽象是怎么一回事,为了解决什么问题 | 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
    抽象类不能实例化对象
    ** | | | Object类有哪些方法? | toString()、notify()、notifyAll()、wait()、hashCode()、equals()。 | | | final/finally/finalize的区别 | final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
    finally是异常处理语句结构的一部分,表示总是执行.
    finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等 | | | HashMap和HashTable的区别
    哪个线程安全? | HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
    Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
    HashMap非线程安全 HashTable是线程安全的 如果要HashMap线程安全 自己手动加上synchronization实现同步 | | | sleep()和wait()的区别 | sleep()方法正在执行的线程主动让出CPU
    wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行 | | | 什么是序列化?序列化的作用? | 序列化和反序列化用于将一个对象保存到文件,和从文件读取
    简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。 | | | 一个序列化的类,如果增加了一个字段,而反序列化一端没有增加这个字段,会产生什么样的后果? | | | | JDK1.5提供了哪些新特性? | 泛型、注解、for…each…循环、AutoBoxing、可变长度的参数、System.printf()方法、静态import | | 数据结构 | | | | | 什么情况下比较适合使用数组,什么情况下比较适合使用链表 | 访问操作多的时候使用数组比较合适,插入删除操作比较多的时候比较适合使用链表 | | | 有向图/无向图的区别 | 每条边都是有方向的
    每条边都是没有方向的 | | | 如何计算一个满二叉树的叶子节点数量?如何计算一个满二叉树的节点数量? | | | | 什么是平衡二叉树?如何调整一个二叉树为一个平衡二叉树? | | | SQL | | | | | 请说明一下DISTINCT有什么作用? | 关键词 DISTINCT 用于返回唯一不同的值 | | | GROUP BY语句有什么作用? | | | | 简述having语句就和where语句的功能区别? | having必须跟分组函数。而where无限制。
    sql语句的Group by 后只能跟Having条件语句 | | 基础算法 | | | | | 请简述堆排序的步骤 | 步骤一 构造初始堆。将给定无序序列构造成一个大顶堆

    步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换 | | | 希尔排序、归并排序 | | | | 象棋中将和帅是不能对面的,假设现在棋盘上只有将和帅2个棋子,在只允许开辟一个变量的情况下,输出将和帅在棋盘上所有允许出现的情况。 | 开辟一个变量,这个变量分字节用,一个字节还能有8位 | | | 有2个数组,请使用一次循环找出这2个数组中甲数组有乙数组没的,甲数组没的乙数组有的和甲乙数组都有的数据。 | 先对2个数组进行排序,然后找2个指针分别指向两个数组的头部,然后将数组中的两个数据进行比较,若甲数组值和乙数组值相等,则说明甲乙数组中都有,指针同时都往后移一个,如果甲数组值大于乙数组值,则说明乙有甲没有,指向乙数组的指针往后移一个,然后继续比较,如果甲数组值比乙数组值小,则说明甲数组有乙数组没。以此类推,2个指针都到达数组尾部的时候,比较结束。 | | 操作系统 | | | | | ACID | ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。 | | | 线程/进程的区别 | 线程是指进程内的一个执行单元,也是进程内的可调度实体.
    与进程的区别:
    (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
    (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
    (3)线程是处理器调度的基本单位,但进程不是. | | Linux命令 | 你常用的三个linux 命令 | 临场发挥 | | | 有一个文本文件,请使用一条Linux命令统计这个文件中某个单词出现的次数。 | grep -c $$$ | | 网络基础 | | | | | OSI七层模型 | image.png | | | TCP/UDP区别,哪个安全 | TCP提供的是面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
    简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性一般 | | | 信号驱动IO/多路复用IO的区别 | select()你必须阻塞知道事件发生,而信号驱动I/O不用,你可以干你的事,等事件发生了通知你 | | | HTTP协议与SMTP协议有哪些区别 | HTTP协议用在网页。POP3和SMTP用在邮件收发 |


    Core Java
    问题领域 问题 参考答案
    异常处理 Catched

    Exception/RuntimeException的区别 | 前者是代码中可捕获的预期的异常,后者是不可预期的运行时异常,比如OutOfMemoryException、NullPointException | | | try代码块中有return的话finally代码块中还会执行吗? | 会执行 | | Object类 | Object类有哪些方法? | toString()、notify()、notifyAll()、wait()、hashCode()、equals()。 | | | hashCode()方法的原始实现是怎么做的? | 答到根据对象所存储内存地址计算即可。 | |   | 重写了equals()后还需要重写什么方法?为什么? | 还需要重写hashCode()方法。因为在往HashSet这样的类中add元素的时候,如果不重写hashCode()方法,会导致两个对象equals()比较时返回为true时,两个对象都能被add进去,而事实上HashSet是不能add两个相同的对象的。 | | 面向对象 | abstract class和interface的区别 | | | | 重写(overwrite)、重载(overload)和覆盖(override)三者之间的区别 | 重载:子类继承了父类的同名有参函数。当子类继承了父类的一个同名方法,且方法参数不同,称为重载。通过方法的重载,子类可以重新实现父类的某些方法,使其具有自己的特征。

    重写:当前类的同名方法。通过方法的重写,一个类可以有多个具有相同名字的方法,由传递给它们不同的个数和类型的参数来决定使用哪种方法。因此,重写的名称是当前类中的同名函数,不是父类中的函数名。

    覆盖:子类继承了父类的同名无参函数。当子类从父类继承了一个无参函数,而又定义了一个同样的无参函数,则子类定义的方法覆盖父类的方法,称为覆盖。 | | | final/finally/finalize的区别 | final:
    用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(String、StrngBuilder、StringBuffer、Math,不可变类),其中所有的方法都不能被重写,所有不能同时用abstract和final修饰(abstract修饰的是抽象类,抽象类是用于被子类继承的,和final起相反的作用);final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象中的内容是允许改变的。

    finally:
    finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,可以放在finally块中。

    finalize:
    finalize是方法名,java技术允许使用finalize()方法在垃圾收集器将对象从内存中清楚出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。 | | | 简述public、protected、private和不加修饰符的访问权限 | | | IO/NIO | | | | 容器类 | ArrayList和LinkedList的区别 | | | | Array和Arrays的区别 | | | | List和Vector的区别 | | | | List和Set的区别 | | | | ArrayList的实现原理 | | | | HashMap和HashTable的区别 | | | | HashMap是如何处理Hash碰撞的 | | | | HashMap的实现原理 | | | 多线程 | 实现多线程有哪几种方法? | | | | 启动一个线程是使用start()方法还是run()方法? | | | | sleep()和wait()的区别 | | |   | notify()和notifyAll()的区别 | notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
    notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。 | | | 一个类中有2个同步方法,两个不同的线程是否可以并发的分别访问这个类的同一个实例的这2个不同的同步方法? | 不可以,因为当一个线程进入其中一个同步方法的时候它就获得了这个对象的锁,另个线程尽管是访问这个对象的另一个同步方法,但它也必须等待这个对象的对象锁释放后才能访问。 | | | 一个主线程开启10个子线程,10个子线程执行完毕后主线程继续,如何实现这样一个线程同步? | | | | ThreadLocal的作用 | | | | volatile关键字的意义和使用场景 | | | 序列化 | 什么是序列化?序列化的作用? | | |   | 一个序列化的类,如果增加了一个字段,而反序列化一端没有增加这个字段,会产生什么样的后果? |   | | 反射 | | | | 新特性 | JDK1.5提供了哪些新特性? | 泛型、注解、for…each…循环、AutoBoxing、可变长度的参数、System.printf()方法、静态import | | | List和List<?>的区别 | | | | ExecutorService | | | | Executors | | | | Semaphore | | | | CountDownLatch | | | | BlockingQueue | | | | ReentrantLock | | | 框架 | | | | 问题领域 | 问题 | 答案 | | Spring | Spring IoC的实现原理 |   | | | Spring的AOP实现原理 | | | | 什么时候使用cglib,什么时候使用动态代理 | | |   | 动态代理会使用到Java中的哪几个核心类 |   | | | bean的配置文件中,配置的bean默认是单例还是多例的 | | | | 如何在bean的配置文件中把配置的对象修改为多例的 | | | | Spring中的声明式事务,如TRANSACTION_REQUIRED是什么意思? | | | | Spring事务隔离级别 | | | Struts | | | | Hibernate | | | | iBatis | #和$的区别 | | | | 如何调用一个存储过程 | | | JVM | | | | 问题领域 | 问题 | 答案 | | ClassLoader | 如果我自己写个包叫java.lang,在里面自己写了个类叫String,在类加载的时候是加载我自己写的java.lang.String,还是JDK提供的java.lang.String?为什么? | | |   | ClasssLoader的类加载顺序? |   | | Java内存模型 | 堆/栈的区别 | | |   | 如何调整堆大小 |   | | | Xmx参数和PermSize参数的区别 | | | 垃圾收集算法 | 请简述一下分代垃圾收集法?为什么要进行分代收集 | 在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。因此,分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收 | |   | 什么情况下会触发Full GC |   | | | 年轻代的Eden区和Survivor区的区别 | | |   | 年轻代默认使用什么样的垃圾收集器 |   | |   | 使用什么办法可以减少Full GC时应用暂停的时间 |   | | | 简述串行收集器/并行收集器/并发收集器的区别 | | | | CMS垃圾收集法 | | | Java EE | | | | 问题领域 | 问题 | 答案 | | MVC框架结构 | | | | Web前端编程 | post和get的区别 | | | | forward和sendRedirect的区别 | | | | javascript中如何实现面向对象编程 | | | | 一个HTTP请求的请求头包含哪些内容 | | | | HTTP请求返回200,404,500的话分别是什么意思 | | | jQuery | | | | WebService和SOA | | | | JMS | Topic和Queue的区别 | | | | 消息路由 | | | 编码 | ASCII、GBK、GB2312、UTF-8、UTF-16等等 | | | 设计模式 | | | | 问题领域 | 问题 | 答案 | | 总述 | 面向对象编程的原则有哪些? | 单一职责原则、里氏替换原则、迪米特原则、依赖倒转原则、接口隔离原则、开闭原则 | |   | 开闭原则是什么意思? | 对扩展开放,对修改封闭(如何避免if else) | | | 迪米特法则是什么意思? | 当两个类没有直接关系的时候,不应该彼此之间直接访问,而应该通过第三方代理类来访问。 | | | 设计模式分为哪几类?各举几个例子 | 分为创建型模式和结构性模式两类。比如工厂和单例模式属于创建型模式;桥接、适配器模式属于结构型模式 | | 设计模式 | 简单工厂、工厂方法和抽象工厂的区别和应用场景 |   | | | 编写一个单例模式的类需要注意哪几点 | 类声明为final的,构造器声明为private的,拥有一个static的类成员变量,同步的getInstance方法,尽量采用懒汉模式 | | | 举例代理模式,或者观察者模式的应用场景 | | | | 代理模式和适配器模式的区别 | | | | 策略模式和状态模式的区别 | | | | 有一个公园,只允许100人同时参观,当达到100人时不允许进人,然后每出来一人进去一人。你采用什么模式来设计售票处和门禁的关系? | 典型的观察者模式的应用,门禁负责统计公园人数和人员进出,满员通知售票处停止售票,每出来一人通知售票处售票一张。 | | | 设计一个手机应用超市,一个手机应用需要支持IOS,Android,Sybiam系统;然后每个不同的手机系统的应用可自由扩展。 | 策略模式和桥接模式结合使用 | | | 设计一个报销审批系统,员工差旅报销,主管审批完毕后经理审批,然后财务审批后才能生效,请设计这样一个审批流程。 | 职责链模式的典型应用 | | 数据结构 | | | | 问题领域 | 问题 | 答案 | | 数组和链表 | 什么情况下比较适合使用数组,什么情况下比较适合使用链表 | 访问操作多的时候使用数组比较合适,插入删除操作比较多的时候比较适合使用链表 | | 树 | 如何计算一个满二叉树的叶子节点数量?如何计算一个满二叉树的节点数量? |   | |   | 什么是平衡二叉树?如何调整一个二叉树为一个平衡二叉树? |   | | | 什么是B+树,其主要应用场景有哪些? | | | 图 | 常见的图的存储结构有哪几种? | 邻接链表,稀疏矩阵 | | | 有向图与无向图的区别? | | | | 图的最小生成树? | | | | 如何计算有向图中一个节点的出度和入度? | | | 算法 | | | | 问题领域 | 问题 | 答案 | | 时间复杂度 | 有2个数组,请使用一次循环找出这2个数组中甲数组有乙数组没的,甲数组没的乙数组有的和甲乙数组都有的数据。 | 先对2个数组进行排序,然后找2个指针分别指向两个数组的头部,然后将数组中的两个数据进行比较,若甲数组值和乙数组值相等,则说明甲乙数组中都有,指针同时都往后移一个,如果甲数组值大于乙数组值,则说明乙有甲没有,指向乙数组的指针往后移一个,然后继续比较,如果甲数组值比乙数组值小,则说明甲数组有乙数组没。以此类推,2个指针都到达数组尾部的时候,比较结束。 | | | 基于比较的排序算法中,时间复杂度最佳是多少?快速排序和归并排序的时间复杂度分别是多少?既然快速排序的O(n^2)>归并排序的O(nlogn),那么为什么在实际应用中,快排的表现经常优于归并排序?存在复杂度为O(n)的排序算法吗? | 1、O(nlogn)
    2、快排O(n^2),归并O(nlogn)
    3、inplace、cache性能好
    4、存在,非比较性排序,如counting sort、radix sort | | 空间复杂度 | 象棋中将和帅是不能对面的,假设现在棋盘上只有将和帅2个棋子,在只允许开辟一个变量的情况下,输出将和帅在棋盘上所有允许出现的情况。 | 开辟一个变量,这个变量分字节用,一个字节还能有8位 | | 算法 | 请简述堆排序的步骤 |   | | | 给定2个字符串,一个叫母串,一个叫子串,判断是否可以通过若干次循环右移的手段来包含子串。循环右移:将字符串最左边的字符移到最右边。举例:ABCDE是母串,EA是子串,针对这个例子上述回答是肯定的,因为只要将ABCDE循环右移一次得到BCDEA即包含子串EA。 | 将母串连写2遍,判断新母串是否包含子串即可。 | | | 百元百鸡问题 | | | | 有一个容量为V的箱子,若干个容量为v1,v2,v3…vn的物品,请编程实现恰好能装满容量为V的箱子的物品及其数量。 | 动态规划法 | | | 象棋中马是只能走日字格的,请编程输出马从棋盘左下角走到右上角的最短路线。 | | | | 有4个人晚上走到了桥边,这座桥只能同时允许2个人通过,但他们只有一个电筒,甲过这座桥要10分钟,乙过这座桥要5分钟,丙过这座桥要2分钟,而丁只要1分钟即可过桥。请问四个人全部都过桥的话最短需要几分钟,怎么操作? | | | 操作系统 | | | | 问题领域 | 问题 | 答案 | | 操作系统 | | | | Linux命令 | 有一个文本文件,请使用一条Linux命令统计这个文件中某个单词出现的次数 |   | | 网络 | | | | 问题领域 | 问题 | 答案 | | 网络 | 网络的拓扑结构,不同拓扑结构的优缺点 | | | | 网络的七层模型 | | | | TCP/IP协议在哪一层 | | | | TCP协议和UDP协议的区别 | | | 数据库 | | | | 问题领域 | 问题 | 答案 | | 理论 | 二范式的标准是什么 | | | | BC范式和三范式的区别 | | | | 一所大学有若干个系,每个系有很多个老师,一个老师可以在多个系任职,每个系有很多学生,每个学生会修若干门课,在不同系中有可能会开设相同的课。请绘制出这样一个场景的ER图 | 主要是看面试的人是否规范化的表达ER图中实体的主键和字段,以及一对多,多对多这种关系表的表达方式。矩形表示实体表,棱形表示关系表,椭圆表示字段,主键字段下加下划线 | | Oracle | 有一张表,这个表的字段有学号、学生姓名、语文、数学、英语、物理、化学、生物8个字段。请使用一条SQL语句找出这6门课考第一的同学(要给出姓名和成绩) | partition by | | 事务处理 | 事务的传递属性 | | | | 分布式事务的两段式提交 | | | 性能优化 | 就开发的角度来看,数据库性能优化的手段有哪些?
    什么时候使用组合索引? | 1、字段冗余
    2、在常查询的字段上加上索引
    3、表分区
    4、SQL调优 | | | 表分区一般有哪两种手段?各有什么优缺点? | 横向分区和纵向分区 | |   | SQL调优的手段有哪些? | 用>=替换>,用>or<替换<>,用exists替换in,避免在有索引的字段上使用函数,明确的filter条件尽可能的写在where子句的后面,使用join替换子查询,避免使用Select ,不能使用NULL作为索引,尽可能避免全模糊查询,使用truncat代替delete删除全表,使用count()代替count(1),使用exists代替distinct,使用where子句替换having子句等等。答出来3,4个就可以了。 | | 杂项 | | | | 问题领域 | 问题 | 答案 | | | ACID | | ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。 | | —- |

    | | | OSI七层模型 | | |   | 为什么更新缓存,我们一般都用delete,而不是用update。
    为什么有人在特定场景下用delete?为什么有人在特定场景下用update?
    update/delete可能会造成什么影响? |   | |   | Hadoop对大数据量排序的步骤 | 由此我们可以归纳出这样一个用hadoop对大量数据排序的步骤:
    1) 对待排序数据进行抽样;
    2) 对抽样数据进行排序,产生标尺;
    3) Map对输入的每条数据计算其处于哪两个标尺之间;将数据发给对应区间ID的reduce
    4) Reduce将获得数据直接输出。 | |   | 乐观锁悲观锁 | 悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库
    性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
    乐观锁机制避免了长事务中的数据库加锁开销,大大提升了大并发量下的系统整体性能表现。

    需要注意的是,乐观锁机制往往基于系统中的数据存储逻辑,因此也具备一定的局限性,如在上例中,由于乐观锁机制是在我们的系统中实现,来自外部系统的用户余额更新操作不受我们系统的控制,因此可能会造成脏数据被更新到数据库中。在系统设计阶段,我们应该充分考虑到这些情况出现的可能性,并进行相应调整(如将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途径,而不是将数据库表直接对外公开)。

    各种乐观锁的实现中通常都会用版本戳version来对记录或对象标记,避免并发操作带来的问题,在Java中,AtomicStampedReference也实现了这个作用,它通过包装[E,Integer]的元组来对对象标记版本戳stamp,从而避免ABA问题 | |   | 如何合理的配置java线程池?如CPU密集型的任务,基本线程池应该配置多大?IO密集型的任务,基本线程池应该配置多大?用有界队列好还是无界队列好?任务非常多的时候,使用什么阻塞队列能获取最好的吞吐量? |   | |   | 什么叫线程安全?servlet是线程安全吗? | 不是线程安全的,因为它采用多线程方式运行其service方法.也就是说,当多个用户并发访问的时候,可能存在线程交互的问题. |