背景
很多同学看见我的这个标题,不禁会说到:你这个是在逗我么,求余和取模不是一回事吗?是的再前不久之前我和你们的感受一样,求余和取模难道不是一个玩意?直到有一天有一个群友再阅读RokcetMq源码的时候,发现了下面一段代码:
private static int initValueIndex() {
Random r = new Random();
return Math.abs(r.nextInt() % 999) % 999;
}
大家可以发现这里求个余数为什么会用两次求余呢?这个问题也作为issue提到了github上,官方人员也只说了这个的确不优雅,可以优化。
虽然官方人员的回答比较搪塞,但是我们还是要本着追根溯源的思想,挖掘出这么写的本来的缘故是什么。
求余还是取模
我们仔细看上面的代码发现使用了Math.abs,这个函数代表取绝对值,那就意味着和符号有关系,虽然这里的r.nextInt不可能为负数,可能当时的开发人员理解这个函数可能会出现负数(实际上r.nextInt不会出现负数)于是进行了取绝对值。
那这个又和我们的标题 求余和取