这章比较零散,主要是汇总一些编程时常用的一些少见但又比较重要的知识点。
一、hashCode()和equals()
这块的基础知识就不再重述了,如果是自己编写时需要注意以下几点(建议用idea自动生成工具生成),一个简单的示例如下:
- 正确的equqls()方法需满足下列5个条件:
- 自反性,对任意x, x.equals(x)一定返回true;
- 对称性,对任意x,y,如果x.equals(y)返回true,那么y.equals(x)一定返回true;
- 传递性,对任意x,y,z,如果有x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)一定返回true;
- 一致性,对任意x,y,如果有对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结果应该保持一致,那么一直是true,要么一直是false;
- 对任何不是null的x, x.equals(null)一定返回false;
- 正确的hashCode()方法需满足以下条件:
- 无论何时,同一个对象调用hashCode()都应该产生同样的值,所以hashCode()不应该依赖对象内可变的数据;
- 无论何时,也不应该使hashCode()依赖于具有唯一性的对象信息,尤其是使用this的值;
- 好的hashCode()应该产生分布均匀的散列码,一个通用的做法是按下列方式计算的,如果f为:
- boolean c = f ? 0: 1
- byte,char,short,int——c = (int)f
- long—— c = (int)(f ^ (f>>>32))
- float —— c = Float.floatToIntBits(f)
- double —— c = Double.doubleToLongBits(f)
- Object其equals()调用这个域的equals()数组—— c = f.hashCode()
- 数组—— 对每个元素应用上述规则
二、String格式化输出
一般主要用于日志打印上,几个例子如下