1.基本数据类型
- 整数类型:byte, short, int, long
- 浮点数类型:float, double
- 字符类型:char
- 布尔类型:boolean
不同数据类型占用的字节数不一样,假设一个方框是1字节byte
1.1 整型
Java只定义了带符号整型,因此最高位的bit表示符号位
- byte:-128~127
- short:-32768~32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
1.2 浮点型
float f1 = 3.14f
float f2 = 3.14e10f
double f3 = 1.79e200
对于float类型,需要加上 f 后缀
1.3布尔类型
通常JVM把boolean表示为4字节整数
1.4字符类型
char 表示一个字符,java的char除了可以表示标准的ASCll外,还可以表示一个Unicode字符
char a = ‘A’
char zh = ‘中’
char 类型使用单引号‘’,且仅有一个字符,要和使用双引号“”的字符串区分开。
2.引用类型
除了上述的基本类型的变量,剩下的都是引用类型,例如String字符串。
引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置。
3. 常量
定义变量时,如果加上 final 修饰符,这个变量就变成了常量
final double PI = 3.14
根据习惯,常量名通常大写。
4.var关键字
有时候,类型名太长,写起来很麻烦。例如:
StringBuilder sb = new StringBuilder();
这个时候,如果想省略变量类型,可以使用var关键字:
var sb = new StringBuilder();
5.整数运算
- 整数相除只得到结果的整数部分
- 整数除法对于除数为0时,运行时将保存,但编译不会报错
- 整数由于存在范围限制,如果结果超出了范围,就会产生溢出,而溢出不会出错。
- 移位运算:>>,<<(不带符号位),>>>,<<<(带符号位)
练习:求前n个自然数之和
public class NnumberSum {
public static void main(String[] args) {
int n = 100;
int ans = 0;
ans = (n + 1) * (n) / 2;
System.out.println("ans="+ans);
System.out.println(ans == 5050? "测试通过":"测试失败");
}
}
## 6.浮点数运算 - 浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。
-
浮点数0.1在计算机中就无法精确表示,因为十进制的0.1换算成二进制是一个无限循环小数,很显然,无论使用float还是double,都只能存储一个0.1的近似值。但是,0.5这个浮点数又可以精确地表示。
-
由于浮点数存在运算误差,所以比较两个浮点数是否相等常常会出现错误的结果。正确的比较方法是判断两个浮点数之差的绝对值是否小于一个很小的数.
-
整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值:
- NaN
- Infinity
- -Infinity
6.1强制类型转换
可以将浮点数强制转换为整数,在转型时,浮点数的小数部分会被丢掉。如果转型后超过了整型能表示的最大范围,将会返回整型的最大值。
int n1 = (int) 12.3; // 12
int n2 = (int) 12.7; // 12
int n2 = (int) -12.7; // -12
int n3 = (int) (12.7 + 0.5); // 13
int n4 = (int) 1.2e20; // 2147483647
如果要进行四舍五入,可以对浮点数加上0.5再强制转型
7.bool运算
7.1三元运算符
b? x : y
如果b为真则返回x,否则返回y
7.2 短路运算
8.字符与字符串
8.1字符类型
因为Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可
8.2 字符串类型
- 和char类型不同,字符串类型String是引用类型,我们用双引号"…"表示字符串。一个字符串可以存储0个到任意个字符.
- 当字符串包含双引号等特殊符号时,需要使用转义字符 /
- 字符串使用 + 连接,如果+号连接了其它数据类型,会将其他数据类型自动转换为字符串。
- 所谓的引用类型和python里的变量相同,引用类型指向内存中的某个地址,重新赋值时,只是修改了指向的地址
8.3空值null
引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象。
例如:String s1 = null
String s2; // 没有赋初值值,s2也是null
String s3 = s1; // s3也是null
String s4 = “”; // s4指向空字符串,不是null
注意要区分空值null和空字符串"",空字符串是一个有效的字符串对象,它不等于null。
## 数组类型
public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int[] ns = new int[5];
ns[0] = 68;
ns[1] = 79;
ns[2] = 91;
ns[3] = 85;
ns[4] = 62;
}
}
- 数组类型 [],例如 int[],和单个基本类型变量不同,数组变量初始化必须使用new int[5]表示创建一个可以容纳5个int元素的数组.
- 数组所有元素初始化为默认值,整型都是0,浮点型都是0.0,布尔型都是false
- 数组一旦创建,大小就不可改变
- 数组索引从0开始
- 可以使用 数组变量.length获取数组大小
- 可以在定义数组时直接指定初始化的元素,这样就不必写出数组大小,而是由编译器自动推算数组大小
public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int[] ns = new int[] { 68, 79, 91, 85, 62 };
System.out.println(ns.length); // 编译器自动推算数组大小为5
}
}
字符串数组
如果数组元素不是基本类型,而是一个引用类型,那么,修改数组元素会有哪些不同?
字符串是引用类型,因此我们先定义一个字符串数组:
String[] names = {
"ABC", "XYZ", "zoo"
};