JAVA中数据类型(变量和运算符)
数据类型
什么是变量
变量指的是程序运行时可变的量. 相当于开辟一块内存空间来保存一些数据。
变量
1、整数类型
1.1 字节型变量
byte 变量名 = 初始值;
1. 字节类型表示的也是整数. 只占一个字节, 表示范围较小 ( -128 -> +127)
2. 字节类型和字符类型互不相干。
1.2 短整型变量
short 变量名 = 初始值;
short 占用 2 个字节, 表示的数据范围是 -32768 -> +32767。
1.3 整型变量
int 变量名 = 初始值 ;
**在 Java 中, 一个 int 变量占 4 个字节. 和操作系统没有直接关系。
4 个字节表示的数据范围是 -2^31 -> 2^31-1, 也就大概是 -21亿 到 +21亿。
1.4 长整型
long 变量名 = 初始值;
1. 基本语法格式和创建 int 变量基本一致, 只是把类型修改成 long
2. 初始化设定的值为 10L, 表示一个长整型的数字
3. Java 中 long 类型占 8 个字节. 表示的数据范围 -2^63 -> 2^63-1
2、浮点数类型
2.1 单精度浮点型变量
float 变量名 = 初始值;
float 类型在 Java 中占四个字节,一般在工程上用到浮点数都 优先考虑 double, 不太推荐使用 float.
2.2 双精度浮点型变量
double 变量名 = 初始值;
在 Java 中, int 除以 int 的值仍然是 int(会直接舍弃小数部分). 如果想得到 0.5, 需要使用 double 类型计算.
Java 中的 double 也是 8 个字节, 但是浮点数的内存布局和整数差别很大, 不能单纯的用 2 ^ n 的形式表示数据范围.
Java 的 double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差.
3、字符类型变量
char 变量名 = 初始值;
1. Java 中使用 单引号 + 单个字母 的形式表示字符字面值.
2. 计算机中的字符本质上是一个整数. 在 C 语言中使用 ASCII 表示字符, 而 Java 中使用 Unicode 表示字符. 因此一 个字符占用两个字节, 表示的字符种类更多, 包括中文.
3. 使用一个字符表示一个汉字的时候,执行javac出现错误要加上 -encoding utf-8
4、布尔类型变量
boolean 变量名 = 初始值;
1. boolean 类型的变量只有两种取值, true 表示真, false 表示假.
2. Java 的 boolean 类型和 int 不能相互转换, 不存在 1 表示 true, 0 表示 false 这样的用法.
3. boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 这个没有明确规定.
5、字符串类型
String 变量名 = “初始值”;
1. Java 使用 双引号 + 若干字符 的方式表示字符串字面值.
4. 和上面的类型不同, String 不是基本类型, 而是引用类型(后面重点解释).
5. 字符串中的一些特定的不太方便直接表示的字符需要进行转义.
运算符
1、 算术运算符
基本四则运算符: + - * / %
a) int / int 结果还是 int, 需要使用 double 来计算.
b) 0 不能作为除数
c) % 表示取余, 不仅仅可以对 int 求模, 也能对 double 来求模
增量赋值运算符 += -= *= /= %=
自增/自减运算符: ++ –
1. 如果不取自增运算的表达式的返回值, 则前置自增和后置自增没有区别.
2. 如果取表达式的返回值, 则前置自增的返回值是自增之后的值, 后置自增的返回值是自增之前的值.
2、关系运算符
关系运算符主要有六个:
== != < > <= >=
关系运算符的表达式返回值都是 boolean 类型.
3、逻辑运算符
逻辑运算符主要有三个:
&& || !
逻辑运算符的操作数(操作数往往是关系运算符的结果)和返回值都是 boolean .
逻辑或 ||
规则: 两个操作数都为 false, 结果为 false, 否则结果为 true
逻辑非 !
操作数为 true, 结果为 false; 操作数为 false, 结果为 true(这是个单目运算符, 只有一个操作数).
短路求值
&& 和 || 遵守短路求值的规则.
1. 对于 && , 如果左侧表达式值为 false, 则表达式的整体的值一定是 false, 无需计算右侧表达式.
2. 对于 ||, 如果左侧表达式值为 true, 则表达式的整体的值一定是 true, 无需计算右侧表达式.
& 和 | (不推荐使用)
& 和 | 如果操作数为 boolean 的时候, 也表示逻辑运算. 但是和 && 以及 || 相比, 它们不支持短路求值
4、位运算符
Java 中对数据的操作的最小单位不是字节, 而是二进制位.
位运算符主要有四个:
& | ~ ^
位操作表示按二进制位运算. 计算机中都是使用二进制来表示数据的(01构成的序列), 按位运算就是在按照二进制位的每一位依次进行计算.
按位与 & :
如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.
7 的二进制为:00000111
-5的二进制为:10000101
-5的补码为: 11111010 + 1 11111011
00000111&11111011:
00000111
11111011
00000011——>对应十进制的3
按位或 | :
如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.
2的二进制位: 0000 0010 -6的二进制位:1000 0110
-6的补码: 1111 1010
运算结果:1111 1010
计算原码:1000 0110
相当于十进制位的:-6
当 & 和 | 的操作数为整数(int, short, long, byte) 的时候, 表示按位运算, 当操作数为 boolean 的时候, 表示逻辑运算.
按位取反 ~ :
如果该位为 0 则转为 1, 如果该位为 1 则转为 0
-6的二进制位:1000 0110
-6的补码: 1111 1010
计算结果: 0000 0101
相当于十进制:5
注意:按位非是单目运算符。
1. 0x 前缀的数字为 十六进制 数字. 十六进制可以看成是二进制的简化表示方式. 一个十六进制数字对应 4 个二进制位.
2. 0xf 表示 10 进制的 15, 也就是二进制的 1111
3. printf 能够格式化输出内容, %x 表示按照十六进制输出.
4. \n 表示换行符
按位异或 ^ :
如果两个数字的二进制位相同, 则结果为 0, 相异则结果为 1.
2的二进制位: 0000 0010
-6的二进制位:1000 0110
-6的补码: 1111 1010
计算结果: 1111 1000
原码: 1000 1000
相当于十进制位:-8;
5、位运算符
移位运算符有三个:
<< >> >>>
都是按照二进制位来运算.
左移 << :
最左侧位不要了, 最右侧补 0.
右移 >> :
最右侧位不要了, 最左侧补符号位(正数补0, 负数补1)
无符号右移 >>> :
最右侧位不要了, 最左侧补 0.
1. 左移 1 位, 相当于原数字 * 2. 左移 N 位, 相当于原数字 * 2 的N次方.
2. 右移 1 位, 相当于原数字 / 2. 右移 N 位, 相当于原数字 / 2 的N次方.
3. 由于计算机计算移位效率高于计算乘除, 当某个代码正好乘除 2 的N次方的时候可以用移位运算代替.
4. 移动负数位或者移位位数过大都没有意义.
6、条件运算符
条件运算符只有一个:
表达式1 ? 表达式2 : 表达式3
当 表达式1 的值为 true 时, 整个表达式的值为 表达式2 的值; 当 表达式1 的值为 false 时, 整个表达式的值为 表达式3 的值.也是 Java 中唯一的一个 三目运算符, 是条件判断语句的简化写法.
总结:
1. % 操作再 Java 中也能针对 double 来计算.
2. 需要区分清楚 前置自增 和 后置自增之间的区别.
3. 由于 Java 是强类型语言, 因此对于类型检查较严格, 因此像 && 之类的运算操作数必须是 boolean.
4. 要区分清楚 & 和 | 什么时候是表示按位运算, 什么时候表示逻辑运算.整体来看, Java 的运算符的基本规则和 C 语言基本一致.