Java基础

Java基础总结

Posted by LuminousHao on 2025-06-13
Estimated Reading Time 12 Minutes
Words 3.1k In Total
Viewed Times

从1990的Oak到如今,Java已经在当前的企业级Web应用开发中占据了举足轻重的地位,因此也成了每一个软件开发者的必由之路。回溯编程语言的发展,从C语言的诞生到20世纪90年代左右C++,Python,Java,PHP,JavaScrip的先后涌现,再到21世纪Go,Rust,Kotlin等编程语言的诞生,编程语言的发展也呈现螺旋上升状态,不同语言在前人的基础上针对性能,功能以及使用上做出了不同的改进和拓展。因此也就不存在所谓的最好的编程语言,只有合适的编程语言。(如果硬要选择一个最好的编程语言,我选择汇编语言,毕竟让Java来选,顶级父类的含金量不是和哥们开玩笑的)

Java前言:“一次编写,到处运行”,没错,就是到处运行,上过太空也去过火星那种。不过在这一方面,Java确实独树一帜,另外针对C++的一些缺点,Java直接舍弃了指针,添加了垃圾回收机制(GC),并且不同于一般的编译语言或解释型语言,Java既编译也解释。来看Sun公司对Java语言的解释:“Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全、与系统无关、可移植、高性能、多线程和动态的语言”。一看怎么全是优点,其实背后主要是得益于Java虚拟机(JVM)。学习Java,JVM是绕不过的一大门槛,但只要深入了解,你还是会赞叹它的神奇之处。

一、基本数据类型(四类八种)

在Java中除基本数据类型以外,还有引用数据类型,他们的区别在于前者将数据的值保存于栈中,可以在数据大量访问时提供较快的速度。而后者将对象的内存地址保存在堆中,虚拟机通过垃圾回收机制进行管理,并且其内存大小可动态调整以满足复杂的数据结构需求。

1.整形类型

  • byte:1字节(8Bit)-> Byte b = 0;
  • short :2字节-> short s = 0;
  • int : 4字节-> int i = 0;
  • long : 8字节-> long l = 0;

    2.浮点类型

  • float:4字节-> float f = 1.00F;
  • double: 8字节-> double d = 2.00D;

    3.字符类型

  • char:2字节-> char c = ‘a’;(实际值为97)

    4.布尔类型

  • boolean:通常为1字节->boolean b = false;
数据类型 大小 定义方法
byte 1字节(8Bit) Byte b = 0;
short 2字节 short s = 0;
int 4字节 int i = 0;
long 8字节 long l = 0;
float 4字节 float f = 1.00F;
double 8字节 double d = 2.00D;
char 2字节 char c = ‘a’;
boolean 通常为1字节 boolean b = false;

在Java中,以上八种类型对应的包装类从上到下分别为Byte、Short、Integer、Long、Float、Double、Character、Boolean。除int和char以外,其他均为首字母大写的形式。包装类的目的在于将数据以对象的形式进行操作,默认值为null,由于包装类已经重写了toString方法,所以在直接打印时仍会直接显示对应的值。
alt text

基本数据继承关系-空心箭头代表泛化(继承关系).菜鸟教程

二、字符串

特性 String StringBuilder StringBuffer StringJoiner
可变性 ❌ 不可变 ✅ 可变 ✅ 可变 ✅ 可变(内部Builder)
线程安全 ✅(天生安全) ❌ 非线程安全 ✅(synchronized) ❌(非线程安全)
性能 低(频繁修改时) 最高(单线程) 中等(同步开销) 高(专用场景)
设计目的 存储常量字符串 高效单线程修改 安全多线程修改 分隔符拼接
JDK 版本 1.0 1.5 1.0 1.8

String:

1
2
3
4
5
6
7
8
String s = "Hello";
int len = s.length(); // 获取长度
char c = s.charAt(1); // 获取索引处字符 → 'e'
String sub = s.substring(1,3); // 截取子串 → "el"
String up = s.toUpperCase(); // 转大写 → "HELLO"
String concat = s.concat("!"); // 拼接 → "Hello!"(创建新对象)
boolean eq = s.equals("hello");// 比较内容 → false
String[] arr = "A,B,C".split(","); // 分割 → ["A","B","C"]

StringBuilder:

1
2
3
4
5
6
7
8
9
10
StringBuilder sb = new StringBuilder();
sb.append("Java"); // 追加 → "Java"
sb.insert(0, "Hi "); // 插入 → "Hi Java"
sb.replace(3,5,"--"); // 替换 → "Hi --va"
sb.delete(2,4); // 删除 → "Hiva"
sb.reverse(); // 反转 → "aviH"
sb.setCharAt(1, 'X'); // 设置字符 → "Xva"
int cap = sb.capacity();// 当前容量(默认16
sb.ensureCapacity(50); // 确保最小容量
String result = sb.toString(); // 转为String

StringBuffer:

1
2
3
4
5
6
7
8
9
10
StringBuilder sb = new StringBuilder();
sb.append("Java"); // 追加 → "Java"
sb.insert(0, "Hi "); // 插入 → "Hi Java"
sb.replace(3,5,"--"); // 替换 → "Hi --va"
sb.delete(2,4); // 删除 → "Hiva"
sb.reverse(); // 反转 → "aviH"
sb.setCharAt(1, 'X'); // 设置字符 → "Xva"
int cap = sb.capacity();// 当前容量(默认16
sb.ensureCapacity(50); // 确保最小容量
String result = sb.toString(); // 转为String

StringJoinner:

1
2
3
4
StringBuffer sbf = new StringBuffer();
sbf.append("Safe");
sbf.insert(0, "Thread-");
sbf.toString(); // → "Thread-Safe"

三、循环结构

while

while是最基本的循环,它的结构为:

1
2
3
while( 布尔表达式 ) {
//循环内容
}

只要布尔表达式为 true,循环就会一直执行下去。

do…while

对于 while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。

do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。

1
2
3
do {
//代码语句
}while(布尔表达式);

注意:布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为 true,则语句块一直执行,直到布尔表达式的值为 false。

for

虽然所有循环结构都可以用 while 或者 do…while表示,但 Java 提供了另一种语句 —— for 循环,使一些循环结构变得更加简单。

for循环执行的次数是在执行前就确定的。语法格式如下:

1
2
3
for(初始化; 布尔表达式; 更新) {
//代码语句
}

关于 for 循环有以下几点说明:

  • 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
  • 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
  • 执行一次循环后,更新循环控制变量。
  • 再次检测布尔表达式。循环执行上面的过程。

增强 for 循环

Java5 引入了一种主要用于数组的增强型 for 循环。

Java 增强 for 循环语法格式如下:

1
2
3
4
for(声明语句 : 表达式)
{
//代码句子
}

声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。

表达式:表达式是要访问的数组名,或者是返回值为数组的方法。

break 关键字

break 主要用在循环语句或者 switch 语句中,用来跳出整个语句块。
break 跳出最里层的循环,并且继续执行该循环下面的语句。也可以跳出指定循环,使用 : 对循环进行声明,例如:

1
2
3
4
5
6
7
int i = 100;
loop : while(i > 0){
i++
while(i == 10){
break loop;
}
}

continue 关键字

continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环的迭代。
在 for 循环中,continue 语句使程序立即跳转到更新语句。
在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。

四、条件语句

if…else…

Java 中的条件语句允许程序根据条件的不同执行不同的代码块。

if 语句后面可以跟 else 语句,当 if 语句的布尔表达式值为 false 时,else 语句块会被执行。
语法

if…else 的用法如下:

1
2
3
4
5
if(布尔表达式){
//如果布尔表达式的值为true
}else{
//如果布尔表达式的值为false
}

如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 else 语句块后面的代码。

if…else if…else

if 语句后面可以跟 else if…else 语句,这种语句可以检测到多种可能的情况。
使用 if,else if,else 语句的时候,需要注意下面几点:

if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。

语法

1
2
3
4
5
6
7
8
9
10
if...else 语法格式如下:
if(布尔表达式 1){
//如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
//如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
//如果布尔表达式 3的值为true执行代码
}else {
//如果以上布尔表达式都不为true执行代码
}

switch

switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
语法

switch case 语句语法格式如下:

1
2
3
4
5
6
7
8
9
10
11
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}

switch case 语句有如下规则:

  • switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

  • switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。

  • case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。

  • 当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。

  • 当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。

  • switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。

switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。
| 列1标题|列2标题 | 列3标题 |
|-|-|-|
| 数据1| 数据2 | 数据3 |
| 数据4 | 数据5 | 数据6 |
| 数据7 | 数据8 | 数据9 |
| 数据10 | 数据11 | 数据12 |
| 数据13 | 数据14 | 数据15 |
| 数据16 | 数据17 | 数据18 |

四、数据结构

数组

1.数组创建

  • int[] arrays1 = new int[10]或者int[] arrays3; arrays3 = new in[10];->创建长度为10的int类型数组
  • int[] arrays2 = {0,1,2,3,4,5,6,7,8,9,};->创建时同时指定元素

    2.数组内存图

    数组在初始化时会在堆中创建一个空间,大小为数组的长度。数组名称会记录这个堆空间地址,并通过地址向其中添加元素。下方创建了一个长度为5的int数组。
    class ArraysTest {
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public static void main(String[] args) {
    int[] array = {1, 2, 3, 4, 5};
    try {
    Thread.sleep(1000000); // 让程序保持运行状态
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    通过HSDB(HotSpot Debugger)查看数组内存:
  • jps ->找到程序运行的端口
  • jhsdb hsdb —pid 端口号 -> 打开HSDB工具

alt text

列表

ArrayList

LinkedList

集合

HashSet

TreeSet

LinkedHashSet

映射

HashMap

TreeMap

LinkedHashMap


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !