Java基础
Java数据类型与运算符
1.变量、数据类型
1.1基本数据类型
可以通过与其对应的包装类的字段MAX_VALUE、MIN_VALUE查看最大、最小值
例如int的范围:
System.out.println(Integer.MAX_VALUE);//查看int的最大值
System.out.println(Integer.MIN_VALUE);//查看int的最小值
1.1.1 整型
它们分别所占的字节数:byte(1)、short(2)、int(4)、long(8);
它们各自的范围:byte(-2^7 ~ 2 7-1)、short(-215 ~ 2 15-1)、int(-231 ~ 2 31-1)、long(-263 ~ 2^63-1);
注意在初始化long类型变量时,在后加上L/l,例如:
long num = 10000L;
1.1.2 浮点型
它们分别所占的字节数:float(4)、double(8);
它们各自的范围:Java中的float类型、double类型的内存布局遵循IEEE 754标准,尝试用有限的内存空间表示可得无限小数,势必会存在精度误差,故不能单纯的用2^n的形式表示数据范围。
初始化float或double类型变量时,在后加上F/f或D/d,例如:
float num_f = 1.1f;
double num_d = 10.0D;
1.1.3 字符型
java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。
java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。
1.1.4 布尔型
所占字节数没有明确规定,有些JVM的实现是占1个字节,有些是占1个比特位。
1.2 基本数据类型之间的转换
Java是一个强类型编程语言,当不同类型变量之间相互进行赋值操作时,有较严格地检验.
不同数字类型的变量之间直接赋值,范围小的类型的变量可以转换成范围大的类型的变量,反之则不行。可以使用强制类型转换,但可能会造成误差。
byte < short < int(float) < long(double);
1.2.1 byte和int之间的转换
比较特殊的是将int型值赋给byte类型的变量时是可以直接复制的,不会编译报错,但超过byte类型可以表示的范围时会编译报错,例如:
byte a = 12; // 编译可以通过
byte b = 200; // 编译报错,虽然使用强转可以通过编译,但没有无意义,此时已经溢出了
1.2.2 int和double之间的转换
从double类型直接转换为int类型,编译报错,使用强转的话可能会造成精度丢失,例如:
double d = 20.5;
int n1 = double; // 编译报错
int n2 = (int)double; // n = 20 小数点后面被忽略了
1.2.3 不同类型间的混合运算
当进行不同类型之间的混合运算时小范围类型会先提升为大范围类型然后再进行运算,得到的结果为大范围类型,此时若要将结果赋给更小范围类型的变量时,编译不能通过,强转有可能会造成精度丢失;例如:int和long之间的混合运算
int a = 20;
long b = 100L;
int r1 = a + b; // 编译报错 a + b的结果是long类型的
long r2 = a + b;
1.2.4 低于4字节的类型变量间的运算
计算机的CPU通常是按照4个字节为单位从内存中读取数据,所以像byte、short这种低于4字节的类型都会先提升成int在进行运算。所以运算结果也是int型,要是再赋给原类型变量就会编译报错,例如:byte与byte的运算
byte a = 2;
byte b = 5;
byte c = a + b; // 编译报错
1.3 int和String之间的相互转换
1.3.1 int -> String
通常由两种方法:
①在Java中字符串可以做拼接操作“+”得到字符串,例如:
int a = 16;
String str = "" + a; // 就可以得到16的字符串形式
②还可以使用String类提供的toString()方法,例如:
int a= 16;
String str = String.valueOf(a);
1.3.2 String -> int
使用int的包装类Integer的方法parseInt(),例如:
String str = "16";
int a = Integer.parseInt(str);
2.运算符
2.1 算数运算符
基本四则运算: +、-、*、/(整除)、%(取余)
增量赋值运算符:+=、-=、*=、/=、%=
自增、自减运算符:++、 –
int a = 2;
int b = a++; // 后置自增:先取值后++
int c = ++a; // 前置自增:先++后取值
// 自减同理
注意:如果不取自增、自减运算的表达式返回值,则前置自增和后置自增没有区别;
2.2 关系运算符
==、!=、<、>、<=、>=
关系运算符的表达式的返回值都是boolean类型的
2.3 逻辑运算符
&&(逻辑与)、||(逻辑或)、!(逻辑非)、&(与)、|(或)
逻辑与和逻辑或都具有短路求值的特点,例如:
System.out.println(1 > 100 && 1 / 0 == 0); // 打印false并没有在运行时报错说明没有执行后一步
System.out.println(1 < 100 || 1 / 0 == 0); // 打印true
但 与 和 或 不支持短路求值,可能会报错。
2.4 位运算符
&(按位与)、|(按位或)、~(按位取反)、^(按位异或)
~(按位取反)的结论:取反后得到的值 = 符号位取反 * 原值的绝对值 - 1;
按位异或例题:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
// 利用异或
// 二进制位相同返回0,不同返回1
// 0^num = num
public static int once(int[] arr) {
int ret = 0;
for (int i : arr) {
ret ^= i;
}
return ret;
}
2.5 移位运算符
<<、>>、>>>(无符号右移)
2.6 条件运算符
Java中唯一的一个三目运算符:
表达式1 ?表达式2:表达式3
表示若表达式1为true时执行表达式2,否则执行表达式3,一般推荐表达式2为想要执行的表达式。
java中char类型所占字节数参考:https://blog.csdn.net/weixin_30849403/article/details/99037387