equals和==的区别

    技术2022-07-12  84

    字符串常量存储位置,new String()存储位置,==比较前面两种创建字符创结果,equals和==区别,字符串使用equals底层是怎么比较的

    代码:

    public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String str4 = "a" + "bc"; System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(str1.equals(str3)); System.out.println(str1==str4); }

    解决:

    字符串常量存储位置,new String()存储位置 方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。String在创建对象时,会将字符串变成一个常量,如果是第一次创建会将这个常量存储到方法区。如果方法区中已经存在,则直接将常量的地址交给String对象。所以,当使用直接方法创建String对象是String str = “abc”;虚拟机会直接将常量的地址交给变量str,而使用new的方法创建时,我们知道new出来的对象会存放在堆中,所以 String str3 = new String(“abc”);str3存的是在堆中的引用,堆中的引用存储的是方法区String常量的地址。

    equals和==区别

    对象类型不同 ==:是操作符。 equals():是超类Object中的方法。比较的对象不同 equals():用bai来检测两个对象是否相等,即两个对象的内容是否相等。 ==:用于比较引用和比较基本数据类型时具有不同的功能。运行速度不同 equals():没有==运行速度快。 ==:运行速度比equals()快,因为==只是比较引用。

    equals底层是怎么比较的 System.out.println(str1.equals(str3));

    public boolean equals(Object anObject) { //str3传入equals方法,anObject指向str3,str3是上转型对象 if (this == anObject) { //this代指调用equals方法的str1,由于str1和str3内存地址不同,所以向下运行 return true; } if (anObject instanceof String) {//此处用于判断str3是否是String类或其子类,此处是,继续运行 String anotherString = (String)anObject; //对象向下转型(str3) int n = value.length; //在编译器中可看出value是全局变量,其前存在省略掉的this(即n = this.value),用于测量str1的长度 if (n == anotherString.value.length) { //如果str1和str3 长度相等 char v1[] = value; //将str1指向的字符串存入字符数组v1 char v2[] = anotherString.value; //将str3指向的字符串存入字符数组v2 int i = 0; while (n-- != 0) { //利用循环,逐字符比对两字符串,若有任何不同,返回false,否则返回true if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
    Processed: 0.009, SQL: 9