JDK(Java Development Kit)是整个JAVA的核心,包括了 Java 运行环境(Java Runtime Envirnment),一堆 Java 工具(javac/java/jdb等)和 Java 基础的类库(即 Java API 包括 rt.jar)。
JRE(Java Runtime Environment,Java 运行环境),包含 JVM 标准实现及 Java 核心类库。JRE 是 Java 运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器)。
JVM(Java Virtual Machine),即 Java 虚拟机, Java 运行时的环境,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。针对 Java 用户,也就是拥有可运行的 .class 文件包(jar 或者 war)的用户。里面主要包含了 Jvm 和 Java 运行时基本类(rt.jar)。rt.jar 可以简单粗暴地理解为:它就是 Java 源码编译成的 jar 包。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是 Java 的能够 “一次编译,到处运行” 的原因。
具体地讲:
JDK = JRE + 开发工具集(例如 Javac 编译工具等);
JRE = JVM + Java SE 核心类库;
| 修饰符 | 当前类 | 同包 | 子类 | 其他包 |
|---|---|---|---|---|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | |
| default | √ | √ | ||
| private | √ |
观察者模式:又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
单例模式:单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
懒汉式:
public class Singleton {
private static Singleton singleton;
private Singleton(){} // 注意要用 private
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
多线程情况下保证只创建一个对象:
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance() {
// 线程A和线程B同时看到singleton = null,如果不为null,则直接返回singleton
if (singleton == null) {
// 线程A或线程B获得该锁进行初始化
synchronized(Singleton.class) {
// 其中一个线程进入该分支,另外一个线程则不会进入该分支
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
成员的区别:
类和接口的关系区别:
体现的理念不同:
有序无序,有无重复元素,单列数据 v skey-value。
定义:
区别:
值的存储:int 存储在栈中;Integer 对象的引用存储在栈空间中,对象的数据存储在堆空间中。
初始化:int 初始化值为0;Integer 初始化值为null。
传参:int 是值传递,栈中的数据不可变。Integer 对象是引用传递,引用不可变,但是引用指向的堆空间地址中的值是可以改变的。
泛型支持:泛型不支持 int,但是支持 Integer。
运算:int 可以直接做运算,是类的特性;Integer 的对象可以调用该类的方法,但是在拆箱之前不能进行运算,需要转化为基本类型 int。
垃圾收集主要是针对堆和方法区进行。
如何判断对象是否可以回收:
垃圾收集算法:
强引用的对象是可触及的,垃圾收集器就永远不会回收掉被引用的对象。
报 OOM。
先解释两个概念。
区别:
调用 notify 时,随机唤醒一个等待线程(由调度器决定),进入锁池,唤醒的线程享有公平竞争资源的权利。
调用 notifyAll 方法,等待该锁的所有线程都会被唤醒,进入锁池,唤醒的所有线程公平竞争资源。
有 return finally 中的语句也会执行。
一道滑动窗口,一道对字符串按字母出现的次数排序。