对于java而言,数据类型有多种,而运算也是有多种的,本文会为大家讲解常见的运算符。
主要有:
在之前的文章中我们讲过,声明变量就相当于在内存中得到了一块儿地,那么这块儿地上存什么,需要我们将数据赋值上去,赋值就是把这块位置的内容设为一个确定的值。
对变量进行赋值我们需要使用到的就是赋值运算符,常见的赋值运算符是=,注意:在java中=是用来赋值的。
数学运算符有加减乘除,符号分别是+-*/,另外还有取模运算符%,以及自增(++)和自减(–)运算符。取模运算适用于整数和字符类型,其他数学运算适用于所有数值类型和字符类型。加减乘除大部分情况和直观感觉是一样的,都很容易理解,需要注意的是++ -- 以及和赋值运算符结合之后的+= -=。
在使用整数进行数学运算的时候,我们需要注意类型的范围,一旦计算结果超出了表示范围又没有用合适的类型接收就会出现问题。什么意思的呢?看下面的例子
int a = 2147483647*2; //2147483647是int能表示的最大值
此时打印a的结果是-2。解决方式是用long接收结果。
为什么会出现这样的情况?
需要从二进制说起,内容稍多,所以细节就不说来,简单说就是二进制加减法,当计算结果超出表示范围的时候,最高位往往是1,会被看做负数。
在进行数学运算的时候我们需要注意的就是类型自动提升的问题,在之前讲解数据类型的时候提到过自动类型提升,本文不做过多的讲解。
当+ 和 赋值= 结合起来之后就相当于运算之后赋值,例如a+=2就相当于a=a+2,这两种方式没有结果上的区别,在使用的过程中也不会可以的区分,但是他们之间还是有区别的。
上文我们说到,在进行操作的时候,会发生自动类型提升,byte类型的a加10会变为int,* 通过+=的写法不会发生自动类型提升,同样-= = /=都不会发生自动类型提升。
在JDK中为我们提供了自增运算符++,自减运算符--,首先需要说明的是++ -- 也不会发生自动类型提升。
例如:a++相当于a+=1相当于a=a+1。
a++是一个表达式,那么 a++
就会有一个表达式的计算结果,这个计算结果就是a的旧值(加1前的值)。相对的, ++a
表达式的计算结果a加1后的值。所以他们的本质区别是:表达式的值(运算结果) 是加1前的变量的值还是加1后的变量的值(自减也是如此)。换句话说:a++计算之后a的值确实加了1 ,但是a++这个表达式整体的值是加1之前的值。
a++ 没有 ++a 快 ++a省去一个寄存器
另自增自减是非线程安全的,自增自减运算符包含两个操作:一个加1(减1)的操作和一个赋值的操作,不是原子操作,因此,在多线程下,如果你要对共享变量实现自增自减操作,就要加锁,或者使用JDK提供的原子操作类(如 AtomincInteger
, AtomicLong
等)提供的原子性自增自减方法。
也叫作关系运算符,会形成布尔表达式。主要用来计算两个值之间的关系,结果是一个布尔类型(boolean)的值。适用于所有数值类型和字符类型。
比较操作符有:大于(>),大于等于(>=),小于(<),小于等于(<=),等于(==),不等于(!=)。
在此处需要注意的是等于。等于使用两个等号==,而不是一个等号(=)。一个等号(=)表示赋值操作。
逻辑运算根据数据的逻辑关系,生成一个布尔值true或者false。逻辑运算只可应用于boolean类型的数据,但比较运算的结果是布尔值,所以其他类型数据的比较结果可进行逻辑运算。
逻辑运算符具体有:
逻辑运算的大部分都是比较直观的,需要注意的是&和&&,以及|和||的区别。
参考资料
http://www.cnblogs.com/jinggod/p/8424808.html
我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。
永远相信美好的事情即将发生。