-
0. 入门常识
-
0.1 Java 特点
-
0.2 Java 和 C++
-
0.3 JRE 和 JDK
-
0.4 Java 程序编译过程
-
-
1. 数据类型
-
1.1 基本数据类型
-
1.2 引用类型
-
1.3 封装类
-
1.4 缓存池
-
-
2. 字符串 String
-
2.1 定义
-
2.2 不可变性的优点
-
2.3 String vs StringBuffer vs StringBuffer
-
2.4 字符串常量池(String Pool)
-
2.5 new String(“xxx”)
-
-
3. 基础语法
-
3.1 注释
-
3.2 常见关键字
-
3.3 标识符和关键字
-
3.4 访问控制符
-
3.5 static、final、this、super
-
3.6 continue、break 和 return
-
3.7 while 循环与 do 循环
-
3.8 final、finally、finalize
-
-
4. 运算符
-
4.1 算术运算
-
4.2 关系运算符
-
4.3 位运算符
-
4.4 逻辑运算符
-
4.5 赋值运算符
-
4.6 条件运算符(? :)
-
4.7 instanceof
-
4.8 equals() 和 ==
-
-
5. 方法
-
5.1 方法的类型
-
5.2 重载和重写
-
5.3 深/浅拷贝
-
5.4 值传递
-
-
6. 面向对象
-
6.1 面向对象 vs 面向过程
-
6.2 封装、继承、多态
-
6.3 成员变量 vs 局部变量 vs 静态变量
-
6.4 构造方法的特点
-
6.5 抽象类 & 接口
-
6.6 Object 类中常见方法
-
6.7 hashCode & equals
-
6.8 序列化与反序列化
-
0. 入门常识
0.1 Java 特点
-
简单易学
-
面向对象(封装、继承、多态)
-
平台独立
-
安全可靠
-
支持多线程
-
解释和编译共存
-
安全性
-
健壮性(Java 语言的强类型机制、异常处理、垃圾的自动收集等)
-
…
0.2 Java 和 C++
-
相同点:两者均为 OOP 语言,均支持 OOP 的三大特性(封装、继承、多态);
-
不同点:
-
Java 不存在指针的概念,所以内存更加安全;
-
Java 类是单继承(但是接口可以多继承),C++ 的类是多继承;
-
Java 中有自动内存管理机制,但是 C++ 中需要开发者手动释放内存;
-
C/C++ 中,字符串和字符数组最后均有一个额外的
\0
标志来表示结束,但 Java 中不存在这一概念;
-
0.3 JRE 和 JDK
-
JRE(Java Runtime Environment),即 Java 运行时环境,是用来运行已经编译过的 Java 程序所需内容的集合(JVM、Java 类库、Java 命令等),不能用来开发新程序;
-
JDK(Java Development Kit),即 Java 开发工具包,是功能齐全的 Java SDK,包含 JRE 拥有的一切,还有编译器和其他工具,如果我们想要创建和编译新程序,就必须使用到它;
两者关系
0.4 Java 程序编译过程
我们编译的源代码(xxx.java
)经 JDK 中的 javac
命令编译后,成为 JVM 能够理解的 Java 字节码(xxx.class
),然后经由 JVM 加载,通过解释器 逐行解释执行,这就是为什么能经常听见说 Java 是一门编译和解释共存的语言。
其中 JVM 是解释 Java 字节码(xxx.class
) 的虚拟机,针对不同系统均有特定实现,方便一次编译,多次运行,即 Java 语言的平台独立性;
1. 数据类型
1.1 基本数据类型
数据类型 | bit | 字节 | 封装类 | 数据范围 | 默认值 |
---|---|---|---|---|---|
byte |
8 | 1 | Byte |
~ | 0 |
short |
16 | 2 | Short |
~ | 0 |
char |
16 | 2 | Character |
\u0000 ~ \uffff ( ~ ) |
u0000 |
int |
32 | 4 | Integer |
~ | 0 |
long |
64 | 8 | Long |
~ | 0L |
float |
32 | 4 | Float |
~ | 0.0f |
double |
64 | 8 | Double |
~ | 0.0D |
boolean |
不确定 | 不确定 | Boolean |
true 或 false |
false |
注意:
-
boolean
一般用 1bit
来存储,但是具体大小并未规定,JVM 在编译期将boolean
类型转换为int
,此时 1 代表true
,0
代表false
。此外,JVM 还指出boolean
数组,但底层是通过byte
数组来实现; -
使用
long
类型时,需要在后边加上L
,否则将其作为整型解析,可能会导致越界; -
浮点数如果没有明确指定
float
还是double
,统一按double
处理; -
char
是用 单引号‘’
将内容括起来,相当于一个整型值(ASCII 值),能够参加表达式运算;而String
是用 双引号“”
将内容括起来,代表的是一个地址值;
1.2 引用类型
数据类型 | 默认值 |
---|---|
数组 | null |
类 | null |
接口 | null |
1.3 封装类
基本数据类型都有其对应的封装类,两者之间的赋值通过 自动装箱 和 自动拆箱 来完成;
-
自动装箱:将基本数据类型装箱为封装类;
// 实际调用 Integer.valueOf(12)
Integer x = 12;
-
自动拆箱:将封装类拆箱为基本数据类型;
Integer x = 12;
// 实际调用 x.intValue()
int y = x;
-
基本类型与对应封装类的不同
-
基本类型只能按值传递,封装类按引用传递;
-
基本类型 会在 栈 中创建,效率较高,但可能存在内存泄露问题;封装类对象会在堆中创建,其 引用在栈中创建;
-
1.4 缓存池
以 new Integer(123)
和 Integer.valueOf(123)
为例:
-
通过
new
的方式每次都会创建一个新的对象; -
通过
valueOf()
的方式则会优先判断该值是否位于缓存池,如果在的话就直接返回缓存池中的内容,多次调用指向同一个对象的引用;
Integer x = new Integer(123);
Integer y = new Integer(123);
// false,通过 new 的方式,每次都会创建一个新对象,指向不同对象
System.out.println(x == y);
Integer m = Integer.valueOf(123);
Integer n = Integer.valueOf(123);
// true,通过 valueOf() 的方式,先到缓存池中查找,存在时则多次调用也是指向同一对象
System.out.println(m == n);
数据类型 | 默认缓存池 |
---|---|
Byte |
~ |
Character |
\u0000 ~ \u007F |
Short |
~ |
Integer |
~ |
Boolean |
true & false |
2. 字符串 String
2.1 定义
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {