一、Java八大基本数据类型
- byte:字节整型,占用内存大小1个字节=8bit,取值范围 -27 ~ 27-1(-128 ~ 127)
- short:短整型,占用内存大小2个字节=16bit,取值范围 -215 ~ 215-1(-32768 ~ 32767)
- int:整型,占用内存大小4个字节=32bit,取值范围 -231~ 231-1(-2147483648 ~ 2147483647)
- long:长整型,占用内存大小8个字节,取值范围 -263~ 263-1(-9223372036854775808 ~ 9223372036854775807)
- float:浮点型,占用内存大小4个字节=32bit(其中1位符号位+8位指数位+23位小数位),取值范围约 -3.4*1038 ~ 3.4*1038
- double:双精度浮点型,占用内存大小8个字节=64biit(其中1位符号位+11位指数位+52位小数位),取值范围约 -1.7977*10308 ~ 1.7977*10308
- char:字符型,无符号数据类型,占用内存大小2个字节=16bit,取值范围 0 ~ 216-1('/u0000' ~ '/uFFFF')
- boolean:布尔类型,一个boolean值实际信息有效大小为1个bit(true或false),JDK8《虚拟机规范》规定编译之后一个boolean值用一个int值来表示,一个布尔值占用4个字节,而boolean数组将被编码成byte数组,此时一个boolean值占用1个字节。布尔数值实际占用内存还得看虚拟机不同版本的具体实现
对于boolean类型内存占用在JDK8《虚拟机规范》中的原话如下:
Although the Java Virtual Machine defines a boolean
type, it only provides very limited support for it. There are no Java Virtual Machine instructions solely dedicated to operations on boolean
values. Instead, expressions in the Java programming language that operate on boolean
values are compiled to use values of the Java Virtual Machine int
data type.
The Java Virtual Machine does directly support boolean
arrays. Its newarray instruction (§newarray) enables creation of boolean
arrays. Arrays of type boolean
are accessed and modified using the byte
array instructions baload and bastore (§baload, §bastore).
In Oracle’s Java Virtual Machine implementation, boolean
arrays in the Java programming language are encoded as Java Virtual Machine byte
arrays, using 8 bits per boolean
element.
The Java Virtual Machine encodes boolean
array components using 1
to represent true
and 0
to represent false
. Where Java programming language boolean
values are mapped by compilers to values of Java Virtual Machine type int
, the compilers must use the same encoding.
注:0X或0x前缀的整型数据为16进制数,0前缀的整型数据为8进制数,从JDK7开始,加上前缀0b或0B为二进制数。L后缀的整型为long型,F或f后缀的数值为float型,D或d后缀的数值为double型。
注:如果需精确计算且基本数据类型的精度和取值范围不能满足要求,可以使用java.math包中的两个类,BigInteger(实现了任意精度的整数运算)和BigDecimal(实现了任意精度的浮点数运算)。
二、Java运算符
1、算数运算符:+、-、*、/ 表示加、减、乘、除运算,% 表示整数的求余运算
注:不用数据类型的数据之间的算数运算,将会自动进行隐式数据类型装换。如果两个数中有double类型,其中非double型会装换成double型进行计算;否则,如果两个数中有float类型,另一个数会转换成float类型再进行运算;否则,如果两个数中有long类型,另一个数会转换成long类型进行运算;如果两个数没有double类型、float类型,long类型,则全部都通过隐式转换成int类型后再进行运算(基本原理是取值范围较小的数据类型可以自动向取值范围更大的数据类型进行合法的隐式转换),合法的隐式转换如下图:
代码示例:
1 public class test1 { 2 public static void main(String[] args) { 3 char cr=1; 4 char cr2=1; 5 byte bt=2; 6 char bt2=2; 7 short st=3; 8 short st2=3; 9 int it=4; 10 long lg=5; 11 float ft=6; 12 double db=7; 13 14 //测试char和char相加 15 if((Object)(cr+cr2) instanceof Character){ 16 System.out.println("char类型 加 char类型 得到 char类型;"); 17 } 18 if((Object)(cr+cr2) instanceof Integer){ 19 System.out.println("char类型 加 char类型 得到int类型;"); 20 } 21 22 //测试byte和byte相加 23 if((Object)(bt+bt2) instanceof Integer){ 24 System.out.println("byte类型 加 byte类型 得到 int类型;"); 25 } 26 if((Object)(bt+bt2) instanceof Byte){ 27 System.out.println("byte类型 加 byte类型 得到 byte类型;"); 28 } 29 30 //测试short和short相加 31 if((Object)(st+st2) instanceof Integer){ 32 System.out.println("char类型 加 byte类型 得到 int类型;"); 33 } 34 if((Object)(st+st2) instanceof Short){ 35 System.out.println("char类型 加 byte类型 得到 short类型;"); 36 } 37 38 //测试char和byte类型相加 39 if((Object)(cr) instanceof Character){ 40 System.out.println("char类型 加 byte类型 得到 char类型;"); 41 } 42 if((Object)(cr+bt) instanceof Byte){ 43 System.out.println("char类型 加 byte类型 得到 byte类型;"); 44 } 45 if((Object)(cr+bt) instanceof Integer){ 46 System.out.println("char类型 加 byte类型 得到 int类型;"); 47 } 48 49 //测试char和short类型相加 50 if((Object)(cr+st) instanceof Character){ 51 System.out.println("char类型 加 short类型 得到 char类型;"); 52 } 53 if((Object)(cr+st) instanceof Short){ 54 System.out.println("char类型 加 short类型 得到 short类型;"); 55 } 56 if((Object)(cr+st) instanceof Integer){ 57 System.out.println("char类型 加 short类型 得到 int类型;"); 58 } 59 60 //测试byte和short类型相加 61 if((Object)(bt+st) instanceof Byte){ 62 System.out.println("short类型 加 byte类型 得到 byte类型;"); 63 } 64 if((Object)(bt+st) instanceof Short){ 65 System.out.println("short类型 加 byte类型 得到 short类型;"); 66 } 67 if((Object)(bt+st) instanceof Integer){ 68 System.out.println("short类型 加 byte类型 得到 int类型;"); 69 } 70 71 //测试int 和 long 相加 72 if((Object)(it+lg) instanceof Long){ 73 System.out.println("int类型 加 long类型 得到 long类型;"); 74 } 75 if((Object)(it+lg) instanceof Integer){ 76 System.out.println("int类型 加 long类型 得到 int类型;"); 77 } 78 79 //测试float和long相加 80 if((Object)(ft+lg) instanceof Long){ 81 System.out.println("float类型 加 long类型 得到 long类型;"); 82 } 83 if((Object)(ft+lg) instanceof Float){ 84 System.out.println("float类型 加 long类型 得到 float类型;"); 85 } 86 87 //测试float和double相加 88 if((Object)(ft+db) instanceof Float){ 89 System.out.println("float类型 加 double类型 得到 float类型;"); 90 } 91 if((Object)(ft+db) instanceof Double){ 92 System.out.println("float类型 加 double类型 得到 double类型;"); 93 } 94 95 96 97 }
代码输出:
2、递增递减运算符:前缀递增运算符 ++ 变量 和前缀递减运算符 -- 变量,进行运算时,会先对变量的值进行递增和递减,直接获得这个变量递增1或递减1后的值并带入运算;后缀递增运算符 变量++ 和后缀递减运算符 变量--, 进行运算时,会先获得这个变量的原值代入计算,运算完之后再对该变量执行递增1或递减1运算。
3、关系操作符:计算操作数的值之间的关系,得到一个boolean值,关系成立为true,不成立为false。有<(小于) >(大于) <=(小于或等于) >=(大于或等于) ==(等于)
4、逻辑操作符:根据参数的逻辑关系,生成一个boolean值。有 &&(与) ||(或) !(非)
5、按位操作符:对一个或两个整型参数参数的二进制表示执行布尔代数运算,最终生成一个结果。有 &(按位与) |(按位或) ~(按位取反) ^ (按位异或),其中只有按位取反 ~ 是一元操作符,不可以和=联合使用,如 ~= 是错误的。
6、移位操作符:对一个整型参数的二进制表示进行整体前后移动的操作,最终生成一个结果。有 <<(左位移操作符,将二进制数整体左移指定的位数,二进制数左边超出长度的部分截取掉,右边空出的部分补0); >> (有符号右移操作符,将二进制数整体右移指定的位数,二进制数右边超出长度的部分截取掉,左边空出的部分补0并保持符号位与移位前保持一致,正数为0负数为1); >>> (无符号右移操作符,将二进制数整体右移指定的位数,二进制数右边超出长度的部分截取掉,左边空出的部分补0,符号位若空出也是补0)
7、三元操作符: 布尔表达式:value1:value2 如果布尔表达式为true,计算value1,且value1就是操作符的运算结果;如果布尔表达式为false,计算value2,且value2就是操作符的运算结果。
8、类型转换操作符:(强制转换的类型) 可以强制把一个数据(或对象)的类型装换成目标类型。 如 long a=123456789; int b=(int)a;
注:如果把大取值范围基本数据类型的数据窄化为小取值范围的基本数据,如double 装换为 int,可能因为数据的溢出或精确度发生变化对数字执行的截尾(如浮点型强转整型,会对数字执行截尾,不会进行四舍五入)导致计算出现较大偏差。