文章目录
前言
不同类型的变量就好比不同大小的蛋糕,放在内存这个冰箱里。优秀的面包师(程序员)会完美利用冰箱内的空间,并且对于特定的顾客能快速且准确地提供相应的蛋糕。而且Java 是强类型语言,说明你做好的蛋糕一旦确定了顾客,如果不强制转换订单(强制类型转换),它就只能对口那一种特定顾客。比如int类型的变量就不能看作字符串,写出 int a = 0; a = ‘abc’;这样的语句。
一、变量和类型
命名方式:小驼峰
意思是:除第一个单词,其余单词首字母大写。
示例:firstNumber、finalResult这种。
1.整形变量
int占4个字节
表示范围:
看一个有意思的:
最大数加1,成了最小数;最小数减1,成了最大数
可以想象一个圆环,最大正数和最小复数连接着
2.长整型变量
int 最大值:2147483647,这个数字对于你未来的余额,肯定是不够的,所以Java用long类型来表示更大的范围。
这个很大了吧,忘了说,long是8个字节。
还有一点,使用long类型时,要在变量值后面加 l 或者L
否侧编译器不给通过滴
3.双精度浮点型变量
double,8个字节
补充一下,这里发生了自动(类型)转换,由低(int)到高(double)
4.单精度浮点型变量
float,4个字节
使用float类型时,要在变量值后面加 f (F也行)
否则就会这样:
5.字符类型变量
char, 2个字节
注意:单引号’ '和单个字符
6.字节类型变量
byte , 1个字节
表示的范围更小了
7.短整型变量
short , 2个字节
这就是shot范围,并不常用,了解即可
8.布尔类型变量
boolean , 是占 1 个字节, 还是占 1 个比特位,没有明确规定。
boolean只有true和false之分,没有第三种可能,对于0表示假,1表示真,是绝对不可能的事!!!
二、运算符
1.算数运算符(+ - * / %)
来看实例:
public static void main(String[] args) {
System.out.println(7 + 2);
System.out.println(7 - 2);
System.out.println(7 * 2);
System.out.println(7 / 2);
System.out.println(7 % 2);
}
结果为:
对于加减乘和取模(求余数)的运算都不会有什么疑问,关键就是 7 / 2,结果为3,并没有保留小数显示3.5。
这就是由于上文所说的强类型所影响,这里的7和2都是int类型,所以结果自然就是int类型。
如果需要显示小数,强制类型转换即可:
System.out.println(7 / 2);
System.out.println((float)7 / 2);
System.out.println(7 / (float)2);
System.out.println((float)(7 / 2));
结果为:
显示3.5都是因为除数或者被除数都被转换成了float类型,其效果和 7 / 2.0 、7.0 / 2 一样,最后一个3.0是对整型3的强制转换。
%的特别补充
Java可以对小数进行取模运算。
System.out.println(7.5 % 2);
结果为:
也有非常神奇的地方:
System.out.println(7.6 % 2);
结果为:
这是由于:
Java中浮点数内存布局遵守 IEEE 754 标准,尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差。
讲成大白话,就是2进制不能表示准确的小数,只能无限接近,进行运算必然会发生精度丢失。
2.关系运算符
主要有六种: == != < > <= >=
特别要注意的是返回值都是boolean类型
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a == b);
System.out.println(a != b);
System.out.println(a < b);
System.out.println(a > b);
System.out.println(a <= b);
System.out.println(a >= b);
}
结果只有true和false之分:
3.逻辑运算符
也称短路运算符
主要有3种:&& 、 || 、 !
3.1 &&
逻辑与,2个操作数都为真,结果才为真,否则为假
int a = 10;
int b = 20;
//两个都为假
System.out.println(a == b && a > b);
//左边为假右边为真
System.out.println(a == b && a < b);
//左边为真右边为假
System.out.println(a < b && a == b);
//两个都为真
System.out.println(a != b && a < b);
结果为
直白地说就是有假即为假
3.2 ||
逻辑或,2个操作数都为假,结果才为真,否则为真
int a = 10;
int b = 20;
//两个都为假
System.out.println(a == b || a > b);
//左边为假右边为真
System.out.println(a == b || a < b);
//左边为真右边为假
System.out.println(a < b || a == b);
//两个都为真
System.out.println(a != b || a < b);
结果为
直白说就是有真即为真
3.3 !
这个最简单,真为假,假为真,就是取对立面。
3.4 短路
&& 遇到boolean为true的就结束运算,不管后面还有没有表达式。
同理,|| 遇到boolean为false的就结束运算。
int a = 10;
int b = 20;
System.out.println(a > b && a++ == 10);
System.out.println(a);
结果为
这一段代码中由于 a > b 为假,所以后面a++的运算根本不会执行。可以对比下面的代码来看:
int a = 10;
int b = 20;
System.out.println(a < b && a++ == 10);
System.out.println(a);
结果为
|| 的例子就自己动手来实践吧,不会的可以评论区讨论哦。
4.位运算符
位运算符主要有四种:& | ~ ^
特别提醒:作用对象都是二进制数字
& 按位与
有0则取0,否则为1。
为了更好理解:把0看为假,1看做真,只有都为真才是真(1)。
特别提醒:上述方法只是为了更好记忆理解,在Java中,boolean类型只有true和false。这和C语言是不同的。
看实例:
结果是:0000 1000,为8
| 按位或
有1则取1,否则为0。
理解技巧和&同理,看实例:
结果是:0001 1110,2+4+8+16=30
~ 按位取反
如果该位为 0 则转为 1, 如果该位为 1 则转为 0
看实例:b = 28,对应二进制为0001 1100,按位取反后:1110 0011,注意了!这里符号位为1,说明是负数,正数原、反、补码相同,可以不考虑。
得到的1110 0011是补码,原、反、补码的关系为:
{原码} —> [符号位不变,其他位按位取反] —> {反码} —>[+1]—> {补码}
所以逆过来,先-1,得到1110 0010。再保留符号位,其他位按位取反,1001 1101。颅内运算一下:-(1+4+8+16)=-29
^ 按位异或
两个位相异位1,相同为0。
为了更好理解:异或在于异,就是两个位相异,就按位或,取1
看实例:
short a = 5;
//0000 0101
short b = 28;
//0001 1100
System.out.println(a ^ b);
结果为
结果为:0001 1001,1+8+16=25。
^ 实战:找数字
初级版
找出数组中只出现一次的数字,其它数字都出现了两次
public static void main(String[] args) {
int[] arr = new int[] { 1, 1, 3, 8, 8 };
int temp = 0;
for (int j : arr) temp ^= j;
System.out.println(temp);//结果为3
}
进阶版
找出数组中只出现一次的数字(2个),其它数字都出现了两次
public static void main(String[] args) {
int[] arr = new int[] { 1, 1, 3, 4, 8, 8 };
int temp = 0;
for (int j : arr) temp ^= j;
//get 3^4 -> 0111
//divide into two groups
int[] res = new int[2];
temp &= -temp;
for (int j : arr) {
if ((temp & j) == 0)
res[0] ^= j;
else
res[1] ^= j;
}
for (int re : res) {
System.out.printf("%d ", re);
}
}
5.移位运算
移位运算符有三个:
1.<< 左移
2.>> 右移
3.>>> 无符号右移
作用对象依然是二进制数字
5.1 <<
最左侧位丢掉,右边补0
结果为:0011 1000;8+16+32=56
很明显,就是*2的效果
5.2 >>
最右侧位丢掉, 最左侧补符号位(正数补0, 负数补1)
结果为:0000 1110;8+4+2=14
和上文同理,就是/2的效果
5.3 >>>
最右侧位丢掉, 最左侧补0
这里数字之所以会很大,是发生了强制类型转换(int)
6.条件运算符
条件运算符only one:
(布尔表达式1) ? (表达式2) : (表达式3)
来看例子:
通俗地说,就是a > b吗?为真就执行a,否则就执行b
总结
语言都是相同的,我相信你可以看到一些语言的影子或是再现。不过一定要弄清区别,万万不可混淆语法和应用。好记性不如烂笔头,把这些操作符的计算过程自己用电脑写写,一定会有不一样的收获。
各位,一起加油吧!