JVM JDK JRE
WORA(Write once, run anywhere)从源代码到运行: .java文件->JDK中的javac编译->.class文件->JVM->机器可执行的二进制机器码
JDK = JRE +编译器( javac) + 工具(javadoc和jdb)
JRE(运行时环境) = JVM + Java类库 +Java命令
Java与C++
- 指针
- 多继承
- 内存管理(GC)
基本数据类型
基本类型 | 大小(bits) | min | max | 包装类 |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16 | Character | ||
byte | 8 | -128 | 127 | Byte |
short | 16 | -215 | +215-1 | Short |
int | 32 | -231 | +231-1 | Integer |
long | 64 | -263 | +263-1 | Long |
float | 32 | IEEE754 | IEEE754 | Float |
double | 64 | IEEE754 | IEEE754 | Double |
void | - | - | - | Void |
重载(overload)和重写(override)
- overload: 同一个类,方法名必须相同,参数列表不同,返回值和访问修饰符可不同,发生在编译时
- override: 子父类中,方法名和参数列表必须相同,返回值范围小于等于父类,抛出异常小于等于父类,访问修饰符大于等于父类(父类方法private时子类不能重写该方法)
String, StringBuffer, StringBuilder
- String: 底层是private final char value[],因此不可变。线程安全。
- StringBuffer, StringBuilder: 底层继承AbstractStringBuilder,没有final修饰,因此可变。 StringBuffer线程安全,效率较低,适用于多线程,出现于jdk1.0。StringBuilder非线程安全,效率比buffer高10-15%,适用于单线程,出现于jdk1.5。
接口与抽象类
- 接口方法默认public,所有方法在接口中不能实现(Java8开始接口方法可以有默认实现),抽象类可以有非抽象的方法
- 接口中只能有static、final变量,抽象类不一定
- 一个类可以实现多个接口,但只能实现一个抽象类
- 接口方法默认public修饰,为了被重写,抽象方法只可以用除private以外的修饰符修饰
- 抽象是对类的抽象,接口是对行为的抽象
对象实体与引用
- 对象实例在堆内存, 对象引用在栈内存
- 一个对象引用可以指向0或1个对象, 一个对象可以有n个引用指向它
==和equals(重要)
- ==: 基本数据类型比较值是否相等, 引用数据类型比较内存地址
- equals: 两种情况:
- 类重写了equals方法, 一般来说, 通过重写equals方法来比较两个对象的内容是否相等
- 类未重写equals方法, 用Object类中equals方法,即等价于==
hashCode与equals(重要)
面试题:你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?
- hashCode() 的作用是获取哈希码(散列码),实际上返回一个int整数。这个哈希码作用是确定该对象在哈希表中的索引位置。
- 如果两个对象相等,则hashCode一定也相同
- 两个对象相等,对两个对象分别调用equals方法都返回true
- 两个对象有相同hashCode值,他们不一定相等
- 因此,equals方法被覆盖过,则hashCode方法也必须被覆盖
- hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
进程与线程
- 进程是系统运行程序的基本单位
- 一个进程在执行过程中可以产生多个线程
线程的基本状态
状态名称 | 说明 |
---|---|
NEW | 初始状态,线程被构建,尚未调用start() |
RUNNABLE | 运行状态,操作系统中就绪和运行状态的统称 |
BLOCKED | 阻塞状态,表示线程阻塞于锁 |
WAITING | 等待状态,等待其他线程通知或中断 |
TIME_WAITING | 超时等待状态 |
TERMINATED | 终止状态,表示当前线程执行完毕 |
final
- 修饰变量:基本数据类型:初始化后不能改;引用类型:初始化后不能指向其他对象
- 修饰类:不能被继承。final类中的所有成员方法都会被隐式地指定为final方法
- 修饰方法:不能被覆盖。类中所有private方法都隐式地指定为final
异常(Exception)与错误(Error)
- 异常能被程序本身可以处理,错误是无法处理
transient关键字
- 作用:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。
获取键盘输入的两种方法
Scanner
1
2
3Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
BufferedReader
1
2BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();
IO流
- BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。
- NIO (New I/O): NIO是一种同步非阻塞的I/O模型
- AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。