java中的String为什么可以使用==比较字符串内容?

问题遇到的现象和发生背景

java中的String为什么可以使用==比较字符串内容?

package com.hspedu.poly_.test;

public class Person {
    private String name;
    private int age;
    private char gender;

    public Person(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof Person) {
            Person p = (Person) obj;
            return /*this.name.equals(p.name)*/  // equals 和 == 结果相同
                    this.name == p.name &&     //此处进行  == 比较地址 地址理应不同 但为什么会判断为true呢?
                    p.age == this.age &&
                    p.gender == this.gender;
        }
        return false;
    }
}

-------------------------------------------
package com.hspedu.poly_.test;

public class EqualsExercise01 {
    public static void main(String[] args) {
        Person person11 = new Person("123", 123, '女');
        Person p2erson22 = new Person("123", 123, '女');

        System.out.println(person11.equals(p2erson22)); //true 为什么会判断为true呢?

        String s1 = new String("java");
        String s2 = new String("java");

        System.out.println(s1 == s2);            //false
        System.out.println(s1.equals(s2));    //true     这种表达又符合地址比较


    }
}

运行结果及报错内容

true
false
true

我的解答思路和尝试过的方法

https://www.cnblogs.com/syxchina/archive/2011/05/12/2197212.html

== 和 equals 引用类型都是比较地址,只是String重写了equals 变成了比较内容。