1.对于基本数据类型==比较的是他们的值
2.对于引用数据类型==比较的内存地址(堆内存)
equals的方法源码是这样的
public boolean equals(Object obj) { //this - s1 //obj - s2 return (this == obj); }
可以看到equals的默认行为也是比较的地址,意义不大,但是有一些类库对equals进行了重写,如String、Integer、Date。在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同)
(1)如果两个对象相同(equals 方法返回 true,equals不被重写),那么它们的hashCode 值一定要相同;
(2)如果两个对象的 hashCode 相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增
加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
首先equals 方法必须满足自反性(x.equals(x)必须返回 true)、对称性(x.equals(y)返回 true 时,y.equals(x)也必须返回 true)、传递性(x.equals(y)和 y.equals(z)都返回 true 时,x.equals(z)也必须返回 true)和一致性(当x 和 y 引用的对象信息没有被修改时,多次调用 x.equals(y)应该得到同样的返回值),而且对于任何非 null值的引用 x,x.equals(null)必须返回false。
实现高质量的equals方法的诀窍包括:
1. 使用==操作符检查"参数是否为这个对象的引用";
2. 使用 instanceof 操作符检查"参数是否为正确的类型";
3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;
4. 编写完 equals 方法后,问自己它是否满足对称性、传递性、一致性;
5. 重写 equals 时总是要重写 hashCode;
6. 不要将 equals 方法参数中的 Object 对象替换为其他的类型,在重写时不要忘掉@Override 注解。
补充:https://blog.csdn.net/qq_42093488/article/details/84261011
1.final方法
将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
注意math.round(-1.5)结构并不是二而是1?
实际上math.round()是四舍六入,它的原理是传入的参数+0.5进行向下取整
Math.floor():向下取整
Math.ceil():向上取整
JAVA中用于处理字符串常用的有三个类:java.lang.String、java.lang.StringBuffer、java.lang.StringBuilder,这三者的共同之处都是final类,不允许被继承,这主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着的,且考虑到防止其中的参数被修改影响到其它的应用。StringBuffer与StringBuilder两个基本上差不多,只是StringBuffer是线程安全,可以不需要额外的同步用于多线程中;StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;二者之间的共同点都可以通过append、insert进行字符串的操作。
String实现了三个接口:Serializable、Comparable<String>、CharSequence,而StringBuffer及StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,而其它两个就不可以。
以下是JDK中对String、StringBuffer、StringBuilder的详细介绍:
原文:https://www.cnblogs.com/strugglecola/p/10511551.html