+号的使用
在 Java 中,如果在一个运算表达式中,从左往右只要有一方是字符串,那么后续的运算就会被视为字符串的拼接运算。
一、基本数据类型
-
整数类型
byte
:- 占用 1 个字节(8 位)。
- 取值范围:-128 到 127 。
- 示例:
byte b = 10;
short
:- 占用 2 个字节(16 位)。
- 取值范围:-32768 到 32767 。
- 示例:
short s = 100;
int
:- 占用 4 个字节(32 位)。
- 取值范围:-2147483648 到 2147483647 。
- 示例:
int i = 1000;
long
:- 占用 8 个字节(64 位)。
- 示例:
long l = 1000000L;
(注意:数值后加L
表示长整型)
- 浮点类型
float
:- 占用 4 个字节。
- 示例:
float f = 3.14f;
(注意:数值后加f
表示单精度浮点型) - 0.342f==.342f
double
:- 占用 8 个字节。
- 精度高于
float
。 - 示例:
double d = 3.14;
-
字符类型
char
:- 占用 2 个字节。
- 用于表示单个字符。
- 示例:
char c = 'A';
-
布尔类型
boolean
:- 只有两个值:
true
和false
。 - 示例:
boolean flag = true;
- 只有两个值:
二、引用数据类型
-
类(
class
):自定义的类对象。- 示例:
MyClass obj = new MyClass();
- 示例:
-
接口(
interface
) -
数组
在 Java 中,确实小数(浮点数)的默认类型是 double
,而整数的默认类型是 int
。
这是 Java 语言的设计规定。当您直接写一个小数,例如 3.14
,它会被视为 double
类型。如果您希望将其明确指定为 float
类型,需要在数值后面加上 f
或 F
,例如 3.14f
。
对于整数,例如 10
,它默认被认为是 int
类型。如果您希望表示一个长整型 long
,并且数值超出了 int
的范围或者您想更明确地表示其为 long
类型,需要在数值后面加上 L
或 l
(通常建议使用 L
,以避免与数字 1
混淆),例如 1000000L
。
在 Java 中,对运算结果是小数(浮点数)的判断确实需要小心考虑,主要有以下几个原因:
精度问题:如前面所提到,浮点数存在精度限制。在进行运算时,可能会出现舍入误差,导致结果与预期不完全一致。
例如,计算 0.1 + 0.2
,期望结果是 0.3
,但由于浮点数的精度问题,实际得到的结果可能会有微小的偏差。
比较问题:直接使用 ==
来比较两个浮点数是否相等通常是不可靠的,因为可能存在精度误差。
边界情况:在处理浮点数的边界值,如非常接近 0 、正无穷大或负无穷大时,需要特别小心。
例如,判断一个浮点数是否接近 0 时,不能简单地与 0 进行比较,而应该考虑一个很小的误差范围。
为了更准确地处理浮点数的判断,通常可以采用以下方法:
-
定义一个可接受的误差范围,然后比较两个浮点数的差值是否在这个误差范围内。
-
使用专门的数学库或工具类提供的方法来进行更精确的比较和判断。math.abs
Math.abs
是 Java 中 Math
类的一个静态方法,用于返回一个数的绝对值。
科学计数法是一种用于表示非常大或非常小的数的简洁方式。
在 Java 中,科学计数法通常采用以下形式:
一个数字(可以是整数或小数)乘以 10 的幂次方,用 e
或 E
来表示乘以 10 的幂次方。
例如:
1.23E4
表示1.23 × 10^4
,即 12300。5.67e-3
表示5.67 × 10^(-3)
,即 0.00567。
字符编码是将字符集中的字符映射为数字的规则。
常见的字符编码有:
-
ASCII 编码:这是最早也是最基础的字符编码标准,使用 7 位二进制数(0 - 127)来表示常见的英文字母、数字、标点符号等。
- 例如,字符
'A'
的 ASCII 码是 65,字符'0'
的 ASCII 码是 48。
- 例如,字符
-
Unicode 编码:为了涵盖世界上几乎所有的语言字符,Unicode 被创建。它为每个字符分配一个唯一的代码点。
- Unicode 可以用多种编码方式实现,如 UTF-8、UTF-16、UTF-32 等。
-
UTF-8 编码:是一种变长的 Unicode 编码方式,使用 1 到 4 个字节来表示一个字符。对于常见的英文字符,只使用 1 个字节,对于其他语言的字符可能使用 2 - 4 个字节。
- 它具有节省存储空间和良好的兼容性等优点。
-
GBK 编码:是中文编码标准之一,主要用于汉字的编码。
在 Java 中,基本数据类型之间存在一定的转换规则,主要包括自动类型转换(隐式类型转换)和强制类型转换(显式类型转换)。
自动类型转换(隐式类型转换):
当把一个取值范围小的数据类型的值赋给一个取值范围大的数据类型的变量时,会自动进行类型转换。以下是一些自动类型转换的示例:
byte
可以自动转换为short
、int
、long
、float
、double
。short
可以自动转换为int
、long
、float
、double
。int
可以自动转换为long
、float
、double
。long
可以自动转换为float
、double
。char
可以自动转换为int
、long
、float
、double
。
强制类型转换(显式类型转换):
- 精度丢失:当将一个具有更高精度的数据类型强制转换为较低精度的数据类型时,可能会导致精度丢失。例如,将
double
类型转换为int
类型时,小数部分会被截断。 - 数据溢出:如果强制转换的结果超出了目标数据类型的取值范围,会得到错误的结
- 符号问题:对于有符号和无符号类型的转换,需要注意符号的处理。
- 浮点数到整数的转换:直接将浮点数强制转换为整数时,会进行向零取整。
- 布尔类型不能进行强制类型转换:
boolean
类型与其他基本数据类型之间不能进行强制转换。
基本数据类型转换为 String
类型:
直接将基本数据类型与空字符串连接;
String
类型转换为基本数据类型:
需要使用相应的包装类的 parseXXX()
方法,例如:
Integer.parseInt()
:将字符串转换为 int
类型;