一. 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)