1、相同点
&和&&都是逻辑与的运算符,当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
2、不同点
(1)&&与&的不同点:
- 如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算;但是,&即使在左边为false的情况下依旧会对右边的式子做出计算。
- 当&进行运算的数据的类型非布尔型的时候会进行位运算
(2)&&的运用:
很多时候我们可能都需要用&&而不是&,例如:在验证用户登录时判定用户名不是null而且不是空字符串:
username != null &&!username.equals(" ");
左边判断数据库中是否有该用户名(用户不存在),右边则判断用户的用户名是否为空字符串(用户存在,但是用户名为空字符串)。
二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常(不先进行username的非空校验而是直接判断username是否是一个字符串,这样就是默认username不为空;而先进行非空校验,如果为空就不会进行是否是空串的校验,就避免了空指针异常的发生)。
(3)&的运用:位运算符
当&操作符两边的表达式不是布尔类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x34 & 0x0f的结果为0x04(需要将十六进制转换为二进制,然后逐位进行与运算即可)
3、null与“”的区别
null:代表声明了一个空对象,他没有地址,可以赋给任何对象,它是不占用内存的
“”:代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串,也就是说地址没有内容,需要为其分配内存