Java心得体会之String

String类型是我们在编程中经常会用到的一个类,这个类位于java.lang包中是一个final类,所以String对象不能改变值,只能有这个引用指向新的对象而不能改变原来对象的值。

同时由于字符串也是常量的特点,我们经常会遇到这种问题,如下列代码:

public static void main(String[] args) {
        // TODO Auto-generated method stub

        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String("abc");
        String s5 = "a"+"b"+"c";
        String s6 = new String("ab");
        String s7 = s6 + "c";

        System.out.println(s1==s2);
        System.out.println(s3==s4);
        System.out.println(s1==s3);
        System.out.println(s1==s5);
        System.out.println(s1==s7);
    }

输出结果为:

true
false
false
true
false

为什么会出现这种情况?其实就是因为String类型的存储方式和其他类并不完全相同,当一个String对象是使用new实例化的时候,这时候这个对象的存储位置是在堆中,并且new一次就会创建一个新的对象,所以s3不等以s4也就是说这里两个引用指向不同位置。

但是如果是使用String s1 = “abc”;形式的对象,这时候s1的存储位置就会变化,它的存储位置改为内存方法区中的字符串常量池当中,并且当有下一个对象以同样形式实例化的时候,会先检查常量池当中是否已经有该字符串,如果有就会指向该字符串,没有,则在常量池当中新建。所以,String s2 = “abc”; s2和s1是相等的。

同样,如果以这种形式String s5 = “a”+”b”+”c”;实例化,编译期会自动将三个字符串常量先进行相加,然后将结果与常量池当中字符串进行对比,相等则指向,不等则创建新的字符串。

有时候,我们需要将一个位于堆的对象移到常量池中,Java为我们提供了一个方法 s3.intern(); 该方法可以实现我们的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值