Java(三)操作符

==、!=与equals的区别

public class Test {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);   //输出false
System.out.println(n1!=n2);   //输出true
//==与!=比较的是对象的引用,所以输出结果是先false再是true
}
}

如果想比较两个对象的实际内容是否相等,必须使用所有对象都适用的特殊方法equals()。但是这个方法不适用于“基本类型”,基本类型直接使用==和!=即可:

public class EqualsTest {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1.equals(n2));   //输出true
}
}

结果正如我们想象的那样。但假设你创建了自己的类:

class Value
{
    int i;
}
public class EqualsTest2 {
public static void main(String[] args) {
Value v1 = new Value();
Value v2 = new Value();
v1.i=v2.i=100;
System.out.println(v1.equals(v2));  //输出false
}
}

为什么会是false呢?这是由于equals()的默认引用是比较引用。所以除非在自己的新类中覆盖equals()方法,否则不可能表现出我们希望的行为;
大多数Java类库都实现了equals()方法,以便用来比较对象的内容,而非比较对象的引用;
逻辑操作符
逻辑操作符“与”(&&)、“或”(||)、“非”(!)能根据参数的逻辑关系,生成一个布尔值(true或false),“与”、“或”、“非”操作只能应用于布尔值!
短路
当使用逻辑操作符时,我们会遇到一种“短路”现象。即一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下的部分了:

public class Test {
static boolean  test1(int val) 
{
    System.out.println("test1");
    return val>2;           
}
static boolean  test2(int val) 
{
    System.out.println("test2");
    return val>2;           
}
static boolean  test3(int val) 
{
    System.out.println("test3");
    return val>2;           
}
public static void main(String[] args) {
/*第一个测试生成结果为true,所以表达式会继续下去。然而,第二个测试产生了一个false结果。
这意味着整个表达式肯定为false,所以没有必要继续计算剩余的表达式,那样只是浪费;
*/
System.out.println(test1(4)&&test2(2)&&test3(2));
}
}

这里写图片描述
直接常量
直接常量后面的后缀字符标志了它的类型。若为大写(或小写,但是使用小写容易造成混淆)L,代表long;大写(或小写)字母F,代表float;大写(或小写)字母D,代表double;
十六进制数适用于所有整数数据类型,以前缀0x(或0X),后面跟随0-9或小写(或大写)的a-f来表示。如果试图将一个变量初始化成超出自身表示范围的值(无论这个值的数值形式如何),编译器都会向我们报告一条错误信息:

byte a = 0x80;  //byte最大值为127   0x80为十进制的128

这里写图片描述
八进制数由前缀0以及后续的0-7的数字来表示;
按位操作符
按位操作符是用来操作整数基本数据类型中的二进制位。按位操作符会对两个参数中对应的位执行布尔代数运算,并最终产生一个结果;

  • 按位与(&):两个输入位都为1,则输出1。否则输出0;
  • 按位或(|):两个输入位只要有一个是1,则输出1;只有在两个输入位都是0的情况下,才输出0;
  • 按位非(~):按位非(~)也称为取反操作符,属于一元操作符。生成与输入位相反的值——若输入0,则输出1;若输入1,则输出0;

移位操作符
移位操作符操作的运算对象也是二进制的“位”,移位操作符只可用来处理整数类型。

  • 左移操作符(<<):根据指定的位数将操作数向左移动(在低位补0);
  • 右移操作符(>>):根据指定的位数将操作数向右移动(若符号为正,则在高位插入0;若符号为负,则在高位插入1);

移位可与等号(<<=或>>=)组合使用。表示移位后的结果再赋给左边的变量;

int i = 1024 ;
System.out.println(Integer.toBinaryString(i));       //输出10000000000
System.out.println(Integer.toBinaryString((i<<4)));  //输出100000000000000
System.out.println(Integer.toBinaryString((i>>4)));  //输出1000000

int n = -1024 ;
System.out.println(Integer.toBinaryString(n));       //输出11111111111111111111110000000000
System.out.println(Integer.toBinaryString((n<<4)));  //输出11111111111111111100000000000000
System.out.println(Integer.toBinaryString((n>>4)));  //输出11111111111111111111111111000000


i>>=4;  //移位后的结果再赋给左边的变量
System.out.println(Integer.toBinaryString(i));       //输出1000000

字符串操作符+和+=
如果表达式以一个字符串起头,那么后续所有操作数都必须是字符串型!
类型转换操作符
在适当的时候,Java会将一种数据类型自动转换成另一种。例如,假设我们为某浮点变量赋以一个整数值,编译器会将int自动转换为float。类型转换运算允许我们显式地进行这种类型的转换,或者在不能自动进行转换的时候强制进行类型转换。

    int i =100;
    long a =  (long)i;

窄化转型
如果要执行窄化转换(将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型),就有可能面临信息丢失的危险。此时,编译器会强制我们进行类型转换,这实际上是说:“这可能是一件危险的事情,如果无论如何要这么做,必须显式地进行类型转换”。

long i =100;
int a = (int) i;

截尾和舍入
在执行窄化转换时,必须注意截尾与舍入的问题:

public static void main(String[] args) {
double above = 0.7,below = 0.4;
float fabove = 0.7f,fbelow = 0.4f;
System.out.println((int)above);  //输出0
System.out.println((int)below);  //输出0
System.out.println((int)fabove); //输出0
System.out.println((int)fbelow); //输出0
}

在将float或double转型为整型值时,总是对该数字执行截尾。如果想要得到舍入的结果,就需要使用java.lang.Math的round()方法:

public static void main(String[] args) {
System.out.println(getType(a));
double above = 0.7,below = 0.4;
float fabove = 0.7f,fbelow = 0.4f;
System.out.println(Math.round(above));   //输出1
System.out.println(Math.round(below));   //输出0
System.out.println(Math.round(fabove));  //输出1
System.out.println(Math.round(fbelow));  //输出0
}

提升
通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。例如:一个float值与一个double值相乘,结果就是double;如果将一个int和一个long值相加,则结果为long;
小结
除boolen以外,任何一种基本类型都可通过类型转换变为其他基本类型。再一次提醒,当类型转换成一种较小的类型时,必须留意“窄化转换”的结果;否则会在类型转化过程中不知不觉地丢失了信息!

参考书籍:Java编程思想
以上只是学习所做的笔记,以供日后参考!!!

猜你喜欢

转载自blog.csdn.net/z1790424577/article/details/81347229