由于我在学习javaweb项目中使用了”==“ 比较前端传的数值与seesion中存的数值做比较,发现得到false,由此引发的思考

==:

比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作

equals:

equals是Object的中的方法,如果子类没重写该方法,则equals方法与==作用相同

而String重写了equals方法,使得String类中可以比较值是否一样

public boolean equals(Object anObject) {
        if (this == anObject) {//判断内存地址是否相等,如果指向的是同一个堆地址,那肯定是同一个对象,也就肯定相等了
            return true;
        }
        if (anObject instanceof String) {//先判断anObject是不是String类的一个实例,如果是运行下边的语句
            String aString = (String)anObject;//将其强转为String
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value); //判断是否有值,然后比较内容是否相等
            }
        }
        return false;
    }

“==”VS“equals”

比较代码

public class StringDemo {
    public static void main(String args[]) {
        String str1 = "Hello";
        String str2 = new String("Hello");//
        String str3 = str2; // 引用传递
        System.out.println(str1 == str2); // false
        System.out.println(str1 == str3); // false
        System.out.println(str2 == str3); // true
        System.out.println(str1.equals(str2)); // true
        System.out.println(str1.equals(str3)); // true
        System.out.println(str2.equals(str3)); // true
    }
}

![QQ7S33R5952XSKP]HVS{3.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6286b4e4-2f57-438a-a7f3-1355bbc083cb/QQ7S33R5952XSKPHVS3.png)

注意如果

String str2 = new String("Hello");//换成
String str2 = "Hello";

那么str2不会创建新的堆空间来存放”Hello“,因为会先在堆内存中查找是否有“Hello”,如果有的话就直接指向这个堆内容。new的话就直接开辟一个新空间存放

总结:

== 比较的是指向的是否是同一个堆内存,而equals比较的则是对象值的内容