基本数据类型存储在内存栈中,引用类型在栈中存储变量地址-本身存储在堆中

==

基本类型比较字面值,引用类型比较hascode(也就是比较变量的地址值/栈内容是否相等)

比如null的hashcode为0,所以null==null,实际上比较的是0==0.

  • integer的范围-127到128实际上做了缓存(已经存在的对象不会重新创建,而是指向已经存在的引用),如果超出该范围就不会使用缓存,而是创建不同的对象。
  • 比如:
    Integer a =1,Integer b =1;实际上它们都指向同一个内存的地
    址,因此它们的hascode是一样的,a==b返回true
    Integer a =200,Integer b =200;指向了不同的内存空间,a==b返回false

equals

经过重写使用equals方法会取出存储的值进行比较,表示的两个变量是否是对同一个对象的引用(即比较堆内是否相等存)

java.lang.String

//使用构造函数初始化value值--String(value),与equals参数进行比较
private final char value[];
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

hascode与equals

重写了equals方法就必须重写hascode方法(主要使用在hashset/hashmap中判断对象是否相同)

两个对象是否相同的标准:equals返回值相等,hashcode返回true

默认使用Object的equals方法,使用的是==,比较的是内存地址而不是value值

比如:
1. 在hashset中存入一个元素,hashset会调用对象的hashcode方法得到对象的hashcode值--来决定该元素的存储位置。
2. 如果equals返回true但是hashcode不同,则比较的两个对象都可以添加到hashset不同存储位置中
//object中使用==实现equals
public boolean equals(Object obj) {
    return (this == obj);
}
//String类中equals的重写(跟上面例子一样)
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }