字符串的理解


public class TestDemo {

    public static void main(String[] args) {
        
        // 创建常量的字符串
        String str = "helloworld";
        //创建字符串的对象
        String str1 = new String("helloworld");
        
        /**
         * 进行判断.==进行的地址判断。str是直接先在栈区分一块内存,然后指向数据共享区的"helloworld".
         * 而str1则先在栈区分一块内存,然后在堆内存中分一块区间来存放new String()
         * 所有结果是false
         */
        System.out.println(str == str1);
        
        /**
         * 使用equals比对的是值,所以结果是true
         */
        System.out.println(str.equals(str1));
        
        //定义两个字符串常量
        String str2 = "hello";
        String str3 = "hello";
        
        /**
         * str2对象建立时,先查找数据共享区是否有字符串"hello",若没有则在数据共享区创建一个hello字符串;
         * str3对象建立时,也会先到数据共享区查找字符串"hello",已经存在,所有不会再创建。所以地址是一样的;
         * 因此结果是ture
         */
        System.out.println(str2 == str3);
        
        //值判断,ture
        System.out.println(str2.equals(str3));
        
        
        //定义3个字符串常量
        String str4 = "hello";
        String str5 = "world";
        String str6 = "helloworld";
        
        /**
         * 因为str4和str5是对象,对象的值是有可能会变的,所有即使(str4 + str5)拼接后为"helloworld"。
         * 即使数据共享区已经有helloworld的字符串,系统还是会在数据共享区重新分配一个地址。
         * 因此结果是false
         * 另外(str4 + str5)创建的对象是放在数据共享区还是堆中?肯定是数据共享区,因为他们没有对应的引用,若是放在了堆中,很容易
         * 就会被垃圾回收器回收了。
         */
        System.out.println(str6 == (str4 + str5));
        
        /**
         * 因为("hello" + "world")是常量字符串,值是不会变的。
         * 所以在数据共享区已经有helloworld的字符串的情况下,系统是不会再创建新的。
         * 因此结果是ture
         */
        System.out.println(str6 == ("hello" + "world"));
        
        //值比较肯定是一样的,所以是ture
        System.out.println((str4 + str5).equals(str6));
        System.out.println(("hello" + "world").equals(str6));
    }
    

}     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值