Java相关知识点
JVM、JRE、JDK的关系
JVM(Java Virtual Machine 虚拟机)是Java虚拟机的意思是用来运行Java字节码文件(.class)
JRE(Java Runtime Environment 运行时环境)是Java运行环境包含
JVM
Java 核心类库
JDK(Java Development Kit 开发工具包)是Java开发工具包包含JRE、开发工具
什么是字节码
字节码就是Java文件编译后的文件 (class文件)
使用字节码就可以一次编译到处运行
Java基本数据类型
整数数据类型:byte,short,int,long
浮点数:float,double
字符型:char
布尔型:boolean
| 基本类型 | 位数 | 字节 | 默认值 |
|---|---|---|---|
| byte | 8 | 1 | 0 |
| short | 16 | 2 | 0 |
| int | 32 | 4 | 0 |
| long | 64 | 8 | 0L |
| float | 32 | 4 | 0F |
| double | 64 | 8 | 0D |
| char | 16 | 2 | ‘u0000’ |
| boolean | 1 | false |
Java常用包装类型
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| double | Double |
| float | Float |
| char | Character |
| boolean | Boolean |
| \ | String |
基本数据类型和包装类型的区别
存储null:基本数据类型不能存储null,包装类型可以存储null
操作:包装类有很多便捷的api
占用空间:包装类一般比基本数据类型需要更多空间
用途:基本数据类型只用于数值计算,包装类可以用于泛型
默认值:基本数据类型有默认值,包装类有默认值null
存储方法:基本数据类型存储在栈中(static修饰的存储在堆中),包装类存储在堆中
包装类型的缓存机制
频繁创建包装类影响整体性能 于是有了包装类的缓存
有包装类的:Byte,Short,Integer,Long,Character
Byte,Short,Integer,Long 的范围都是(-128,127)
Character 的范围是(0,127)
Float,Double精度很大 缓存包括不住
装箱和拆箱
装箱:基本数据类型 ==( valueof( ) )==> 包装类型
拆箱:包装类型 ==( value() )==> 基本数据类型
自动装箱和拆箱
自动执行装箱和拆箱
拆箱引发的空指针问题:
包装类是null的时候 拆箱 的时候拆成基本数据类型会空指针
javaInteger a = null; int b = a;三木运算符引发的拆箱
javaInteger a = null; // 直接空指针 Integer b = 1 > 2 ? a : 0;
精准数据类型
BigDecimal 是一种精准的数据类型
float,double 是浮点类型的是不准确的
变量
成员变量、局部变量、静态变量
| 变量类型 | 成员变量 | 局部变量 |
|---|---|---|
| 存储位置 | 堆 | 栈 |
| 默认值 | 有默认值 | 无默认值 |
| 生命周期 | 随着类消亡 | 随着方法代码块等调用消亡 |
| 使用 | 可以使用修饰符 使用在类中 | 不可以使用修饰符两个都可以用final 使用在方法 代码块 参数上 |
静态变量是static修饰的
静态变量只创建一次
静态变量是存储在堆上的 各对象共享静态变量
方法
实例方法、静态方法
| 方法 | 静态方法 | 实例方法 |
|---|---|---|
| 调用方式 | 类名.静态方法 | 对象.实例方法 |
重载和重写的区别
| 区别 | 重载 | 重写 |
|---|---|---|
| 使用 | 同一个类中 | 父子类中 |
| 修饰符 | 修饰符可以不同 | 不低于父类的修饰符 |
| 方法名 | 方法名相同 | 方法名必须相同 |
| 参数 | 参数不一样 | 参数必须相同 |
| 返回值 | 可以不一样 | 和父类一样或者是子类的关系 |
对象
面向对象三大特征
封装(隐藏类内部细节,提供公有方法去调用)
继承(子类继承父类的方法和变量)
多态(父类引用指向子类实例)
如何创建一个对象
创建对象使用关键词new
创建的对象分为两部分:对象实例、对象引用
对象实例:对象地址对应的内存里面的值
对象引用:对象对应的地址
对象相等和引用相等的区别
对象相等:指的是对象里面的值是相等的
引用相等:是指对象的地址是相等的
浅拷贝和深拷贝的区别
浅拷贝:指的是只拷贝对象的引用对象,对象之间使用的相同的对象实例,不创建新的对象实例
深拷贝:指的是拷贝整个对象实例和对象引用,会创建新的对象实例和对象引用
比较相等的方式
==
基本数据类型:值是否相等
对象:地址是否相等
equals
object.equals是指的对象的地址是否相等
String、Integer等都重写了表示内容是否相等
a.compareTo(b)
比较两个对象(a/b)的大小
String
String底层原理
//jdk8
// 底层存字符串的字符数组 从这就看出来String底层是不可变的++
private final char[] value;
// 哈希缓存,避免每次都计算 hashCode
private int hash;
//jdk9
//省空间
private final byte[] value;
// 哈希缓存,避免每次都计算 hashCode
private int hash;
//构造方法 new String()
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
//new String("a")
String(String original) {
this.value = original.value;
this.hash = original.hash;
}
//重写的equals方法
public boolean equals(Object anObject) {
// 1. 地址一样直接 true
if (this == anObject) {
return true;
}
// 2. 不是 String 直接 false
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
// 长度不一样直接 false
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
// 逐个字符比对
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}字符串拼接的方式
- ‘+’
对于字符串常量 在编译时就会拼接
对于变量 在运行时拼接底层使用StringBuilder.append( )拼接
循环中不可用+每次都会创建一个新的StringBuilder对象
应该 显示声明一个StringBuilder对象拼接
- StringBuilder.append( )
底层可变char数组
StringBuffer.append( )
带锁的StringBuilder
String、StringBuilder、StringBuffer
String 是不可变的,线程安全的,性能很差每次都要创建新的String对象
StringBuilder是线程不安全的,性能是最好的
StringBuffer是带锁的线程安全的,性能较差
异常
Exception和Error的区别
Exception是异常不会导致整个程序停止运行 通常捕获后处理 分为受检查和非受检查Checked Exception 和 Unchecked Exception
Error是系统错误 会直接停止运行
Checked Exception 和 Unchecked Exception
Checked Exception 是受检查的异常 在编译阶段必须捕获 否则不能通过编译
Unchecked Exception 非受检查的异常只有 RuntimeException 子类才是 其他都是受检查的
泛型
反射
应用场景:控制反转、注解、AOP、动态代理
代理
分类:JDK 动态代理 CGLIB 动态代理
序列化 和 反序列化
- 序列化:对象 → 字节流(存文件 / 网络传输)
- 反序列化:字节流 → 恢复对象
BIO、NIO、AIO 区别(必问)
BIO 同步阻塞
- 一个请求一个线程
- 阻塞等待,效率低,并发差
NIO 同步非阻塞
- 多路复用,一个线程处理多个连接
- 三大核心:Buffer、Channel、Selector
AIO 异步非阻塞
- 操作系统完成 IO 后主动通知程序
- 不用轮询,效率最高
9. NIO 三大核心
Buffer:缓冲区,存数据
Channel:通道,双向读写,比流高级
Selector:多路复用器,监听多个通道事件
特别像redis的多路复用