深入理解java'中的String

首先咱们来看一下下面程序的输出结果是什么?

public class StringQuestion {

    public static void m1() {
        String a = "a1";
        String b = "a" + 1;
        System.out.println(a == b);
    }

    public static void m2() {
        String a = "ab";
        String bb = "b";
        String b = "a" + bb;
        System.out.println(a == b);
    }

    public static void m3() {
        String a = "ab";
        final String bb = "b";
        String b = "a" + bb;
        System.out.println(a == b);
    }

    public static void m4() {
        String a = "ab";
        final String bb = getBB();
        String b = "a" + bb;
        System.out.println(a == b);
    }

    private static String getBB() {
        return "b";
    }

    private static String a = "ab";
    public static void m5() {
        String s1 = "a";
        String s2 = "b";
        String s = s1 + s2;
        System.out.println(s == a);
        System.out.println(s.intern() == a);
    }

    private static String aa = new String("ab");
    public static void m6() {
        String s1 = "a";
        String s2 = "b";
        String s = s1 + s2;
        System.out.println(s == aa);
        System.out.println(s.intern() == aa);
        System.out.println(s.intern() == aa.intern());
    }


    public static void main(String[] args) {
        m1();
        m2();
        m3();
        m4();
        m5();
        m6();
    }


}



输出结果是:

true

false

true

false

false

true

false

false

true

如果你和正确答案一样并且理解为什么是true或者是false,那么,恭喜你,你已经基本上掌握了java中的jString类,下面内容你就不需要看了!!!!!


解释:


1m1()运行输出true

原因:ab在常量池上是同一份字符串常量,ab同时指向“a1

两个指向的内存空间相同

2m2()运行输出false

原因:字符串变量a指向常量池中的“ab,而表达式中b=a+bbbb是字符串变量,所以字符串变量b不能存储在字符串常量池中,要在堆中新建一个字符串对象存储“ab,两个指向的内存空间不同!!!因此输出false

3m3()运行输出true,因为final定义了bb为字符串常量,因此表达式b= a+bb是确定的,因此ab同时指向字符串常量池中的“ab

4m4()运行输出false,因为getBB()相当于newString(“b);在堆内存中创建了对象,所以b指向的是堆内存中的对象,而a指向的是字符串常量池中的字符串,所以两个指向的不是同一个“ab,因此输出false

5m5()第一个输出是false,原因:a是指向字符串常量池中“ab的变量,而s=s1+ s2s1s2是变量,是不确定的,不能再存储在字符串常量池中,而是存储在堆中新建的字符串对象,因此as指向的不是同一个字符串

M5()的第二个输出结果是true原因String调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。

两个变量指向的是同一个“ab!!

6m6()第一个输出是falseaa是在堆中分配的对象字符串“ab”,而s是在堆中新建一个对象存储字符串,所以两个变量指向不同的内存空间

第二个输出是falses.intern()将字符串添加到常量池中了,而aa还是指向堆空间的引用,因此两个字符串变量指向的是不同的内存空间

第三个输出trues.intern()aa.intern()都是将堆中的字符串添加到字符串常量池中,在常量池中维护的是同一份数据,因此两个指向的是同一个字符串常量“ab”,所以输出true



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值