基本数据类型之间的相互转换
在我们编写程序的过程中,经常会涉及到不同类型的数据之间的转换问题。这些转换根据具体的情景不同,可以分为两种,一种是默认转换,另一种是强制转换。
默认转换:当你把一种取值范围小的数直接赋值给另一种取值范围大的数据类型或者与另一种取值范围大的数据类型在一起运算时,取值范围小的类型会直接转化为取值范围大的数据类型
强制转换:当你把一种取值范围大的数据类型赋值给一种取值范围小的类型时,要加上强制转换符,但是这样可能会造成精度降低或者是溢出问题,使用时要谨慎
如图,箭头方向为默认转换方向
注意:
boolean型数值不参与其他7中基本数据类型转换
有多种类型的数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一 种数据类型,然后再进行计算。
判断数据类型的大小时,不是简单的根据两个数据类型的所使用空间大小来判断的,比如,long类型占用8个字节,而float占用4个字节,但是float的数据类型比long类型的大,这和浮点数在内存中的存储结构有关系,在这不过多解释。
基本数据类型之间的运算符
Java语言中,可以将运算符分为6种,分别是算数运算符,赋值运算符,比较(关系)运算符,逻辑运算符,位运算符以及条件运算符。
算术运算符
算数运算符可以说是我们最常用的运算符,在Java语言中,它们的意义通常和平常的意义相近,下面我来一一演示。
"+"
可以表示正数 可以表示相加运算 可以表示连接操作
"-"
可以表示负数 可以表示相减运算
"*"
可以表示乘法运算
''/''
可以表示除法运算
''%''
可以表示取余操作,获得除法的余数作为返回结果
''++''
自增操作,在自己的基础上+1
按位置不同分为先自增再运算和先运算再自增
这种情况就是先运算再自增,a的初始值为1,然后即将打印时,里面是a++,这就代表了执行顺序为先打印,再自增。所以,第一次打印的结果为1,但是在打印完成后,此时执行a++,a已经变为2了,所以第二次打印结果为2。
这种情况就是先自增再运算,a的初始值为1,然后即将打印时,里面是++a,这就代表了执行顺序为先自增,再打印。所以,第一次打印的结果为2,第二次打印没有操作,结果依旧是2。
''--''
自减操作,在自己的基础上-1
按位置不同分为先自减再运算和先运算再自减
此操作和上面''++''操作完全一致,这里就不赘述了。
比较运算符
比较运算符,也是我们司空见惯的一种符号,但再Java中还是与我们普遍理解的有出入,下面来详细介绍其用法。
"==" "!="
这两个符号来判断左右两边是否相等或不等
两边可以是数值与数值,boolean与boolean或者引用类型与引用类型进行比较,得出结果后返回一个boolean类型的值
">" "<" "<=" ">="
这四个符号和我们所理解的一般含义一样
但是只能用于数值之间的比较
注意:在这些运算中,字符类型(char)就等同于数值类型,前面文章提到过。
赋值运算符
当然,除了上面这些,我们最常见的"="也是赋值运算符,可以通过它来化简上面的运算符
当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原 则进行处理。
"+="
这个运算符表示,先给这个数本身加上后面的数,再把结果赋值给自己
带入到这个程序中,a的值初始化为10,然后进行"+="操作后,可暂且理解为a=a+10,
然后打印a。
其他几个和这个用法类似,这里不做过多讲解。
这几个运算符的用法没什么值得注意的,重点是在这几个赋值运算中存在一种隐式的格式转换,下面我给大家一个例题来看一下隐式转换在哪里
看看下面的哪一个在编译时会报错
short s = 3;
s=s+2; ①
s+=2; ②
①和②有什么区别
首先,把①拆分一下,具体就是short = short + int,但是按照运算规则来说,short + int的结果应该为int类型的,但是这个表达式直接把结果又赋值给了short类型的s,所以不能通过编译
但是②可以通过编译,这是因为在"+="这个运算符中存在一种隐式转换,拆分一下就是short =(short)(short + int),虽然我们没有进行强制转换,但是运算符内部已经转换好了。
逻辑运算符
逻辑运算符就是逻辑值之间的运算
"&" 逻辑与 两边都为true,结果才能为true,否则为false
"|" 逻辑或 两边只要有一个true,结果为true,否则为false
"!" 逻辑非 把true变false,false变true
"^" 逻辑异或 两边不同为true,相同为false
这些大家对照上表即可,这里就不做代码演示
"&&" 短路与 "||" 短路或
当前面的值已经可以影响结果时便不会执行后面
可以得知,两个结果相同,那么这两个有什么区别呢?
当使用逻辑与时,先判断前面,a>c,结果为false,再看后面,a>b,结果为true,false & true结果应该为false,判断条件是两边都为true时,结果才能为true,所以结果为false,但是现在通过前面已经可以知道结果肯定时false,但是程序还会执行后面再进行判断。如果我们使用短路与来判断,当已经知道前面为false,便不会再去判断后面,这样可以节省计算时间。
同理,短路与和短路或并不会对结果产生影响,只会加快运算速度。
条件运算符
条件运算符相信大家并不常见,虽然看起来很复杂,但是知道意思之后就很简单了。下面我直接举例说明。
其实上面这个程序是用来找到a和b之间那个数字大并且返回,表达式含义是,先判断括号里的是否成立,如果成立,则返回前面的,否则返回后面的。注意,条件运算符必须有一个返回值来接受运算结果,如果运算后的结果赋给新的变量,要求表达式1和表达式2为同种或兼容的类型。
位运算符
日常开发中位运算使用相对较少,但是巧妙的使用位运算可以大量减少运行开销, 优化算法
位运算符,这里的位,指的就是被操作数的二进制的位,下面我直接用例子来演示。
"<<" ">>"
">>>" 无符号右移 ">>" 带符号右移
"&" "|" "^"
这几个既可以是逻辑运算符也可以是位运算符,具体看它们对什么进行运算
"~"
意思就是把这个数的每个二进制数都取反