Java基础巩固系列 String的内存解析

代码示例:

public class TestString {

    /**
     * String:代表不可变的字符序列。底层使用char[]存放
     * String 是final的
     */
    @Test
    public void test1() {
        String str1 = "JavaEE";
        String str2 = "JavaEE";
        String str3 = new String("JavaEE");
        String str4 = "JavaEE" + "Android";
        String str5 = "Android";
        String str6 = str1 + str5;
        str5 = str5 + "Hadoop";
        String str7 = str6.intern();
        String str8 = "JavaEEAndroid";
        System.out.println(str1 == str2); //true  比较str1和str2的内存地址值
        System.out.println(str1 == str3); //false 比较str1和str3的内存地址值  str3已经new了String地址值已经和str1不一样
        System.out.println(str1.equals(str3));  //true 调用equals,String已经重写了equals的方法所以两个的值是相同的,但地址值依然不同,只不过String重写了equals方法而已

        System.out.println(str4 == str6); //false str6中的str1和str2指向的是两个地址和str4有点区别
        System.out.println(str4.equals(str6)); //true  调用equals,String已经重写了equals的方法所以两个的值是相同的
        System.out.println(str7 == str4); //true  这两种的写法是一样的 str7的intern()方法把两个值直接放到了字符串常量池里
        System.out.println(str4 == str8);  //true  两种的写法是一样的str4相当于是在字符串常量池又造了一个JavaEEAndroid  而str8本身就是JavaEEAndroid 于是两个的地址值一样而字符串常量池里恰好有str4中的值 所以两个的值一模一样
                                            //因此String str1 = "AA" 这种方式是直接在字符串常量池里存储或者查找有没有相同的
        Person p1 = new Person("AA");
        Person p2 = new Person("AA");
        System.out.println(" - -" + (p1.name == p2.name)); //true
    }
}

class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

结果:

true
false
true
false
true
true
true
 - -true

 

内存结构图:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值