java操作符
在最底层,java的数据是通过操作符来操作的。
java中的操作符主要分为以下几种:
赋值操作符
java中通过”=”来进行赋值,它的意思是取右边的值,把它复制给左边。
在java中基本类型存储的是实际值,所以在赋值时,直接将一个地方的内容,复制到另一个地方,比如:a=b,那么b的内容复制给a,b不受现有a内容的影响。
但是当对对象赋值时,真正操作的其实是它的引用。当a=b时,其实是将对象的引用从b复制到了a,但是实际内存指向仍然是原有的对象。
用以下代码加以说明:
public class OperationTest1 {
public static void main(String[] args) {
int a1 = 10;
int a2 = a1;
a1 = 8;
System.out.println("a1:" + a1);//a1:8
System.out.println("a2:" + a2);//a2:10
ObjectTest i1 = new ObjectTest(10);
//将i1赋值给i2
ObjectTest i2 = i1;
//修改i2的值
i2.setIndex(20);
//打印i1的值
System.out.println(i1.getIndex());//打印出 20
}
public static class ObjectTest {
private int index;
public ObjectTest(int index) {
this.index = index;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
}
算数操作符
算数操作符包括:加号(+),减号(-),除号(/),乘号(*)以及取模操作符(%)
其中加号(+)和减号(-)可以作为一元操作符存在
具体用如下代码说明:
public class OperationTest2 {
public static void main(String[] args) {
int a1 = 10;
int a2 = 5;
// [+]
int a3 = a1 + a2;
a3 += a1;
System.out.println(a3);//25
// [-]
int a4 = a3 - a2;
a4 -= a1;
System.out.println(a4);//10
// [*]
int a5 = a1 * a2;
a5 *= a1;
System.out.println(a5);//500
// [/]
int a6 = a5 / a1;
a6 /= a1;
System.out.println(a6);//5
// [%]
int a7 = a1 % 3;
a7 %= 3;
System.out.println(a7);//1
//一元[+] [-]
int a8 = +a1;
int a9 = -a2;
}
}
在此基础上,java还提供了递增和递减的快捷运算功能
递减操作符:”–”
递增操作符:”++”
根据所处的位置又分为:前缀式和后缀式
用以下代码说明:
public class OperationTest3 {
public static void main(String[] args) {
int i=0;
System.out.println("i++ :"+ i++);//i++ :0 先生成值,再执行运算
System.out.println("++i :"+ ++i);//++i :2 先运算,再生成值
System.out.println("i-- :"+ i--);//i-- :2
System.out.println("--i :"+ --i);//--i :0
}
}
关系操作符
关系操作符返回的是一个boolean结果,主要用于计算操作值之间的关系。
如果关系成立,返回true,不成立,则返回false。
关系操作符包括:小于(<),大于(>),等于(==),大于等于(>=),小于等于(<=)以及不等于(!=)。
具体功能用如下代码说明:
public class OperationTest4 {
public static void main(String[] args) {
String a = new String("1");
String b = new String("1");
System.out.println(a == b);//false a与b虽然内容相同,但是不是同一个对象
System.out.println(a != b);//true
int a1 = 1;
int b1 = 2;
System.out.println(a1 > b1);//false
System.out.println(a1 < b1);//true
a1 = 2;
System.out.println(a1 == b1);//true
System.out.println(a1 != b1);//false
a1 = 1;
System.out.println(a1 >= b1);//false
System.out.println(a1 <= b1);//true
}
}
逻辑操作符
逻辑操作符分为:与(&),或(|),非(!),根据参数逻辑关系生成boolean值
当使用逻辑操作符时会遇到“短路“现象,当明确整个表达式时,余下部分不再计算。
用以下代码说明:
public class OperationTest5 {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a>0 and b>0:" + (a > 0 && b > 0));//a>0 and b>0:true
System.out.println("a>0 or b>0:" + (a > 0 || b > 0));//a>0 or b>0:true
System.out.println("a>0 and b>0:" + (greatThan(a, 10) && greatThan(b, 10)));//compare:1 and 10 a>0 and b>0:false 这里只执行了第一个greatThan方法,因为第一次判定不符合,则整个表达式必定返回false,后续判定无需执行
System.out.println("a>0 and b>0:" + (greatThan(a, 10) & greatThan(b, 10)));//compare:1 and 10 compare:1 and 10 a>0 and b>0:false 未执行短路
System.out.println("a>0 or b>0:" + (greatThan(a, 0) || greatThan(b, 0)));//compare:1 and 0 a>0 or b>0:true
}
private static boolean greatThan(int leftPart, int rightPart) {
System.out.println("compare:" + leftPart + " and " + rightPart);
return leftPart > rightPart;
}
}
按位操作符
按位操作符分为以下几种:与(&),或(|),异或(^),非(~),可与”=”等号连用。
代码如下:
public class OperationTest6 {
public static void main(String[] args) {
int a = 1;// 0001
int b = 2;// 0010
int c = 3;// 0011
int temp = a & b;
System.out.println("a&b:" + temp + " binary:" + Integer.toBinaryString(temp));//a&b:0 binary:0
temp = a | b;
System.out.println("a|b:" + temp + " binary:" + Integer.toBinaryString(temp));//a|b:3 binary:11
temp = c ^ b;
System.out.println("a^b:" + temp + " binary:" + Integer.toBinaryString(temp));//a^b:1 binary:1
temp = ~b;
System.out.println("~b:" + temp + " binary:" + Integer.toBinaryString(temp));//~b:-3 binary:11111111111111111111111111111101
}
}
移位运算符
java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
使用如下代码说明:
public class OperationTest7 {
public static void main(String[] args) {
int a = 1;
int b = -1;
long l = -1;
short s = -1;
byte b2 = -1;
System.out.println("a:" + a + " binary:" + Integer.toBinaryString(a));//a:1 binary:1
int temp = a << 10;
System.out.println("a<<10:" + temp + " binary:" + Integer.toBinaryString(temp));//a<<10:1024 binary:10000000000
System.out.println("b:" + b + " binary:" + Integer.toBinaryString(b));//b:-1 binary:11111111111111111111111111111111
temp = b >> 10;
System.out.println("b>>10:" + temp + " binary:" + Integer.toBinaryString(temp));//b>>10:-1 binary:11111111111111111111111111111111 负数,移位的同时用1补齐
temp = b >>> 10;
System.out.println("b>>>10:" + temp + " binary:" + Integer.toBinaryString(temp));//b>>>10:4194303 binary:1111111111111111111111 向右移位10次,并用0补气
l >>>= 10;
System.out.println("l>>>10:" + l + " binary:" + Long.toBinaryString(l));//l>>>10:18014398509481983 binary:111111111111111111111111111111111111111111111111111111
s >>>= 10;
System.out.println("s>>>10:" + s + " binary:" + Integer.toBinaryString(s));//s>>>10:-1 binary:11111111111111111111111111111111 移位操作实际上是把值转换成int后再操作,然后截断返回给原有的值,就有可能产生这种情况
b2 >>>= 10;
System.out.println("b2>>>10:" + b2 + " binary:" + Integer.toBinaryString(b2));//b2>>>10:-1 binary:11111111111111111111111111111111
}
}
三元操作符
三元操作符if-else
采用如下语法:
boolean-exp?value1:value2;
当表达式返回true时取value1,否则返回value2。
代码如下:
public class OperationTest8 {
public static void main(String[] args) {
System.out.println("if-else:" + (true ? "true" : "false"));//if-else:true
//等同于
String temp = null;
if(true){
temp = "true";
}else
temp = "false";
System.out.println("if-else:" + temp);
}
}
字符串操作符
java中可以通过操作符对字符串进行拼接操作,主要方式如下:
public class OperationTest9 {
public static void main(String[] args) {
String a = "a ";
String b = "b";
System.out.println(a+b);//a b
a+=b;
System.out.println(a);//a b
}
}
类型转换操作符
类型转换是指当适当的时候java会将一种数据类型自动转换成另一种。
java允许把所有基本数据类型转化成其他基本数据类型,但是boolean除外。
在float和double转为整形时,进行截尾操作。
想要舍入,则必须调用Math中的round()方法。