Java基础篇——基本数据类型
作者:xcbeyond
疯狂源自梦想,技术成就辉煌!微信公众号:《程序猿技术大咖》号主,专注后端开发多年,拥有丰富的研发经验,乐于技术输出、分享,现阶段从事微服务架构项目的研发工作,涉及架构设计、技术选型、业务研发等工作。对于Java、微服务、数据库、Docker有深入了解,并有大量的调优经验。
1、基本数据类型:(8种基本数据类型)
4个整型:int short long byte 默认类型:int
2个浮点型:double float 默认类型:double
1个字符型:char
1个布尔型: boolean
注:在使用每种数据类型时,切记不要超过其取值范围,以免出现溢出异常!
1>、整型
整数在内存空间中是按照其补码存储的,如:
-1存储在一个byte中为:1111 1111
127存储在一个byte中为:0111 1111
-128存储在一个byte中为:1000 0000
则整数在存储时,把最高位当做符号位来处理了,于是也就解释了其各种整型类型的取值范围的由来。
类型
存储要求
取值范围
int
4字节(32bit)
-2^31---2^31-1
shor
2字节(16bit)
-2^15—2^15-1
long
8字节(64bit)
-2^63—2^63-1
byte
1字节(8bit)
-2^7—2^7-1
整型默认的数据类型为int ,如:long a = 127; 127就是int型的,它最终经过自动类型转换了。
实例分析:
int size=1024*1024*1024*2;
System.out.println(size);//-2147483648
由于int型最大取值为2G-1,则size取值溢出了,但此时编译时却不会报错,为何?因为这种int size=1024*1024*1024*2 写法骗过了编译器(编译器编译时只是分别检测1024、1024、1024、2的值,而不加以对其运算后再做出判断是否溢出),使得编译器不会报错。可size的输出结果顺利成章的就是-2147483648(溢出导致结果为负值了)。对于int size = 2147483648;(2147483647=1024*1024*1024*2)这种方式的声明,编译器就会报错了,2147483648显然超过了int型的范围,即溢出了。(int size=1024*1024*1024*2 和int size = 2147483648在分配内存时是不同的哦!)
2>、浮点型 float double
浮点型默认的类型为:double,如 2.9就属于double型
注意:3 3L 3D 3F是完全不同的几个数值
float和double都是按照浮点数存储规则来存储的,这种存储方式并不能精确的表示数值,它们的取舍都是按照二进制数进行取舍的。
不要打算比较两个浮点数是否相等,虽然语法没错,但是由于它们本身就是不精确的,将会得到不正确的判断结果,因此可以用这两个浮点数之差的绝对值是否小于一个足够小的数来进行判断。如:
double a = 1.2;
double b = 2.0-0.8;
if(Math.abs(a-b)<1e-6){
System.out.print("a=b");
}
3>、字符型 char
Char类型其实也是一种整形,它与short的唯一区别是char无符号,它可以参与整数的所有运算。
2、类型转换
1>、自动类型转换
如:int a = 'A';
转换原则:低精度(小范围)类型向高精度(大范围)类型自动类型转换
即:byte->short->int->long->float->double
2>、强制类型转换
如:int a=127;
byte bx=(byte)a;
而:byte bx=a; //错 无法自动类型转换
强制转化可能有数据和精度的丢失或异常,也有可能改变数据的正负性,如:
byte b = (byte)0x1ff;
System.out.println(b); //-1
3、运算符
1〉、算术运算符:+ - * / % += -= ……
· 当除法“/”运算时,两个数都是整数,表示整数除法,结果为整数,反之表示浮点除法,如:9/2=4 ,9.0/2=4.5
·大多数人认为:a+=4是a=a+4的简写形式,是完全等价的,其实不然,它们并不完全等价,它们一个使用简单赋值运算,一个使用复合赋值运算,而简单赋值运算和复合赋值运算的最大差别就在于:复合赋值运算会自动地将运算结果转型为其左操作数的数据类型。如:
a、byte a = 4;
a+=1;
b、byte a = 4;
a = a+1;
方法a的写法编译时是没有问题的,而b写法却编译不通过。原因就在于,当使用复合赋值运算符进行操作时,即使右边算出的结果是int型,系统也会将其转化为左边的byte类型,而使用简单赋值运算时没有这样的优待,系统就会将a+1的值赋给a是将int类型赋给byte,所以要求强制转化。理解了这一点后,再看看这个:
byte b = 120;
b+=20;
System.out.print("b="+b);
然而,输出结果b=-116,而不是140。因为120+20的值已经超过了byte的范围,而当我们使用复合赋值运算时系统会自动作类型的转化,将140强制转化成byte,所以得到的是-116.由此可见,在使用复合赋值运算时一定要小心哦,因为这种类型的转化是在不知不觉中进行的,所以得到的结果就有可能和你预想的不一样了。
2〉、关系与逻辑运算: >、 >= 、 <、<=、 !=、|、||、&、&&
& | 是非短路运算
&& || 是短路运算
短路运算:如果第一个表达式已经能够判断其值,则第二个表达式就不必要判段了。
常用于短路运算&& ||
3〉、自增运算符:++ , --
i++ ,先将i的值作为整个表达的值,然后将i增加1
++i,先将i增加1,然后将i的值作为整个表达的值
如:
int a = 1;
int b = 1;
b =a++; //b=1 ,a=2
(关于++运算符,++构成了C++语言的名称,在此也引起了一个笑话。C++的反对者认为C++的名称本身就存在bug,应该是++C,他们认为:"只有对它改进之后,才可以使用它,所以它的名字应该命名为++C"。说这个笑话也就是为了更好的理解++运算符的使用,增添一点笑料罢了,O(∩_∩)O~!)
++运算符常可以模仿发牌过程:
int i = 0;
int a = i++%5;//a=0
a = i++%5;//a=1
a = i++%5;//a=2
a = i++%5;//a=3
a = i++%5;//a=4
a = i++%5;//a=0
a = i++%5;//a=1
a = i++%5;//a=2
a = i++%5;//a=3
a = i++%5;//a=4
4〉、条件运算符:(三目运算符)
(布尔表达式)?(true表达式):(false表达式)
如:
//计算分页数量
int rows = 23;//数据行数
int size = 10;//每页行数
int pages;//页数
pages = rows%size==0 ? rows/size : rows/size+1;
5>、位逻辑运算符:& | ^ ~
在处理整型数值时,可以直接对组成整型数值的各个位进行操作。这就意味着可以屏蔽技术获得整数中的各个位。