(一)Java基础知识复习(语法和基础概念)
一、数据类型(基本数据类型和引用数据类型)
(一)基本数据类型

基本类型 | 占用内存(字节) | 默认值 | 表示范围 | 封装类 |
---|---|---|---|---|
byte | 1 | (byte)0 | -128 (-2^7) ~127 (2^7-1) | Byte |
short | 2 | (short)0 | -32768 (-2^15) ~32767 (2^15-1) | Short |
int | 4 | 0 | -2147483648 (-2^31) ~2147483647 (2^31-1) | Integer |
long | 8 | 0L | -9223372036854775808 (-2^63) ~9223372036854775807 (2^63-1) | Long |
float | 4 | 0.0f | IEEE 754标准的单精度浮点数 | Float |
double | 8 | 0.0d | IEEE 754 标准的双精度浮点数 | Double |
boolean | 1 or 4 | false | \u0000 (0) ~ \uffff (65535) | Booble |
char | 2 | \u0000(null) | true / false | Character |
注:
- int是基本数据类型,Integer是int的封装类,是引用类型。int默认值是0,而Integer默认值 是null,所以Integer能区分出0和null的情况。一旦java看到null,就知道这个引用还没有指向某个 对象,在任何引用使用前,必须为其指定一个对象,否则会报错。
- 基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间, 必须通过实例化开辟数据空间之后才可以赋值。数组对象也是一个引用对象,将一个数组赋值给另 一个数组时只是复制了一个引用,所以通过某一个数组所做的修改在另一个数组中也看的见。
- 虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。 使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。
1. 基本类型间的转换
存储范围小的类型到存储范围大的类型: 自动转换 byte → short(char) → int → long → float → double
从存储范围大的类型到存储范围小的类型(使用强转,可能会损失精度) double → float → long → int → short(char) → byte
(二) 引用数据类型
下面我们以String类型来进行解释
1. String 特性
(1)String类是final修饰的,不可以被继承。 (2)String类的底层是基于char数组的。 (3)String类被设计成不可变(immutable)类,所以它的所有对象都是不可变对象,线程安全,不会有并发问题
2. 首先,必须明确的一个概念是String不是基本的数据类型!!!
- String其实是个类,因此它属于引用数据类型;
- 基本数据类型的存储原理是:基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间的;
- 所有引用类型继承于Object类(也是引用类型),都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储;
- 引用是存储在内存栈上的,而对象本身是存储在内存堆上的;
- 8种基本类型在Java中都有对应的封装类型,也就是引用类型:
- 整数类型:Byte, Short, Integer, Long
- 浮点类型:Float, Double
- 字符型:Character
- 布尔类型:Boolean
- Java的引用类型有五种:类,接口,枚举,注解,数组;
- 引用类型的底层结构和基本类型的差别比较大,主要在创建对象上有所不同;
- 引用类型的数据创建对象时需要通过new创建对象,创建的对象会保存在堆中,然后将该对象赋值给一个引用,也就是这个引用将会指向对象堆中的地址,而这个引用则存储在栈中;
- String类型也可以不用new来创建,会在常量池中创建对象.String是一个比较特殊的类.
//String常见的方法
//1.String的构造方法
String(String original) //把字符串数据封装成字符串对象
String(char[] value) // 把字符数组的数据封装成字符串对象
String(char[] value,int index,int count)//把字符数组中的一部分数据封装成字符串对象,
//2.String类的获取功能
length() //获取字符串的长度,其实也就是个字符个数
charAt(int index) //获取指定索引处的字符
indexOf(String str) //获取str字串对象中第一次出现的索引
substring(int start) //从start开始截取字符串
String substring(int start, int end) //从start开始,到end结束截取字符串,包括start,不包括end
//3.String判断功能
equals(Object obj) //比较字符串的内容是否相同
equalsIgnoreCase(String anotherString) //比较字符串的内容是否相同,忽略大小写
startsWith(String prefix) //判断字符串对象是否以指定的字符开头(区分大小写)
endWith(String str): //判断字符串对象是否以指定的字符结尾
isEmpty() //判断字符串是否为空
//String类中的转化方法:
toCharArray() //把字符串转换为字符数组.
toLowerCase() //把字符串转换为小写字符串
toUpperCase() //把字符串转换为大写字符串
常用方法:
trim()去除字符串两端的空格
split()去除字符串中指定的字符,然后返回一个新的字符串
subSequence(int beginindex,int endIndex)截取字符串中指定位置的字符组成一个新的字符串
replace(char oldChar,char newChar)将指定字符替换成另一个指定的字符
replaceAll(String regex,String replasement):用新的内容替换全部旧的内容
lastIndexOf(String str)返回指定字符出现的最后一次下标
contains()查看字符串中是否包含指定的字符
(三)基本数据类型和引用数据类型的区别和联系:
1. 从概念方面来说
- 基本数据类型:变量名指向具体的数值
- 引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值
2. 从内存构建方面来说
基本数据类型:变量在声明之后java就会立刻分配给他内存空间
int a; //声明变量a的同时,系统给a分配了空间
a=12;
引用数据类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。
MyDate today;
today.day = 14; //错误!因为today对象的数据空间未分配
MyDate today;
today = new Date(); //正确的方式
3. 从赋值方面来说
- 基本数据类型:使用时需要赋具体值,b = a;是把a的值传给b,存在b的内存空间内。该判断时使用“==”号
- 引用数据类型:使用时可以赋null,判断时使用equals方法,b = a;是把a的数据的地址传给b,即a和 b都存储的是一个地址,这个地址指向实际的数据。(与C++中的指针类似)
二、变量和常量以及标识符
在Java编程中,变量和常量是管理和存储数据的基本单元。理解它们的用法和区别是掌握Java语言的基础。j接下来我们将讨论Java中的变量和常量,讨论它们的定义、使用、以及它们在程序中的作用。
(一)变量
变量是一个存储数据的容器,在程序执行过程中可以改变其存储的值。变量必须在使用之前进行声明。变量的声明包括指定变量的类型和名称。
1. 变量的声明与初始化
在Java中,声明一个变量的基本语法如下:
数据类型 变量名;
例如:
int number;
这行代码声明了一个名为number
的变量,其数据类型为int
。声明之后,变量可以被赋值:
number = 10;
可以在声明的同时进行初始化:
int number = 10;
可以在一行代码中同时声明多个相同数据类型的变量,变量和变量之间使用逗号间隔。
int a = 100, b = 200, c = 300
Java 是强类型编程语言,要求所有的数据都要有明确的数据类型,以便于程序在运行过程中为这些数据被分配合适的内存空间。 举一个简单的例子,不同的数据类型就好比是不同大小的纸箱,装苹果和装西瓜所使用的箱子的大小是不一样的。
2. 变量的作用域
变量的作用域决定了变量的可访问性。Java中变量的作用域通常有以下几种:
- 局部变量:在方法、构造函数或块内部声明,只在其所在的代码块内可访问。
- 实例变量:在类中声明,不在任何方法内,没有
static
修饰符,属于类的每个对象。 - 类变量:用
static
修饰,在类中声明,所有对象共享同一个静态变量。
3. 示例
以下是一个简单的示例,展示了变量的声明、初始化和使用:
public class VariableExample {
public static void main(String[] args) {
// 局部变量
int a = 5;
double b = 3.2;
char c = 'A';
// 输出变量的值
System.out.println("整数变量 a 的值: " + a);
System.out.println("浮点变量 b 的值: " + b);
System.out.println("字符变量 c 的值: " + c);
}
}
(二)常量
常量是其值在程序执行期间不会改变的变量。Java中使用final
关键字来定义常量。一旦初始化,常量的值就不能被修改。
下图是Java常见的关键字,这些关键字之后会逐个学习
1. 定义常量
常量的定义形式如下:
final 数据类型 常量名 = 值;
例如:
final int MAX_USERS = 100;
常量通常使用大写字母表示,以便于与变量区分。
2. 常量的优点
- 可读性:常量名通常能清晰地描述它所代表的意义,提升代码可读性。
- 可维护性:如果需要更改常量的值,只需在定义处修改一次即可。
3. 示例
以下示例展示了如何使用常量:
public class ConstantExample {
public static void main(String[] args) {
final double PI = 3.14159; // 定义圆周率常量
double radius = 5.0;
double area = PI * radius * radius; // 使用常量计算圆的面积
System.out.println("圆的面积: " + area);
}
}
(三)
1. 标识符的概述
标识符,就是我们给类、方法或变量起的名字。
2. 标识符的命名规则
- 可以由大小写字母、数字、_(下划线)、 $(美元符号)组成
- 不能以数字开头
- 不能使用 Java 中的关键字
- 严格区分大小写 正例:HelloWorld、number、n1\color{green}{HelloWorld、number、n1}HelloWorld、number、n1 反例:n∗、0number、class\color{red}{n*、0number、class}n∗、0number、class
3. 标识符的命名规范
严格意义上讲,我们的标识符只要符合命名规则,随便起什么名都可以,Java 在语法上并没有对我们做过多的限制。
但是,要想写出可读性好并且易于维护的代码就必须要有一些命名的规范。否则每个人会都按照自己的想法随便命名,这对于团队开发来说是灾难性的。
小驼峰命名法:
第一个单词的首字母小写,其他单词的首字母大写。(给方法和变量命名) 举例:number、maxValue\color{green}{number、maxValue}number、maxValue
大驼峰命名法:
所有单词的首字母都大写,其他字母小写。(给类命名) 举例: Student、HelloWorld\color{green}{Student 、HelloWorld}Student、HelloWorld
三、运算符(算术、赋值、自增自减、关系、逻辑、三元、位运算符等)
(一)运算符和表达式的概述:
运算符,对字面量或变量进行操作的符号叫做运算符。 表达式,使用运算符连接起来的式子叫做表达式。
运算符是编程语言中的基本元素,它们用于在表达式中操作数据。Java中提供了多种类型的运算符,以满足不同的编程需求。以下将详细介绍Java中的各种运算符,包括算术运算符、赋值运算符、自增自减运算符、关系运算符、逻辑运算符、三元运算符和位运算符。
(二)算术运算符
算术运算符用于对数值进行基本的算术操作。Java支持以下算术运算符:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
+ | 加法 | 5 + 3 | 8 |
- | 减法 | 5 - 3 | 2 |
* | 乘法 | 5 * 3 | 15 |
/ | 除法 | 5 / 2 | 2 |
% | 取模(余数) | 5 % 2 | 1 |
需要注意的是,除法运算符/
在整数除法时会舍弃小数部分,返回整数结果。
(三)赋值运算符
赋值运算符用于将右侧表达式的值赋给左侧的变量。最常用的赋值运算符是=
,除此之外还有复合赋值运算符:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a = 5 | a 为5 |
+= | 加后赋值 | a += 3 | a 为8 |
-= | 减后赋值 | a -= 2 | a 为6 |
*= | 乘后赋值 | a *= 2 | a 为12 |
/= | 除后赋值 | a /= 3 | a 为4 |
%= | 取模后赋值 | a %= 3 | a 为1 |
(四)自增自减运算符
自增和自减运算符用于增加或减少变量的值。Java提供了前缀和后缀两种形式的自增(++
)和自减(--
)运算符:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
++a | 前缀自增 | a = 5; ++a; | a 为6 |
a++ | 后缀自增 | a = 5; a++; | a 为6 |
--a | 前缀自减 | a = 5; --a; | a 为4 |
a-- | 后缀自减 | a = 5; a--; | a 为4 |
前缀形式在增加或减少变量值后立即返回新的变量值,而后缀形式则在返回变量原值后再进行增加或减少。
(五)关系运算符
关系运算符用于比较两个操作数,并返回布尔值(true
或false
)。常用的关系运算符包括:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
== | 等于 | 5 == 3 | false |
!= | 不等于 | 5 != 3 | true |
> | 大于 | 5 > 3 | true |
< | 小于 | 5 < 3 | false |
>= | 大于或等于 | 5 >= 3 | true |
<= | 小于或等于 | 5 <= 3 | false |
(六)逻辑运算符
逻辑运算符用于连接多个布尔表达式。它们的结果也是布尔值:
1. 基本逻辑运算符
2. 短路逻辑运算符
基本逻辑运算符中的逻辑与(&)和逻辑或(|)必须执行表达式中的所有判断,但这其实是不必要的。 举例:
int x = 100; int y = 200; x > 300 & y < 300 // 在运算左边的判断时结果是 false,其实最终的结果已经确定,右边的判断执行了没有意义!
要提升逻辑判断的执行效率,可以使用 Java 提供的短路逻辑运算符。
(七)三元运算符
三元运算符(条件运算符)是Java中唯一的三元运算符,用于简化if-else
结构。其语法形式为:
条件表达式 ? 表达式1 : 表达式2
当条件表达式为true
时,返回表达式1的值,否则返回表达式2的值。
示例:
int a = 5;
int b = 3;
int max = (a > b) ? a : b; // max为5
(八)位运算符
位运算符用于对整数类型的位进行操作。常用的位运算符有:
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
& | 按位与 | 5 & 3 | 1 |
I | 按位或 | 5 I 6 | 7 |
^ | 按位异或 | 5 ^ 3 | 6 |
~ | 按位非 | ~5 | -6 |
<< | 左移 | 5 << 1 | 10 |
>> | 右移 | 5 >> 1 | 2 |
>>> | 无符号右移 | 5 >>> 1 | 2 |
位运算符用于更底层的操作,如与(&
)、或(|
)、异或(^
)、非(~
)以及位移操作(<<
、>>
、>>>
)。
(九)总结
运算符在Java编程中起着至关重要的作用,它们是构建表达式和控制程序逻辑的基础。熟练掌握各种运算符的用法,可以帮助开发者编写高效且易于维护的代码。通过结合不同类型的运算符,开发者能够创建复杂的逻辑和算法,以实现各种功能需求。
四、控制流语句(条件语句、循环语句、分支语句)
在编程中,控制流语句用于控制程序的执行流程。它们决定了程序如何选择执行不同的代码块,以及如何在满足某些条件时重复执行代码。Java提供了强大的控制流语句,包括条件语句、循环语句和分支语句。本文将详细介绍这些控制流语句的用法。
(一)条件语句
条件语句用于根据特定条件的真假来决定是否执行某个代码块。在Java中,主要的条件语句有if
、if-else
和switch
。
1. if语句
if
语句用于在条件为true
时执行特定代码块。
int number = 10;
if (number > 5) {
System.out.println("Number is greater than 5");
}
2. if-else语句
if-else
语句用于在条件为false
时执行另一个代码块。
int number = 3;
if (number > 5) {
System.out.println("Number is greater than 5");
} else {
System.out.println("Number is less than or equal to 5");
}
3. if-else if-else语句
if-else if-else
语句用于测试多个条件。
int number = 7;
if (number > 10) {
System.out.println("Number is greater than 10");
} else if (number > 5) {
System.out.println("Number is greater than 5 but less than or equal to 10");
} else {
System.out.println("Number is 5 or less");
}
4. switch语句
switch
语句用于根据某个表达式的值执行相应的代码块。适用于处理固定值的条件判断。
int day = 2;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
default:
System.out.println("Invalid day");
break;
}
(二)循环语句
循环语句用于重复执行某个代码块。Java中提供了for
、while
和do-while
循环。
1. for循环
for
循环用于在知道循环执行次数时使用。
for (int i = 0; i < 5; i++) {
System.out.println("Iteration: " + i);
}
2. while循环
while
循环在条件为true
时反复执行代码块,适合用于条件控制的循环。
int i = 0;
while (i < 5) {
System.out.println("Iteration: " + i);
i++;
}
3. do-while循环
do-while
循环先执行代码块,然后测试条件表达式。即使条件为false
,代码块至少执行一次。
int i = 0;
do {
System.out.println("Iteration: " + i);
i++;
} while (i < 5);
(三)分支语句
分支语句用于在循环中改变控制流。Java中常用的分支语句包括break
、continue
和return
。
1. break语句
break
语句用于终止循环或switch
语句,并跳出到下一个代码块。
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 终止循环
}
System.out.println("Iteration: " + i);
}
2. continue语句
continue
语句用于跳过当前迭代的剩余代码,直接进入下一次循环迭代。
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.println("Iteration: " + i);
}
3. return语句
return
语句用于从方法中返回结果,并结束方法执行。
public int add(int a, int b) {
return a + b; // 返回结果并结束方法
}
(四)总结
控制流语句是编程语言中的关键部分,能够帮助开发者控制程序执行的顺序和逻辑。通过使用条件语句、循环语句和分支语句,可以编写出更灵活和强大的程序,来实现复杂的功能需求。掌握这些控制流语句,是编写高效Java代码的基础。
转载自:https://juejin.cn/post/7395866692771217448