笔记,equals 的比较

来源:互联网 发布:js改变css属性 编辑:程序博客网 时间:2024/04/28 13:31
  final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误 
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过
final StringBuffer a=new StringBuffer("immutable");

a.append(" broken!"); //编译通过 


可见,final只对引用的""(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的""相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。


final只要是对应的引用地址,没有发生变化,就不会报错。


对应的integer缓存数组  -128 -->127

    private static class IntegerCache {
private IntegerCache(){}


static final Integer cache[] = new Integer[-(-128) + 127 + 1];


static {
   for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
    }


public class testEquals {public static void main(String[] args) {final int i=8;int j=8;System.out.println(i==j);testEquals aa=new testEquals();testEquals bb=new testEquals();System.out.println(aa);System.out.println(bb);System.out.println(aa==bb);//比较的是地址System.out.println(aa.equals(bb));//这个equals的是调用object类里面的equals方法 没有重写此方法 所以不会相等aa=bb;System.out.println(aa);System.out.println(bb);System.out.println((aa==bb)+" a = b le");String a="i";String b="i";System.out.println(a);System.out.println(b);System.out.println(a==b); //最好还是用equals的比较  字符串的比较//注意,这里并不用str1.equals(str2);的方式,因为这将比较两个字符串的值是否相等。==号,根据JDK的说明,只有在两个引用都指向了同一个对象时才返回真值。//而我们在这里要看的是,str1与str2是否都指向了同一个对象。System.out.println(a.equals(b));String xx=new String("i");//String xx="i";String vv=new String("i");System.out.println(xx==vv);//false 比较的对象的地址 对象之间比较不能用==号  应该用equalsSystem.out.println(xx.equals(vv));//(重写了比较的是对象的值)这个正确是因为String类重写了object类里面的equals方法}}


true
testEquals@126b249
testEquals@182f0db
false
false
testEquals@182f0db
testEquals@182f0db
true a = b le
i
i
true
true
false
true




hashCode

public int hashCode()
返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:

  • 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
  • 以下情况 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)




object的方法


 public boolean equals(Object obj) {
return (this == obj);
    }


 public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }







0 0
原创粉丝点击