【Java String学习】String s1 = new String(“abc”)创建了几个对象?String s1 =new String(“abc)和String s2 = “abc”的区别

在这里插入图片描述
写了有关String创建的一系列的问题,总结为:(假设字符串常量池为空)
● 使用String s=new String(“abc”),如果常量池没有,则在堆和常量池创建对象,最后指向堆
● 直接赋值String s=“abc”,只在常量池创建,栈中放引用,堆中没有创建对象,最后指向常量池。
● 使用String s=new String(“ab”)+"c"拼接,则在池中创建new的字符串和赋值的字符串,最后指向堆
● 使用String s=“ab”+"c"拼接,在池中创建拼接好的字符串“abc”,最后指向常量池
下面是测试详细的过程:

public class StringTest {
   
    @Test
    public void StringInfo() {
   
        String s1 = new String("abc");
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = "abc";

        //s1和s2不同,因为s1会同时在堆和字符串常量池中创建对象,s1中存到是指向堆中“abc"的引用,s2存的是指向字符串常量池中的引用
        System.out.println(s1 == s2); //false

        //s1和s3也不同,因为显示的使用了new,肯定会在堆里新建一个“abc”,字符串常量池中已经有“abc”了,就不会再创建了,但是s3会指向堆里新创建的“abc”
        System.out.println(s1 == s3); //false

        //s2和s3不同,因为虽然字符串常量池中有了“abc”,但是s3使用了new,所以会在堆里创建对象,并指向堆。
        System.out.println(s2 == s3); //false

        //s2和s4相同,他们没有使用new,都指向字符串常量池中的“abc”
        System.out.println(s2 == s4); //true

        System.out.println("----------------------------------");
        //进一步的
        System.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值