1. Java基本数据类型
Java是一种强类型预览,必须为每一个变量声明一种类型
| 类型 | 意义 | 取值 |
|---|---|---|
| boolean | 布尔值 | true或false |
| byte | 8位有符号整型 | -128~127 |
| short | 16位有符号整型 | -pow(2,15)~pow(2,15)-1 |
| int | 32位有符号整型 | -pow(2,31)~pow(2,31)-1 |
| long | 64位有符号整型 | -pow(2,63)~pow(2,63)-1 |
| float | 32位浮点数 | IEEE754标准单精度浮点数 |
| double | 64位浮点数 | IEEE754标准双精度浮点数 |
| char | 字符型 | 16位不带符号,Unicode字符 |
整型
int 数值正好超过20亿
long 赋值时一般在数字后加上 l 或 L。
int 类型最常用。但如果表示星球上的居住人数,就需要使用long类型了
整型范围与运行Java代码的机器无关;Java 程序必须保证在所有机器上都能够得到相同的运行结果;在 C 和 C++ 中,int 和 long 等类型的大小与目标平台相关。
16进制前缀0x或0X;8进制前缀0;Java1.7后,2进制前缀0b或0B,数字字面量允许加下划线:1000_0000_0000(表示1000亿,更好阅读),编译器会去除这些下划线
Java 没有任何无符号(unsigned) 形式的 int、long、short 或 byte类型
浮点型
float,直接赋值时必须在数字后加上 f 或 F。有效位数为6-7位
double,赋值时一般在数字后加 d 或 D 。有效位数为15位
表示溢出、出错的三个特殊的浮点数值:正无穷大、负无穷大、NaN(不是一个数字);例如:正数/0 结果为正无穷大,0/0 或负数平方根结果为NaN
常量 Double_INFINITY、Double.FINITY 和 Double.NaN (以及相应的 Float 类型的常量)分别表示这三个特殊的值, 但在实际应用中很少遇到。
// 判断是否是“非数值”
boolean flag = Double.isNaN(0/0);
浮点数值不适用于无法接受舍入误差的金融计算中,主要 原因是浮点数值采用二进制系统表示, 而在二进制系统中无法精确地表示 0.1;0.1 用二进制表示无线循环,进行舍入,有误差
字符型
char中存储 Unicode 码,用单引号赋值。
有的Unicode可以用一个char值描述,有的需要两个(例如emoji表情,4个字节)
char类型的字面量值要用单引号括起来
char类型的值可以表示为十六进制值,其范围从\u0000到\uffff;\u表示他后面是一个Unicode编码的字符。但是是十六进制的。
Unicode转义序列会在解析代码之前得到处理。"\u0022+\u0022"会解析为""+"" 也就是一个空串;也要当心注释中的\u ,如
// Look inside c:\users
会产生语法错误,因为 \u后面跟了4个16进制数
强烈建议不要在代码中使用char 类型,除非确实需要处理 UTF-16 代码单元
布尔型
boolean - 只有 true 和 false 两个取值
整型值与布尔值之间不能互换
2. 基本数据类型的运算
当参与 / 运算的两个 操作数都是整数时, 表示整数除法(结果向下取整);否则, 表示浮点除法。
整数的求余操作(有时称为取模) 用 % 表示;例如,15/2 == 7,15%2 == 1, 15.0/2 == 7.5
整数被 0 除将会产生一个异常, 而浮点数被 0 除将会得到无穷大或NaN结果
数值类型之间的转换
有6个实心箭头,表示无信息丢失的转换;有3个虚箭头,表示可能有精度损失的转换
例如:
int n = 123456789;
float f= n;//f is 1.23456792E8 (6-7位有效)
n + f,n 是整数,f 是浮点数), 先要将两个操作数转换为同一种类型,然后再进行计算
如果两个操作数中有一个是 double 类型, 另一个操作数就会转换为 double 类型。
否则,如果其中一个操作数是 float 类型,另一个操作数将会转换为 float 类型。
否则, 如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型。
否则, 两个操作数都将被转换为 int 类型。
double是最终的数据类型 :)
byte -> short(char) -> int -> long -> float -> double
强制类型转换
语法:强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。
double x = 9.97;
int nx = (int) x; // nx的值为9,通过截断小数部分将浮点值转换为整型
可以利用Math.round() 对浮点数进行舍入运算;四舍五入
如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。
byte a =(byte) 300 // a的实际值为 44。
结合赋值与运算符
x += 4 等价于 x = x + 4;一般要把运算符放在=号左边
如果运算符得到一个值, 其类型与左侧操作数的类型不同, 就会发生强制类型转换。
int x = 1;
x += 3.5; // x为4,等价于 x = (int)(x + 3.5)
自增、自减运算符
n++/++n 将变量 n 的当前值加 1, n--/--n则将 n 的值减 1
由于这些运算符会改变变量的值,所以它们的操作数不能是数值。4++(这样是错误的)
在表达式中,前缀、后缀有区别
int n = 1;
int a = n ++; // a = 1, n = 2;先进行 a 的运算,再进行 n 的运算;
int n = 1;
int a = ++ n; // a = 2, n = 2;先进行 n 的运算,再进行 a 的运算;
关系和boolean运算符
==, >=, >, <, <=, !=, &&, ||, ?:(三元运算符)
位运算符
处理整型类型时,可以直接对组成整型数值的各个位完成操作;这意味着可以使用掩码技术得到整数中的各个位
& ("and"), | ("or"), ^ ("xor"), ~("not")
还有<< 和 >>运算符将位模式左移或右移
>>> 运算符会用0填充高位,>> 会用符号位填充高位;不存在 <<<
移位运算符的右操作数要完成模 32(4字节) 的运算(除非左操作数是 long 类型, 在这种情 况下需要对右操作数模 64(8字节) )。 例如,1 << 35 的值等同于 1 << 3 或 8。
位掩码技术:利用 & 并结合使用适当的 2 的幂, 可以把其他位掩掉, 而只保留其中的某一位。
位掩码实例:
/*
0b00011000(24)
&0b00001000(8) // 0b00000001(1) << 3 -> 0b000001000(8)
=0b00001000(8) // 0b00001000(8) >> 3 -> 0b000000001(1)
原理
x & 0 = 0
x & 1 = x
用0把某一位掩住,用1显示出某一位,再移位
*/
int fourthBitFromRight = (24 & (1 << 3)) >> 3
括号与运算符级别
如果不使用圆括号, 就按照给出的运算符优先级次序进行计算。同一个级别的运算符按照从左到右的次序进行计算(除了表中给出的右结合运算符外)。
例如:a && b || c 等价于 (a && b) || c