Java-模块二-2
整数类型
-
byte:在 Java 中占用8位(1字节),因此它的取值范围是从 -128 到 127。这是最小的整数类型,适合用于节省空间的情况。
-
short:这种类型的大小是16位(2字节),允许的数值范围从 -32,768 到 32,767。当需要比
byte
更大的数值范围但又不想使用更大的存储空间时,可以使用short
类型。 -
int:作为最常用的整数类型,
int
占用32位(4字节),支持的数值范围从 -2,147,483,648 到 2,147,483,647。它适用于大多数整数运算场景。 -
long:这是一种64位(8字节)的数据类型,提供了极大的数值范围,从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。当你需要处理超出
int
范围的数值时,可以选择long
。
浮点类型
-
float:这是一种单精度浮点数类型,占用32位(4字节)。它可以表示大约7位有效数字的数值范围,适用于需要小数点数值且对精度要求不是特别高的情况。
-
double:双精度浮点数占用64位(8字节),能够提供大约15位的有效数字。对于需要高精度的小数运算,通常推荐使用
double
类型。
字符类型
- char:字符类型占用16位(2字节),基于Unicode编码,意味着它可以表示一个广泛的字符集中的任何一个字符。其取值范围是0到65,535,对应于Unicode字符集中的字符。
布尔类型
- boolean:布尔类型用于表示逻辑值,仅有两个可能的值:
true
和false
。尽管它的实际内存大小没有明确规定,但它仅限于这两个值之一,用于条件判断和控制流程。
变量的运算
1)算术运算
算术运算是最常见的运算类型,用于执行数学计算。常见的算术运算符包括:
+
:加法-
:减法*
:乘法/
:除法%
:取模(求余数)++
:自增(增加1)--
:自减(减少1)
示例:
int a = 10;
int b = 3;
int sum = a + b; // 加法,sum = 13
int diff = a - b; // 减法,diff = 7
int product = a * b; // 乘法,product = 30
int quotient = a / b; // 整数除法,quotient = 3(只保留整数部分)
int remainder = a % b; // 取模,remainder = 1
a++; // 自增,a = 11
b--; // 自减,b = 2
注意:
- 如果两个整数相除,结果会是整数(小数部分会被截断)。如果需要浮点数结果,至少一个操作数应该是浮点数。
- 取模运算的结果符号与被除数相同。
(2)关系运算
关系运算用来比较两个变量或值,返回布尔值(true
或 false
)。常见关系运算符包括:
==
:等于!=
:不等于>
:大于<
:小于>=
:大于等于<=
:小于等于
示例:
int x = 5;
int y = 10;
boolean isEqual = (x == y); // false
boolean isNotEqual = (x != y); // true
boolean isGreater = (x > y); // false
boolean isLessOrEqual = (x <= y); // true
(3)逻辑运算
逻辑运算用于对布尔值进行组合或操作,返回布尔值。常见逻辑运算符包括:
&&
:逻辑与(AND),当且仅当两个操作数都为true
时返回true
||
:逻辑或(OR),当任意一个操作数为true
时返回true
!
:逻辑非(NOT),反转布尔值
示例:
boolean a = true;
boolean b = false;
boolean result1 = a && b; // false
boolean result2 = a || b; // true
boolean result3 = !a; // false
短路特性:
&&
和||
具有短路特性。例如,在a && b
中,如果a
为false
,则不会计算b
的值,因为整个表达式已经确定为false
。
(4)位运算
位运算直接对变量的二进制位进行操作。常见位运算符包括:
&
:按位与|
:按位或^
:按位异或~
:按位取反<<
:左移>>
:右移(带符号)>>>
:无符号右移
示例:
int a = 6; // 二进制:0110
int b = 3; // 二进制:0011
int andResult = a & b; // 按位与:0010(十进制:2)
int orResult = a | b; // 按位或:0111(十进制:7)
int xorResult = a ^ b; // 按位异或:0101(十进制:5)
int notResult = ~a; // 按位取反:11111111111111111111111111111001(十进制:-7)
int shiftLeft = a << 1; // 左移一位:1100(十进制:12)
int shiftRight = a >> 1; // 右移一位:0011(十进制:3)
(5)赋值运算
赋值运算将右侧的值赋给左侧的变量。常见的赋值运算符包括:
=
:简单赋值+=
:加后赋值-=
:减后赋值*=
:乘后赋值/=
:除后赋值%=
:取模后赋值<<=
、>>=
、>>>=
:位移后赋值
示例:
int x = 10;
x += 5; // 等价于 x = x + 5,x = 15
x -= 3; // 等价于 x = x - 3,x = 12
x *= 2; // 等价于 x = x * 2,x = 24
x /= 4; // 等价于 x = x / 4,x = 6
x %= 5; // 等价于 x = x % 5,x = 1
2. 运算注意事项
-
数据类型转换:
- 当不同数据类型参与运算时,Java 会自动进行类型提升(隐式转换)。例如,
int
和double
运算时,int
会被提升为double
。 - 如果需要显式转换,可以使用强制类型转换(如
(int)
)。
示例:
int a = 5; double b = 2.5; double result = a + b; // 自动提升为 double,result = 7.5 int truncated = (int) result; // 强制转换为 int,truncated = 7
- 当不同数据类型参与运算时,Java 会自动进行类型提升(隐式转换)。例如,
-
溢出问题:
- 如果变量的值超出了其数据类型的取值范围,会导致溢出。例如,
byte
类型的最大值是 127,如果对其加 1,则会溢出为 -128。
示例:
byte b = 127; b++; // 溢出,b = -128
- 如果变量的值超出了其数据类型的取值范围,会导致溢出。例如,
-
运算符优先级:
- 不同运算符有不同的优先级。例如,
*
和/
的优先级高于+
和-
。 - 使用括号可以改变优先级。
示例:
int result = 10 + 5 * 2; // 先乘后加,result = 20 int resultWithParentheses = (10 + 5) * 2; // 先加后乘,resultWithParentheses = 30
- 不同运算符有不同的优先级。例如,
3. 总结
变量的运算是编程中的核心内容,涵盖了算术、关系、逻辑、位运算以及赋值等多种操作。掌握这些运算规则及其注意事项,可以帮助你编写高效、安全的代码。不同类型的数据在运算时需要注意类型转换和溢出等问题,以避免潜在的错误。
转义字符
1. 常见转义字符
(1)换行符:\n
-
表示换行。
-
将光标移动到下一行的开头。
-
示例:
System.out.println("Hello\nWorld"); // 输出: // Hello // World
(2)水平制表符:\t
- 插入一个水平制表位,通常相当于 4 或 8 个空格。
- 示例:
System.out.println("Name:\tAlice"); // 输出: // Name: Alice
(3)反斜杠:\\
-
用于表示一个反斜杠字符本身。
-
示例:
System.out.println("C:\\Program Files\\Java"); // 输出: // C:\Program Files\Java
(4)双引号:\"
-
用于表示字符串中的双引号字符。
-
示例:
System.out.println("He said, \"Hello!\""); // 输出: // He said, "Hello!"
(5)单引号:\'
-
用于表示字符字面量中的单引号字符。
-
示例:
char singleQuote = '\''; System.out.println(singleQuote); // 输出: // '
(6)退格符:\b
-
表示退格操作,将光标回退一格。
-
示例:
System.out.println("Hello\bWorld"); // 输出: // HellWorld
(7)回车符:\r
- 表示回车操作,将光标移动到当前行的开头。
- 示例:
System.out.println("Hello\rWorld"); // 输出: // World
(8)换页符:\f
- 表示换页操作,主要用于打印机等设备。
- 示例:
System.out.println("Page1\fPage2"); // 输出: // Page1 // (分页效果)
(9)Unicode 字符:\uXXXX
-
用于表示 Unicode 字符,其中
XXXX
是四位十六进制数。 -
示例:
System.out.println("\u0041"); // 输出字符 'A'
2. 转义字符的应用场景
(1)处理文件路径
在 Windows 系统中,文件路径中使用反斜杠(\
),但在 Java 字符串中需要对反斜杠进行转义。
String filePath = "C:\\Users\\Alice\\Documents\\file.txt";
System.out.println(filePath);
// 输出:
// C:\Users\Alice\Documents\file.txt
(2)格式化输出
使用 \n
和 \t
可以轻松实现换行和对齐。
System.out.println("Name:\tAlice\nAge:\t25");
// 输出:
// Name: Alice
// Age: 25
(3)嵌入特殊字符
如果需要在字符串中包含双引号或单引号,可以使用转义字符。
System.out.println("She said, \"It's a beautiful day!\"");
// 输出:
// She said, "It's a beautiful day!"
(4)Unicode 字符支持
使用 \uXXXX
可以插入任何 Unicode 字符。
System.out.println("Smile: \u263A"); // 输出笑脸符号 ☺
3. 注意事项
-
转义字符仅适用于字符串和字符字面量
- 转义字符只能出现在字符串(
"..."
)或字符('...'
)中。 - 如果在其他地方使用(如注释中),则不会被解析为转义字符。
- 转义字符只能出现在字符串(
-
非法转义字符会导致编译错误
-
如果使用了未定义的转义字符(如
\z
),编译器会报错。 -
示例:
System.out.println("Invalid escape sequence: \z"); // 编译错误:Illegal escape character in string literal
-
-
转义字符的长度
- 转义字符被视为单个字符。例如,
'\n'
的长度为 1。
- 转义字符被视为单个字符。例如,
float和double的区别
在 Java 中,float 和 double 都是用于表示浮点数的数据类型,但它们之间存在一些重要的区别。这些差异主要体现在精度、取值范围以及内存占用等方面。
-
精度
float:单精度浮点数,提供大约7位有效数字的精度。
double:双精度浮点数,提供大约15位有效数字的精度。
由于 double 提供更高的精度,所以在需要高精度计算时通常推荐使用 double 类型。 -
取值范围
float:
取值范围大约是从 ±3.4E-38 到 ±3.4E+38。
占用32位(4字节)存储空间。
double:
取值范围大约是从 ±1.7E-308 到 ±1.7E+308。
占用64位(8字节)存储空间。
因此,double 不仅提供了更高的精度,还拥有更广的数值范围。 -
内存占用
float:因为是单精度浮点数,所以占用较少的内存(32位/4字节),适用于对内存使用有严格要求的情况。
double:作为双精度浮点数,它占用更多的内存(64位/8字节),但在大多数现代计算机上,这点额外的开销通常是可接受的,尤其是考虑到其提供的更高精度和更广的数值范围。 -
默认类型
在 Java 中,如果一个浮点数没有特别指定为 float 类型,默认它是 double 类型。例如,直接写出 3.14 是一个 double 值,而要将其定义为 float 类型,则需要在其后加上 f 或 F,如 3.14f。 -
应用场景
float:当程序对内存使用非常敏感,且不需要非常高精度的浮点数运算时(比如图形处理、游戏开发等),可以考虑使用 float。
double:对于科学计算、工程应用或其他需要高精度浮点数运算的应用场景,建议使用 double。
示例代码
float floatVar = 3.14f; // 使用 'f' 后缀来声明 float 变量
double doubleVar = 3.14; // 默认为 double 类型
System.out.println("Float value: " + floatVar);
System.out.println("Double value: " + doubleVar);