String跟Integer的基础问题疑问

public class Leetcode {
    public static void main(String[] agrs)  {
        Integer n1 = new Integer(17);
        Integer n2 = new Integer(17);
        String c1 = new String("123");
        String c2 = new String("123");
        System.out.println(c1.equals(c2));
        System.out.println(c1 == c2);
        System.out.println(n1.equals(n2));
    }

}

代码如上

true

false

true

结果如上,问一下,equals对比的不是对象的地址吗,为什么== 为false equals为true呢。

两个都是比较对象,只不过String类覆盖了equals方法,创建了字符串比较规则。你自己也可以重写equals方法。

==是比较对象的地址,String对象地址不同,value指向同一个“123”.
Integer和String是包装类,覆盖了equal方法,你可以去看一下源码,比较的是各自的值。
17==17,两个"123"放在常量池中,也相等。

equals比较的不是地址 是地址指向的值
比较的地址的是==

==和equals其实都是比较对象地址 不过equals是来自Object类,被所有类所继承,String类覆盖了equals方法,创建了字符串比较规则。你自己也可以重写equals方法
字符串类有字符串常量池,“123”创建之前会先去查一下存在不,存在直接用,不存在就创建。第一次不存在创建后,一个引用指到了123,第二次存在,又是一个新的引用指向他。
所以地址必须不同(就像你new两个对象,地址必须不同)这就是==是false
内容必须相等,字符串类比较规则,都是指到123,所以equals是true

Java中,Integer在-128~127之间的对象是事先创建好的,你new的时候会指向这个缓存的事先创建好的对象,所以
n1.equals(n2)是true
如果你试试看n1 n2都是 1000,就不行了。
而能在编译期间求值的String,则会放在常量池中,所以也相等。
如果是
int n = scanner.nextInt(); // 你输入2
s1 = "123" + String.valueOf(12 * n);
s2 = "123" + String.valueOf(48 / n);
那么它们equals就不等了。

以上两个情况,==都是相等的,因为它们在逻辑上是相等的,只是不是一个对象引用而已。

大神们都说的很清楚了,简单来记,equals比较的是字符串的内容是否相同,而==比较的是字符串的地址是否相同,当然,==也可以比较int,double,byte等基本数据类型,这些都是java基础知识,你多看看源码就明白了

==和equals其实都是比较对象地址 不过equals是来自Object类,被所有类所继承,String类覆盖了equals方法,创建了字符串比较规则。你自己也可以重写equals方法
字符串类有字符串常量池,“123”创建之前会先去查一下存在不,存在直接用,不存在就创建。第一次不存在创建后,一个引用指到了123,第二次存在,又是一个新的引用指向他。
所以地址必须不同(就像你new两个对象,地址必须不同)这就是==是false
内容必须相等,字符串类比较规则,都是指到123,所以equals是true

String类覆盖了equals方法

举个例子
String s1= "123";
String s2= "123";
s1==s2; 结果为true
再举个例子
String s1= "123";
String s2=new String("123");
如果用==比较则是false
如果用equals比较则是true
等着看一下String类就明白了,字符串常量池和equals的复写

==比较的是内存地址,也就是说hashcode哈希值,不被重写hashcode()方法时,不同地址永远不相等,重写时看规则,一般是拿内容也就是字符计算哈希值,相同内容就相等;equals方法原本是object类中的方法,底层也是用==比较的,重写时也是看规则,一般是拿类属性内容比较;
Integer在-128~127自动拆箱当成常量放在常量池中,常量池中同值同内存地址,超出范围new所以地址不同;string不new时在常量池