The Interview Experience

一. JAVA基础

1. 9种基本数据类型及其封装类,所占大小

类型 包装类 大小(字节)
byte Byte 1
char Character 2
short Short 2
int Integer 4
float Float 4
double Double 8
long Long 8
boolean Boolean -
void Void -

2. Object类方法

  • getClass() 获取类对象Class (native)
  • hashCode() 获取hashCode值(native)
  • equals(Object) 判断是否同一对象
  • clone() 对象克隆(native)
  • wait()
  • wait(timeout)
  • wait(timeout, nanos)
  • notify()
  • notifyAll()
  • toString()
  • finalize() (protected)

3. equals 、hashCode、== 比较

  • equals是Object类方法,内部实现的是判断对象是否相等(即 ==)。
  • hashCode是Object的native方法,返回的是类似表示对象地址的整数。
  • ==是判断2个对象是否相同。
  • 如果2个对象相同则hashCode一定相等,若2个对象不同hashCode不一定相等。
  • 一般地重写了equals方法建议也要重写hashCode方法。

4. 面向对象的特性与含义

  • 抽象 是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不
    关注这些行为的细节是什么。
  • 封装 是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布
    给其它对象,private、protected、public三种修饰符或不用(即默认default)对外部对象访问该对象的属性和行为进行限制。
  • 继承 是子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。
  • 多态 是指父对象中的同一个行为能在其多个子对象中有不同的表现。也就是说子对象可以使用重写父对象中的行为,使其拥有不同于
    父对象和其它子对象的表现,这就是overriding(重写)。实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判
    断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

5. Override与Overload

  • Override是重写:方法名称、参数个数,类型,顺序,返回值类型都是必须和父类方法一致的。它的关系是父子关系。
  • Overload是重载:方法名称不变,方法参数个数、类型、顺序至少一个不同。它的关系是同一个类,同一个方法名。

6. wait与sleep

  • wait是Object类的方法;而sleep是Thread类的静态方法。
  • 当线程执行到wait方法时,他就会进入到该对象相关的等待池中,同时释放对象的机锁,其他线程可访问,直到超时或该对象调用notify
    或notifyAll;而当线程执行sleep方法时,线程进入阻塞状态,让出CPU资源,但在Synchronized同步块中不能释放对象的锁。
  • wait方法必须放在synchronized代码块中,否则会在时抛出java.lang.IllegalMonitorStateException异常。
  • wait和sleep都可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException(但不建议使用该方法)。

7. java并发

Java并发编程

8. interface与abstract类

  • 抽象类是包含有抽象方法的类(也可以拥有成员变量和普通成员方法),抽象方法是只有方法声明没有具体实现的方法,所以抽象类不能实例化,是为
    了继承而存的,抽象类与普通类有3点区别:
    • 1.抽象方法必须是public或protected,缺损情况下默认为public;
    • 2.抽象类不能被实例化;
    • 3.如果一个类继承了抽象类,则子类必须实现父类的抽象方法,若没有实现父类抽象方法,则子类也必须定义为抽象类。
  • 接口是泛指供别人调用的方法或函数,接口中可以有变量和方法,变量被隐式地指定为public static final,方法被隐式地指定为
    public abstract,接口中的方法不能有具体的实现(JDK8之后接口可以有default方法)。
  • 接口与抽象类比较:
    • 1.语法层面上:
      • 1).抽象类可以提供成员方法的实现细节而接口中只能存在public abstract方法
      • 2).抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final类型
      • 3).接口中不能存在静态代码块和静态方法,而抽象类中可以
      • 4).一个类只能继承一个抽象类而可以实现多个接口
    • 2.设计层面上:
      • 1).抽象类是对一种事物对象的抽象,而接口是对事物行为的抽象,抽象类是对整个类整体的抽象,包括属性、行为,而接口是对类的局部
        (行为)的抽象。继承抽象类是”是不是”的关系,实现接口是”有没有”的关系。
      • 2).设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计,而接口是一种行为规范,它是一种辐射式设计

9. fail-fast

  • fail-fast:机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
    例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出异常:
    ConcurrentModificationException,产生fail-fast事件。

10. JDK和CGLIB动态代理

  • JDK动态代理只能针对实现了接口的类生成代理(实例化一个类)。此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,
    具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。
  • CGLIB是针对类实现代理,主要是对指定的类生成一个子类(没有实例化一个类),覆盖其中的方法。

JVM

1. 内存模型

  • 堆内存(Heap) 是线程间共享内存,主要存放java的对象及数组
  • 栈内存(Stack) 是线程间不共享的,主要存放基本数据类型和对象及数组的引用等
  • 方法区(Method Area) 是存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据
  • 本地方法栈(Native Method Stack) 为虚拟机调用本地Native方法提供服务,有的虚拟机与虚拟机栈合二为一
  • 程序计数器(Program Counter Register) 是当前虚拟机执行指令的地址,当执行到Native方法时其值为空(Undefined)
  • 运行时常量池(Runtime Constant Pool) 用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放
  • 直接内存(Direct Memory) NIO的DirectByteBuffer对象使用直接内存,这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据

2. GC的2种判定方法

  • 引用计数: 实现简单、高效,但会出现循环引用的时候对象将无法得到回收
  • 引用链:即可达性分析,以GC Roots为根节点开始向下搜索,所走的路径叫做引用链(Reference Chain),当一个对象到GC Roots对象没有
    任何引用链时说明该对象不可用,可作为GC Roots的对象:
    • 1.虚拟机栈(栈帧中的本地变量表)中引用的对象。
    • 2.方法区中的类静态属性引用的对象或者常量引用的对象。
    • 3.本地方法栈中JNI(就是native方法)引用的对象。

3. java自动内存管理

Java自动内存管理

其他

1. OSI网络模型

层级 名称 描述
1 应用层 指网络操作系统和具体的应用程序,对应WWW服务器、FTP服务器等应用软件
2 表示层 数据语法的转换、数据的传送等
3 会话层 建立起两端之间的会话关系,并负责数据的传送
4 传输层 负责错误的检查与修复,以确保传送的质量,是TCP/UDP工作的地方。(报文)
5 网络层 提供了编址方案,IP协议工作的地方(数据包)
6 数据链路层 将由物理层传来的未经处理的位数据包装成数据帧
7 物理层 对应网线、网卡、接口等物理设备(位)

2. TCP/IP协议

  • 应用层
  • 传输层
  • 网络层
  • 链路层

3. IP分类

  • A类地址(1.0.0.0-126.255.255.255)用于最大型的网络,该网络的节点数可达16,777,216个。
  • B类地址(128.0.0.0-191.255.255.255)用于中型网络,节点数可达65,536个。
  • C类地址(192.0.0.0-223.255.255.255)用于256个节点以下的小型网络的单点网络通信。
  • D类地址(224.0.0.0-239.255.255.255)并不反映网络的大小,只是用于组播,用来指定所分配的接收组播的节点组,这个节点组由组播订
    阅成员组成。D类地址的范围为
  • E类(240.0.0.0-255.255.255.254)地址用于试验。

4. TCP与UDP

  • TCP、UDP都是传输层协议
  • TCP(Transmission Control Protocol, 传输控制协议) 是面向连接的协议(即在收发数据前必须和对方建立可靠连接),TCP建立连接要3次
    握手,TCP断开连接需要4次挥手,保证了数据通信的可靠性;TCP包头最小长度为20个字节数。
  • UDP(User Data Protocol, 用户数据报协议) 是一个非连接的协议(即传输数据之前源端和终端不建立连接),只是简单的把应用程序的数据
    尽快地扔到网络上,因此UDP传输速度只受应用程序生成数据速度、计算机的能力和传输带宽的限制,接收端,UDP把每个消息段放入队列中
    应用程序读取使用;UDP可以一台服务器同时向多台客户机传输相同数据;UDP消息头很短只有8个字节;UDP尽可能快的发送数据,但不保证
    数据的可靠性(丢包,顺序等);UDP是面向报文的,发送方的报文只是添加首部后就向下交付给IP层,既不拆分也不合并,这些需要接收端
    应用程序自己实现。

5. 死锁的必要条件

  • 互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源
    被另一进程占有时,则申请者等待直到资源被占有者释放。
  • 不可剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
  • 请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
  • 循环等待条件:在发生死锁时必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有
    的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所深情地资源。

6. MySQL索引(5.5之前默认MyISAM引擎,5.5之后默认InnoDB)

  • MyISAM使用B-Tree实现主键索引、唯一索引和非主键索引。
  • InnoDB中非主键索引使用的是B-Tree数据结构,而主键索引使用的是B+Tree。

7. 进程与线程

  • 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
  • 同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
  • 进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进
    程中的其他线程的结束
  • 线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
  • 线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
  • 线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标
    示一个进程或一个线程的标志

8. IPC通信方式

  • 管道(Pipe):匿名管道(pipe亲缘关系的进程通信)、命名管道(mkfifo/mknod)
  • 消息队列:是基于消息的、用无亲缘关系的进程间通信,主要函数:msgget、msgsend、msgrecv、msgctl
  • 信号量:相当于一把互斥锁,通过p、v操作,主要函数:semget、semop、semctl
  • 共享内存:是进程间通信速度最快的,所以用经常是集合信号量或互斥锁来实现同步,shmget、shmat、shmdt、shmctl

9. 虚拟内存

  • 是将进程部分装入内存中,从而能实现一个很大的程序能在一个比它小的内存中运行,它的主要实现是靠程序的换进换出来实现的,因为内存
    中0-3G是用户使用,3-4G才是内存使用,通过映射来实现来进行逻辑地址到物理地址的映射

10. 设计原则

  • 依赖倒置原则 - Dependency Inversion Principle (DIP)
  • 里氏替换原则 - Liskov Substitution Principle (LSP)
  • 接口分隔原则 - Interface Segregation Principle (ISP)
  • 单一职责原则 - Single Responsibility Principle (SRP)
  • 开闭原则 - The Open-Closed Principle (OCP)

上一篇
Java Classloader Java Classloader
1. 类加载时机1.1 - 生命周期 +-------------------------连接(Linking)----------------------------+ 加载(Loading
2018-06-25
下一篇
Database Database
一. 四大特性(CIAD) 原子性(Atomicity): 要么全成功,要么全失败,失败会回滚。 一致性(Consistency): 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须
2018-06-18