String,StringBuilder,StringBuffer

本文详细介绍了Java中String、StringBuffer和StringBuilder的区别,包括不可变性、内存位置、拼接效率和适用场景。重点讲解了常量池、堆内存和线程安全性的特点,并提供了实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一.String

  • 字符串一旦创建,就不可改变,且该对象打印出来为值
    要想打印16进制地址Integer.toHexString(System.identityHashCode(s2))
 //字符串一旦创建,就不可改变,且该对象打印出来为值,要想获取地址调用toHexString()
        String s2 = "String1";
        System.out.println(Integer.toHexString(System.identityHashCode(s2)));//用于打印String的地址  776ec8df
        s2 = "String2";//这里重新给变量赋值,其实是重新创建了一个对象
        System.out.println(Integer.toHexString(System.identityHashCode(s2))); // 4eec7777

这里打印出的地址是不同的说明不是同一常量

  • 通过双引号进行赋值的变量会放在常量池中,在进行赋值前会先在常量池中进行查找,有直接赋给变量当前值的地址
        String s2 = "String1";
         System.out.println(Integer.toHexString(System.identityHashCode(s2)));//  776ec8df
        String s3 = "String1";
 System.out.println(Integer.toHexString(System.identityHashCode(s3))); // 776ec8df
  • 通过new String()创建的对象是在堆中
   String string = new String("String");
        String string1="String";
        System.out.println(Integer.toHexString(System.identityHashCode(string1)));
        // 3d075dc0
System.out.println(Integer.toHexString(System.identityHashCode(string)));
   //214c265e
  • 字符串的拼接
 //String中的字符串拼接
        String s5=s4+"e";//变量+常量
        String s6="ae";
        String s7="a"+"e";//常量+常量 直接拼接  
        System.out.println(s6==s7);//这里为true因为常量优化机制直接会将其拼接
        System.out.println(s5==s6); //这里为false因为一个在常量池中一个在堆内存中
        /*
        这里是创建了一个StringBuilder 然后将s4赋值给他然后利用append方法将c加入,然后调用toString();返回给一个在堆中的新的String对象
         */
  • 常用方法
 String s222 = "15881902965";   
        String s12 = "3131";
        //字符串数组的相互转换
        char[] chars = s12.toCharArray();
        for (char c : chars
        ) {
            System.out.print(c + " ");

        }
        System.out.println(chars.toString());
        //字符串之间的相互比较
        s12.equals(s222);//比较的是值
        //替换
        String ss="tmd232";
        String replace  = ss.replace("tmd", "**");
        //截取
        String substring = ss.substring(1, 3);
         //切割
        String sss="192,31,3111";
        String sss1="192.31.111";
        String[] split = sss.split(",");
        String[] split1 = sss1.split("\\.");//由于是根据正则表达式进行切割,这里需要转义

二.StringBuffer

StringBuffer是线程安全的可变字符串,用于多线程中


三.StringBuilder

StringBuilder是线程不安全的可变字符串,用于单线程,全局变量中
初始长度为16,一般建议提前给定字符串长度

   StringBuilder stringBuilder = new StringBuilder("dada");
        System.out.println(Integer.toHexString(System.identityHashCode(stringBuilder))); //34a245ab
        stringBuilder.append("sda"); //尾部插入
        System.out.println(Integer.toHexString(System.identityHashCode(stringBuilder))); //34a245ab
        System.out.println(stringBuilder); //dadasda
        stringBuilder.insert(0,2); //其中一个位置插入
        System.out.println(stringBuilder);

比较

基本原则:
如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。

不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值