String str=“i“与 String str =new String(“i“)一样吗?字符串是否相等案例s1==s3?

文章讨论了Java中String对象的两种创建方式及其内存分配差异,常量池与堆内存的区别。同时,解释了字符串拼接的机制,包括JDK8以前和以后的变化,以及StringBuilder如何提高效率。示例代码展示了不同拼接方式下的结果比较。
摘要由CSDN通过智能技术生成

String str="i"与 String str =new String("i")一样吗?

不一样,因为内存的分配方式不一样。

String str="i"的方式,Java 虚拟机会将其分配到常量池中;

而 String str=new String("i") 则会被分到堆内存中

下列代码的运行结果是?

public class test {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "ab";
        String s3 = s2 + "c";
        System.out.println(s1 == s3);
    }
}

/*
 * Copyright (c) 2017, 2023, zxy.cn All rights reserved.
 *
 */
package cn.str;

/**
 * <p>Description:</p>
 * <p>Class:</p>
 * <p>Powered by zxy On 2023/6/9 20:36 </p>
 *
 * @author zxy [zxy06291@163.com]
 * @version 1.0
 * @since 17
 */
public class test {
    public static void main(String[] args) {
        String s1 = "abc";//记录串池中的地址值
        String s2 = "ab";
        String s3 = s2 + "c";//新new出来的对象
        System.out.println(s1 == s3);//false
    }
}

 字符串拼接的时候,如果有变量:

JDK8以前:系统底层会自动创建一个 StringBuilder 对象,然后再调用其 append 方法完成拼接

JDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串

下列代码的运行结果是?

public class test1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "a" + "b" + "c";
        System.out.println(s1 == s2);
    }
}

/*
 * Copyright (c) 2017, 2023, zxy.cn All rights reserved.
 *
 */
package cn.str;

/**
 * <p>Description:</p>
 * <p>Class:</p>
 * <p>Powered by zxy On 2023/6/9 20:48 </p>
 *
 * @author zxy [zxy06291@163.com]
 * @version 1.0
 * @since 17
 */
public class test1 {
    public static void main(String[] args) {
        String s1 = "abc";//记录串池中的地址值
        String s2 = "a" + "b" + "c";//复用串池中的字符串
        System.out.println(s1 == s2);//true
    }
}

在编译的时候,就会将"a" + "b" + "c"拼接为“abc"

拓展:

字符串拼接的底层原理

  • 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串
  • 如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存

StringBuilder 提高效率原理图

  • 所有要拼接的内容都会往StringBuilder 中放,不会创建很多无用的空间,节约内存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值