String

package mytest;

public class StringTest {
    /**
     * 我们知道String是final类,它所封装的是字符串常量,因此String对象在创建后其内部(字符串)值不能改变,也因此String对象可以被共享。
     * intern有个好处,下文中的d对象就会被回收,常量池中的对象可以被共享,节省了资源的利用
     * 使用==比较字符串,性能更高,equal会比较字符串中每一个字符。但是==号可能会出现和本意不符的使用场景
     */
    public static void main(String[] args) {
        String a = new String("1");// 在堆内存空间创建一个字符串对象、常量池中又创建一个对象
        String b = new String("1");
        String c = "1";// 在常量池内存空间中创建一个字符串对象
        System.out.println(a == b);// FALSE
        System.out.println(a == c);// FALSE

        String d = new String("1");
        String f = d.intern();// 从常量池中获取equal相等的对象,如果没有则在常量池中新建。
        System.out.println(d == f);// FALSE:堆内存对象和常量池中的对象比较
        System.out.println(f == c);// TRUE:常量池中的对象与常量池中的对象比较

        String g = "1";
        String h = "2";
        final String gg = "1";// 1和2都是常量,值是固定的,因此s的值也是固定的,它在类被编译时就已经确定了
        final String hh = "2";
        String i = g + h;// 在运行时创建的字符串具有独立的内存地址,所以不引用自同一String对象.
        String ii = gg + hh;
        String j = "12";
        String k = "1" + "2";// 在编译成.class时能够识别为同一字符串的,自动优化成常量,引用自同一String对象.
        System.out.println(i == j);// FALSE
        System.out.println(i == k);// FALSE
        System.out.println(ii == k);// TRUE
        System.out.println(j == k);// TRUE

        String xx = new StringBuffer().append("123").append("456").toString();
        System.out.println(xx.intern() == xx);//TRUE 两个常量池中的值比较

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值