二元运算符
逻辑运算符
AND:&&
OR:||
NOT:!
//&&和||也称短路运算符
位运算符
与:&
或:|
非:~
异或:^
左移:<<
右移:>>
无符号右移:>>>
//除了~是一元运算符,其他的都是二元运算符
//位模式左移和右移,需要建立位模式进行掩码,>>>运算符会用0填充高位,>>运算符会用符号位填充高位,不存在<<
import java.util.Random;
public class Note {
public static void main(String[] args) {
int a = 3;
int b = 4;
String x = "3";
String y = "4";
//位运算符只能操作于数值
System.out.println(a & b);
System.out.println(a | b);
System.out.println(~b);
System.out.println(~a);
System.out.println(a ^ b);
//如果操作字符串或对象就会报错
//System.out.println(x^y);
//System.out.println(x|y);
//逻辑运算符只能操作于关系判断
System.out.println(a == 3 && b == 4);
System.out.println(a == 3 || b == 4);
System.out.println(!false);
System.out.println(!true);
//java保留了&与|操作于判断,但一般不会用于关系判断,因为效率很低,所有的判断都需要走一遍
System.out.println(a == 3 & b == 4);
System.out.println(a == 3 | b == 4);
//短路运算符的作用
System.out.println(a == 4 && b == 3);//如果a==4不成立那么直接返回true,&&后续判断皆不再执行
System.out.println(a == 3 || b == 4);//如果a=3成立,那么直接返回true,&&后续判断皆不再执行
/*需要导入包:import java.util.Random;*/
//与 (&&) 或(||) 非(!)
Random random = new Random(47);
int i = random.nextInt(100);
int j = random.nextInt(100);
System.out.println("i:" + i);
System.out.println("j:" + j);
System.out.println("i>j is " + (i > j));
System.out.println("i
System.out.println("i>=j is " + (i >= j));
System.out.println("i<=j is " + (i <= j));
System.out.println("i==j is " + (i == j));
System.out.println("i!=j is " + (i != j));
//以下是错误的操作
//System.out.println("i$$j is " + (i && j));
//System.out.println("i||j is " + (i || j));
//System.out.println("!i is " + (!i);
System.out.println("(i<10)&&(j<10) is " + ((i < 10) && (j < 10)));
System.out.println("(i<10)||(j<10) is " + ((i < 10) || (j < 10)));
//综上所述:操作于数值使用位运算符,操作关系运算使用逻辑运算符
}
}
boolean和关系运算符
//小于(),大于等于(>=),小于等于(<=),等于等于(==),不等于(!=)
//关系操作符生成的是一个boolean(布尔)结果
//可以用于操作数的值之间的关系,如果是真的就返回true(真),否则返回false(假)
测试对象的等价性
/**
* 关系操作符==和!=也适用于对象
*/
public class Note {
public static void main(String[] args) {
//内容为47
Integer n1 = new Integer(47);
//内容为47
Integer n2 = new Integer(47);
//==,!= 即会判断内容,还会判断对象的引用,如果对象的引用不一致则返回false
System.out.println(n1 == n2);
System.out.println(n1 != n2);
//n1,n2对象对应的Integer类重写了equals()方法,所以只会比较内容是否一致,不会比较对象的引用是否一致
//重写Object的equals 方法 内容为: value == ((Integer)obj).intValue(); //比较内容
System.out.println(n1.equals(n2));
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 100;
//v1,v2对象没有重写equals()方法,所以会比较对象的引用
//继承Object的equals 方法 内容为: this == obj //比较引用
System.out.println(v1.equals(v2));
//equals(参数) 方法默认对象引用的比较
//即是否为同一个对象
}
static class Value {
int i;
}
}
类型比较运算符
instanceof
public class Note {
public static void main(String[] args) {
Object a = Long.MAX_VALUE;
//输出为false
if (a instanceof Integer) {
a = (Integer) a * 100;
System.out.println(a);
} else {
System.out.println(false);
}
//输出为true
if (a instanceof Long) {
a = (Long) a * 100;
System.out.println(true);
} else {
System.out.println(false);
}
/*
当前代码不难看出,开发过程中会使用到父类,那么对于父类的子类可能有多个,那么赋值的表现形式可以一定程度缩小检查范围,所以我们可以使用instanceof关键字
当前案例中,结果的表现形式来看,已经超过Integer的最大值,应当为Long类型
*/
//a = (Integer) a * 100; //如果进行错误的强制转换将导致不必要的错误,因此开发中会经常使用到instanceof关键字
}
}