JAVA中的&字符的使用方法
&是JAVA中的与运算符。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路功能
(前面提到的),即如果第一个表达式为false,则不再计算第二个表达式,
举个例子:
if(str != null && !str.equals(“”))
//当str为null时,后面的表达式不会执行,所以不会出现NullPointerException
//如果将&&改为&,则会抛出NullPointerException异常。
& 也可以进行按位与
操作,按二进制位进行"与"运算。
举个例子:
最近学习hadoop的时候学习了自定义Partition的方法。在mapreduce中 分区过程中通过类HashPartitioner<K,V> implements Partitioner<K,V> 来实现相同的key 的value 会分配到同一个reduceTask中,其中有一段很有意思的代码,如下:
public int getPartition(K2 key, V2 value, int numReduceTasks) {
//重点看return后面的代码
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
//该代码主要是为了根据key的hashcode返回一个分区号。
}
一开始我没有想到 & 字符在这里的作用,实际上&字符在这里是用于做位运算的。
Integer.MIN_VALUE=2147483647 转换成二进制值是:
0111 1111 1111 1111 1111 1111 1111 1111
key.hashCode() & 2147483647 可以保证结果是非负数,原因在于当key.hashCode()为负数时,第一位一定是1,此时1 & 0结果为0,这样就会使符号位一定为0了。
这里同时也要注意,HashPartitioner类返回的int值必须是一个整数,不然就无法对指定的键值对进行分区,也就无法在下一步进行Map操作了。