基础
大约 4 分钟
基础
JVM vs JDK vs JRE
- JVM: Java 虚拟机(JVM),是运行 Java 字节码的虚拟机;
- JDK: JDK(Java Development Kit),功能齐全的 Java SDK,是提供给开发者使用;
- JRE(Java Runtime Environment) 是 Java 运行时环境;
字节码
- JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件)
进制转换
- 二进制 -> 十进制
(1010)₂ = (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰) = (10)₁₀
1010 :10
移位运算符
- 移位操作中,被操作的数据被视为二进制数,移位就是将其向左或向右移动若干位的运算。
- double,float 在二进制中的表现比较特殊,因此不能来进行移位操作。
- 移位操作符实际上支持的类型只有int和long,编译器在对short、byte、char类型进行移位前,都会将其转换为int类型再操作。
- << :左移运算符,向左移若干位,高位丢弃,低位补零。x << 1,相当于 x 乘以 2(不溢出的情况下)。
>>
:带符号右移,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。x >> 1,相当于 x 除以 2。>>>
:无符号右移,忽略符号位,空位都以 0 补齐。
- 例:移位的位数超过数值所占有的位数,先求余(%)
- int i = -1 ;int 32位 long 64位
- i <<= 10 : -1024
- i <<= 42 : -1024, 42%32=10
基本数据类型
Java 中有 8 种基本数据类型,分别为:
- 6 种数字类型:
- 4 种整数型:
byte
、short
、int
、long
- 2 种浮点型:
float
、double
- 4 种整数型:
- 1 种字符类型:
char
- 1 种布尔型:
boolean
。
这 8 种基本数据类型的默认值以及所占空间的大小如下:
基本类型 | 位数 | 字节 | 默认值 | 取值范围 |
---|---|---|---|---|
byte | 8 | 1 | 0 | -128 ~ 127 |
short | 16 | 2 | 0 | -32768(-2^15) ~ 32767(2^15 - 1) |
int | 32 | 4 | 0 | -2147483648 ~ 2147483647 |
long | 64 | 8 | 0L | -9223372036854775808(-2^63) ~ 9223372036854775807(2^63 -1) |
char | 16 | 2 | 'u0000' | 0 ~ 65535(2^16 - 1) |
float | 32 | 4 | 0f | 1.4E-45 ~ 3.4028235E38 |
double | 64 | 8 | 0d | 4.9E-324 ~ 1.7976931348623157E308 |
boolean | 1 | false | true、false |
面向对象三大特征
- 封装: 把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。
- 继承: 不同类型的对象,相互之间经常有一定数量的共同点。
- 多态: 一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。
String
运算符重载
- Java 语言本身并不支持运算符重载
- “+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符。
字符串拼接
- “+”的字符串拼接方式,实际上是通过 StringBuilder 调用 append() 方法实现的
- 问题:“+”拼接方式过多,会创建过多的 StringBuilder 对象
- JDK 9 之后可以放心使用, “+” 改为了用动态方法 makeConcatWithConstants() 来实现;
- 解决:“+”拼接方式改为创建单个StringBuilder,循环append
- 问题:“+”拼接方式过多,会创建过多的 StringBuilder 对象
String vs StringBuilder vs StringBuffer
- String
- 对象是不可变的,也就可以理解为常量,线程安全
- 变更会创建一个新的String对象,指针指向新对象
- 场景:操作少量字符串
- StringBuffer
- 线程安全, 方法加了同步锁,变更需操作StringBuffer 对象本身;
- 场景:操作大量字符串,多线程
- StringBuilder
- 线程不安全,变更需操作StringBuilder 对象本身,性能相比 StringBuffer好;
- 场景:操作大量字符串,单线程
equals vs ==
- == 基本数据类型,比较的是值
- == 对象 比较的是 内存地址
- equals 属于Object的方法 内部使用==比较,对象比较内存地址
- String的equals方法是重写的,用于比较字符串的值是否相等
异常
- Throwable
- Exception:程序本身可以处理的异常
- Error:程序无法处理的错误,JVM一般会选择线程终止
序列化
- 序列化:将数据结构或对象转换成二进制字节流的过程
- 序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。
- Java中实现持久化存储的一种方法
- 为数据传输提供了线路级对象表示法
- 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程