数据类型
引用数据类型
基本数据类型
整数类型变量
类型名 | 占用空间 | 取值范围 |
---|---|---|
byte | 8位(1个字节) | -2^7 ~ 2^7-1 |
short | 16位(2个字节) | -2^15 ~ 2^15-1 |
int | 32位(4个字节) | -2^31 ~ 2^31-1 |
long | 64位(8个字节) | -2^63 ~ 2^63-1 |
注意:在为一个long类型的变量赋值时,所赋值的后面要加上一个字母“L”(或小写“l”)
整数类型的数据,有二进制、八进制、十进制和十六进制4种。
浮点数类型变量
类型名 | 占用空间 |
---|---|
float | 32位(4个字节) |
double | 64位(8个字节) |
注意:一个小数会被默认为double类型的值,在为一个float类型的变量赋值时一定要加上字母“F”(或者小写“f”),而为double类型的变量赋值时,可以在所赋值的后面加上字符“D”(或小写“d”),也可以不加。
字符类型变量
char类型的字符变量占用2个字节。
char c = 'a'; // 为一个char类型的变量赋值字符'a'
char ch = 97; // 为一个char类型的变量赋值整数97,相当于赋值字符'a'
自动类型转换
byte>short&char>int>long>float>double 从低到高自动转换
byte b = 3;
int x = b; // 程序把byte类型的变量b转换成了int类型,无需特殊声明
double y = x; // 将int类型的变量x转换成double类型,无需特殊声明
强制类型转换
当两种类型彼此不兼容,或者目标类型取值范围小于源类型时,自动类型转换无法进行,这时就需要进行强制类型转换。
目标类型 变量名 = (目标类型)值;
注意:有精度丢失的问题
原因分析:出现丢失精度的原因是,变量b为int类型,在内存中占用4个字节,而byte类型的数据在内存中占用1个字节,当将变量b的类型强转为byte类型后,前面3个高位字节的数据已经丢失,这样数值就发生了改变。
表达式类型自动提升
变量在表达式中进行运算时,也有可能发生自动类型转换,如byte、short和char类型的变量在运算期间类型会自动提升为int,然后再进行运算。
例如:
public static void main(String[] args) {
byte a = 10;
short b = 20;
char c = 'A'; // 字符 'A' 的 ASCII 值是 65
// byte、short、char 会自动转换为 int 类型进行运算
int result = a + b + c;
System.out.println("结果是: " + result); // 输出结果为 95
}
final 常量类型 常量名 [= 初始值];
常量有三种类型:静态常量、成员常量和局部常量。实例代码如下。
public class HelloWorld {
// 静态常量(属于类的常量,而不是某个对象的常量。它通常被声明为 static final)
public static final double PI = 3.14;
// 成员常量(属于对象实例的常量,通常用 final 关键字声明)
final int y = 10;
public static void main(String[] args) {
// 局部常量(方法内部定义的常量,通常用 final 关键字声明)
final double x = 3.3;
}
}
//常量方法:该方法不能被子类重写
public static final void a(){
}
//常量类:表示这个类不能被继承,如:String、Math、Integer等。
public final class Demo02 {
}
final的问题
final int A = 5; //锁定
A = 6; //错
final Point A = new Point(3,5); //锁定
A.x = 30; //对
A = new Point(5,6); //错
A = null; //错
算术运算符
注意:
赋值运算符
比较运算符
逻辑运算符
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
& | 与 | a & b | a和b都为true,结果为true,否则为false |
| | 或 | a|b | a和b中只要有一个为true,则结果为true,否则为false |
^ | 异或 | A^B | a与b不同,结果为true,否则为false |
! | 非 | !A | 若a为false,结果为true,否则相反 |
&& | 短路与 | a&&b | a和b都为true,结果为true,否则为false |
|| | 短路或 | a||b | a和b中只要有一个为true,则结果为true,否则为false |
**“&”和“&&”的区别:**在使用“&”进行运算时,不论左边为true或者false,右边的表达式都会进行运算。如果使用“&&”进行运算,当左边为false时,右边的表达式不会进行运算。
条件运算符
也称为三元运算符(或三目运算符)
(boolean_expr) ? true_statement : false_statement;
运算符的优先级
优先级 | 运算符 |
---|---|
1 | . [] () |
2 | ++ – ~ ! |
3 | * / % |
4 | + - |
5 | << >> >>> |
6 | < > <= >= |
7 | == != |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ?: |
14 | = *= /= %= += -= <<= >>= >>>= &= ^= |
if条件语句
if (判断条件1) {
执行语句1
} else if (判断条件2) {
执行语句2
}
...
else if (判断条件n) {
执行语句n
} else {
执行语句n+1
}
switch条件语句
说明:与if条件语句不同的是,switch 控制表达式结果类型只能是byte、short、char、int、enum枚举以及String类型,而不能是boolean类型。
switch (控制表达式){
case 目标值1:
执行语句1
break;
case 目标值2:
执行语句2
break;
...
case 目标值n:
执行语句n
break;
default:
执行语句n+1
break;
}
规则: switch语句将控制表达式的值与每个case中的目标值进行匹配,如果找到了匹配的值,会执行对应case后的执行语句,并通过break关键字跳出该switch语句;如果搜索完所有case中的目标值仍没找到任何匹配的值,就会执行default后的语句。
while
while(循环条件){
}
do…while
do {
} while(循环条件);
区别:while是先判断条件后执行循环体,而do…while会无条件执行一次循环体后再判断条件。
for循环语句
for(初始化表达式; 循环条件; 操作表达式){
}
break语句
当它出现在循环结构语句中时,作用是跳出当前循环结构语句,执行后面的代码。
continue语句
它的作用是终止本次循环,执行下一次循环。
一维数组
定义:
int[] ids = new int[100];
String[] names = new String[]{
"张三","tom",...};
Object[] object = {
"张三","tom",...};
多维数组
1.指定二维数组的长度和每个数组的元素个数。
int[][] arr = new int[3][4];
说明:上面的代码相当于定义了一个3*4的二维数组,这个二维数组的长度为3,可以将它看成3个int[]类型的一维数组,每个一维数组中的元素又是一个长度为4的一维数组。
2.只指定二维数组的长度,不确定每个数组的元素个数。
int[][] arr = new int[3][];
说明:第二种方式和第一种类似,只是数组中每个元素的长度不确定。
3.直接使用嵌套大括号“{}”,对二维数组初始化赋值。
int[][] arr = {
{
1,2},{
3,4,5,6},{
7,8,9}};
Arrays工具类
Arrays 类里均为 static 修饰的方法, Arrays.xxx(xxx) 的形式调用方法。
1)int binarySearch(type[] a, type key)
使用二分法查询 key 元素值在 a 数组中出现的索引,如果 a 数组不包含 key 元素值,则返回负数。调用该方法时要求数组中元素己经按升序排列,这样才能得到正确结果。
2)int binarySearch(type[] a, int fromIndex, int toIndex, type key)
这个方法与前一个方法类似,但它只搜索 a 数组中 fromIndex 到 toIndex 索引的元素。调用该方法时要求数组中元素己经按升序排列,这样才能得到正确结果。
3)type[] copyOf(type[] original, int length)
这个方法将会把 original 数组复制成一个新数组,其中 length 是新数组的长度。如果 length 小于 original 数组的长度,则新数组就是原数组的前面 length 个元素,如果 length 大于 original 数组的长度,则新数组的前面元索就是原数组的所有元素,后面补充 0(数值类型)、false(布尔类型)或者 null(引用类型)。
4)type[] copyOfRange(type[] original, int from, int to)
这个方法与前面方法相似,但这个方法只复制 original 数组的 from 索引到 to 索引的元素。
5)boolean equals(type[] a, type[] a2)
如果 a 数组和 a2 数组的长度相等,而且 a 数组和 a2 数组的数组元素也一一相同,该方法将返回 true。
6)void fill(type[] a, type val)
该方法将会把 a 数组的所有元素都赋值为 val。
7)void fill(type[] a, int fromIndex, int toIndex, type val)
该方法与前一个方法的作用相同,区别只是该方法仅仅将 a 数组的 fromIndex 到 toIndex 索引的数组元素赋值为 val。
8)void sort(type[] a)
该方法对 a 数组的数组元素进行排序。
9)void sort(type[] a, int fromIndex, int toIndex)
该方法与前一个方法相似,区别是该方法仅仅对 fromIndex 到 toIndex 索引的元素进行排序。
10)String toString(type[] a)
该方法将一个数组转换成一个字符串。该方法按顺序把多个数组元素连缀在一起,多个数组元素使用英文逗号,
和空格隔开。
public class ArraysTest {
public static void main(String[] args) {
// 定义一个a数组
int[] a = new int[] {
3, 4, 5, 6 };
// 定义一个a2数组
int[] a2 = new