Bootstrap

Java基础知识总结归纳

  • 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 特点

  1. 简单易学

  2. 面向对象(封装、继承、多态)

  3. 平台独立

  4. 安全可靠

  5. 支持多线程

  6. 解释和编译共存

  7. 安全性

  8. 健壮性(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

注意:

  1. boolean 一般用 1 bit 来存储,但是具体大小并未规定,JVM 在编译期将 boolean 类型转换为 int,此时 1 代表 true0 代表 false。此外,JVM 还指出 boolean 数组,但底层是通过 byte 数组来实现;

  2. 使用 long 类型时,需要在后边加上 L,否则将其作为整型解析,可能会导致越界;

  3. 浮点数如果没有明确指定 float 还是 double,统一按 double 处理;

  4. 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. 基本类型只能按值传递,封装类按引用传递;

    2. 基本类型 会在  中创建,效率较高,但可能存在内存泄露问题;封装类对象会在堆中创建,其 引用在栈中创建;

 

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 {
   
;