文章目录
一、变量与类型
变量指的是程序运行时可变的量. 相当于开辟一块内存空间来保存一些数据.
类型则是对变量的种类进行了划分, 不同的类型的变量具有不同的特性。
java中有8大基本类型,大概分为:整形(byte、short、int、long)、浮点型(float、double)、布尔型(boolean)、字符型(char)。
1.1整形变量(int)
在java中int占四个字节,而一个字节占四个比特位,所以一个int声明的变量占32个比特位,所以int能存储数值范围为[2^31, 2 ^31-1],为什么最大的值取不到2 ^ 32,因为虽然它占32个比特位,但是它的第一个二进制位是符号位,0表示正数,1表示负数,所以int所能表示最大的正数为0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 。所以最大值取不到2 ^31 。(对这块知识较为模糊的小伙伴推荐看一下这篇文章深度剖析数据在内存中的存储(原码、补码、反码、大小端、面试题)
https://blog.csdn.net/m0_49622667/article/details/119107796?spm=1001.2014.3001.5501)我们也可以通过代码验证:
public class Test {
public static void main(String[] args) {
//Integer是java中的类,其中的MAX_VALUE和MIN_VALUE可以
//查看int所能存储数值的最大值和最小值
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
此时的范围刚好是[2^31, 2 ^31-1],我们在平时写代码的时候要注意变量的取值范围,稍不注意,代码运行结果就会超乎你的想象,比如:
public class Test {
public static void main(String[] args) {
int a=2147483647;
System.out.println(++a);
}
}
你本来想输出的数是2147483648;但结果却是:
21亿这样的数字对于当前的大数据时代来说, 是很容易超出的. 针对这种情况, 我们就需要使用更大范围的数据类型来表示了. Java 中提供了 long 类型
1.2长整形变量(long)
长整形变量占8个字节,表示的数据范围为[2 ^63,2 ^63-1],我们也可以通过以下方法查看java中的长整形的数据范围:
public class Test {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
}
}
在使用long定义变量初始化时,可以用以下两种方式,但更推荐使用第二种,因为有时候可能会把小写的L错认为是数字1
//第一种方法
long a=10l;
//第二种方法
long b=10L;
1.3双精度浮点型变量(double)
java中的double占8个字节,但是浮点数的内存分布和整数差别很大,不能直接用2 ^n确定数据范围。
(对这块知识较为模糊的小伙伴推荐看一下这篇文章深度剖析数据在内存中的存储(原码、补码、反码、大小端、面试题)
https://blog.csdn.net/m0_49622667/article/details/119107796?spm=1001.2014.3001.5501)
我们看下面的代码:
代码一:
int a = 1;
int b = 2;
System.out.println(a / b)
这串代码执行结果为0;因为两个整形相除,结果必然是整形,会舍弃掉小数点后的数据,若要输出结果为0.5,可以将a,b都定义为浮点数:
double a = 1.0;
double b = 2.0;
System.out.println(a / b);
或者将a,b中的其中一个强制类型转换为double类型(下文会对强制类型转换进行讲解):
int a=1;
int b=2;
System.out.println((double)a/b);
代码二:
double num = 1.1;
System.out.println(num * num);
结果不是1.21而是1.2100000000000002,这是因为造成了精度丢失,我们可以通过
String 结合 BigDecimal来转换解决。
1.4单精度浮点型变量(float)
float在java中占4个字节,由于表示的数据精度范围较小,所以我们一般使用double,而尽量避免使用float,这就是很多人在刷OJ题时由于使用了float导致提交失败的原因。
1.5 字符类型变量(char)
char在java中占2个字节,但是在C语言中char占一个字节,这是因为在C语言中使用ASCLL表示字符,java中使用Unicode表示字符,这样编码的好处就是char表示的字符种类更多,包括中文。
很多人在写代码时用char定义了汉字,在使用javac编译时通过不了,这时需要加上-encoding UTF-8即可
例:javac -encoding UTF-8 Test.java
1.6字节类型变量(byte)
字节类型表示的也是整数. 只占一个字节, 表示范围较小 ( -128 -> +127 ),字节类型和字符类型互不相干
1.7短整型变量(short)
short 占用 2 个字节, 表示的数据范围是 -32768 -> +32767, 这个表示范围比较小, 一般不推荐使用.
1.8布尔类型变量(Boolean)
1.boolean 类型的变量只有两种取值, true 表示真, false 表示假.
2. Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.
3. boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 这个没有明确规定
1.9变量的命名规则
硬性指标:
- 一个变量名只能包含数字, 字母, 下划线
- 数字不能开头.
- 变量名是大小写敏感的. 即 num 和 Num 是两个不同的变量.
注意: 虽然语法上也允许使用中文/美元符($)命名变量, 但是 强烈 不推荐这样做.
软性指标: - 变量命名要具有描述性, 见名知意.
- 变量名不宜使用拼音(但是不绝对).
- 变量名的词性推荐使用名词.
- 变量命名推荐 小驼峰命名法, 当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大
写.
1.10类型转换
看以下代码:
int a = 10;
long b = 20;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过.
int a = 10;
double b = 1.0;
a = b; // 编译出错, 提示可能会损失精度.
b = a; // 编译通过
结论:不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型,反之则需要类型转换。
可以这样理解,表示范围小的变量赋值给范围较大的时候,相当于从茅草屋搬到小洋楼,空间变大了,当然能很容易转换,但要是反过来的话,从小洋楼搬到茅草屋肯定搁谁都不乐意,所以要强制转换,一定要让他去住茅草屋,同时从茅草屋空间小,肯定装不完从小洋楼搬过去的所有东西,所以可能会有精度丢失。
二、运算符
2.1算术运算符
假设整形变量A的值为10,B的值为20
B++称为后置加加,既执行完当前语句后执行B+1;++B称为前置加加,既先执行B+1,后执行当前语句。(B–和--B同样)
int a=1;
System.out.println(a--);//结果为1;执行完该语句后a的值变为0
int b=1;
System.out.println(--b);//结果为0;执行完该语句后b的值变为0
2.2逻辑运算符
假设布尔变量A为真,B为假
逻辑与运算符的短路:
当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
2.3位运算符
位运算符主要有4个:& | ~ ^
位操作表示 按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的
每一位依次进行计算.
按位与 &: 如果两个二进制位都是 1, 则结果为 1, 否则结果为 0
按位或 |: 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1
按位取反 ~: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0
按位异或 ^: 如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1
2.4条件运算符
也就是常说的三目运算符
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值
例如:
int a = 10;
int b = 20;
int max = a > b ? a : b
因为a>b为假,所以将b的值赋值给max。
喜欢的话记得点赞收藏哦,我会继续分享学习内容。