在各个语言中都会设及到我们的数据操作运算,无论是java还是其他语言中。操作符主要包含算术操作符,位操作符,比较运算符,逻辑运算符,关系运算符。我们使用操作符就是为了帮助我们进行运算的操作的流程。
我们在程序中使用是比较的多的对于操作符,所以我们需要好好的了解一些操作符这个知识点,下面我们将进行具体的介绍:
操作符:
运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。其中java编程思想中对操作符包含以下几个方面:
从上图操作符的所包含的各个操作符的功能。下面我们看下我们常用的几个,和所注意点。
对于自动递增和自动递减操作符:
通常包含前缀式(++i)和后缀式(i++)
“前缀递增"表示”++“的操作位于变量或表达式的前面;而“后缀递增”表示操作符在表达式的后面。对于前缀递增,和前缀递减(++i,--i)会先进行运算然后再进行生成值。而后缀表达式会先生成值,然后再计算。
public class AutoInc{
public static void main(String[] args) {
int i=1;
int m = ++i; // 2
int n = i++; //2
int i2 = i; // 3
int m1 = --i; // 2
int n2 = i--; // 2
int i3= i; // 1
}
}
对于位操作符:
按位与运算(&)
定义:参加运算的两个数据,按二进制位进行“与”运算。
运算规则:
0&0=0 0&1=0 1&0=0 1&1=1
总结:两位同时为1,结果才为1,否则结果为0。
例如:3&5 即 0000 0011& 0000 0101 = 0000 0001,因此 3&5 的值得1。
注意:负数按补码形式参加按位与运算。
与运算的用途:
1)清零
如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
2)取一个数的指定位
比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
3)判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
按位或运算(|)
定义:参加运算的两个对象,按二进制位进行“或”运算。
运算规则:
0|0=0 0|1=1 1|0=1 1|1=1
总结:参加运算的两个对象只要有一个为1,其值为1。
例如:3|5即 0000 0011| 0000 0101 = 0000 0111,因此,3|5的值得7。
注意:负数按补码形式参加按位或运算。
或运算的用途:
1)常用来对一个数据的某些位设置为1
比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。
左移运算符(<
定义&#xff1a;将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃&#xff0c;右边补0)。
设 a&#61;1010 1110&#xff0c;a &#61; a<<2 将a的二进制位左移2位、右补0&#xff0c;即得a&#61;1011 1000。
若左移时舍弃的高位不包含1&#xff0c;则每左移一位&#xff0c;相当于该数乘以2。
右移运算符(>>)
定义&#xff1a;将一个数的各二进制位全部右移若干位&#xff0c;正数左补0&#xff0c;负数左补1&#xff0c;右边丢弃。
例如&#xff1a;a&#61;a>>2 将a的二进制位右移2位&#xff0c;左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位&#xff0c;相当于该数除以2。
对于关系操作符&#61;&#61;与equals()&#xff1a;
&#61;&#61;和!&#61; 比较的是两个对象的引用&#xff0c;比较两个对象的实际内容是否相等&#xff0c;需使用equals()方法&#xff0c;但这个方法不适用与“基本类型” 基本类型应直接使用&#61;&#61;和!&#61;。
public class Equivalence{
public static void main(String[] args) {
Integer n1&#61; new Integer(22);
Integer n2&#61; new Integer(22);
System.out.print(n1&#61;&#61;n2); // false
Integer n3&#61; 22;
Integer n4&#61; 22;
System.out.print(n3&#61;&#61;n4); // true
Integer n5&#61; 129;
Integer n6&#61; 129;
System.out.print(n5&#61;&#61;n6); // false
}
}
//所有的包装类对象都应该采用equals对象&#xff0c;对于integer类型的因为在-128~127之间范围内都会赋值到IntegerCache.cache中&#xff0c;存在复用的情况&#xff0c;所以可以直接用&#61;&#61;比较&#xff0c;但是在这之外的就不可以了。
public class Equivalence{
public static void main(String[] args) {
Integer n1&#61; new Integer(22);
Integer n2&#61; new Integer(22);
System.out.print(n1.equals(n2)); // true
}
}
上面的是因为integer重写了equals方法。
但是对于我们自己所定义的类使用equals方法&#xff1a;
class Value{
int i;
}
public class Equivalence{
public static void main(String[] args) {
Value n1&#61; new Value();
Value n2&#61; new Value();
n2.i&#61;n1.i&#61;100;
System.out.print(n1.equals(n2)); // false
// 这是因为equals默认比较的是引用。所以我们在自己的类中覆盖equals()方法、对于大多数的java类库比较的是对象的内容&#xff0c;而非比较对象的引用。
}
}
String s3&#61;"as",s4&#61;"as"
String s5&#61;"asas"
String s6&#61;s3&#43;s4;
s5&#61;&#61;s6 是false 因为s6的时候就是会new出一个新的String对象
final String s10&#61;s3&#43;s4;
s5&#61;&#61;s10 是false 这里还会进行new出的&#xff0c;final只是影响的s10;
Q&A equals具有的特性&#xff1a;
自反性&#xff1a;x.equals(x)为true
对称性&#xff1a;当仅当y.equals(x)为true时x.equals(y)返回true.
传递性&#xff1a;如果x.equals(y)和y.equals(2) 均为true,x.equals(2)为true.
当接收一个Object参数并满足以下性质&#xff1a;
逻辑与“短路”现象&#xff1a;
短路现象就是&#xff0c;一旦能够明确无误的确定整个表达式的值&#xff0c;就不在计算表达式剩余的部分。因此整个逻辑表达式靠后的部分有可能不会被计算。
public class ShortCircut{
public static void main(String[] args) {
boolean a&#61;0<1 && 2<2 && 2<3; // 实际应该是true ,false,true
// 但是最后能够计算的只有前面两个&#xff0c; true ,false 确定了整个表达式的值为false&#xff0c;所以不会计算最后一个
System.out.print(a);
}
}
类型转换操作符&#xff1a;
在适当的时候java会允许将一种数据类型进行自动转换为另一种&#xff0c;但是如果有事后自己进行强转有可能是多余的&#xff0c;
对于将29.7专为int结果是30还是29&#xff1f;这肯定为29&#xff0c;如果你认为要四舍五入&#xff0c;那么你应该使用Math.round()方法
通常自动转换会在表达式中出现的数据类型决定表达式最终结果的数据类型&#xff0c;如果将一个float值与一个double值相乘结果就是double,如果一个int与一个long值进行相乘&#xff0c;那么就是long型。
好了这种就是要说的运算符。看看你的代码中有没有使用错误的情况。