字符串和StringBuffer,StringBuilder使用和底层原理

字符串

字符串常量存在字符串池中

  1. 方法区:1.7前叫永久代,1.7后叫元空间
  2. 引用类型放在栈里,对象放在堆里

字符串的不可变特性

  • 修改字符串值时,改变的是他的地址
  • 是在字符串池中开辟一块新空间

永久代

package com.li.changGe.commonlyusedClass.strings;

public class StringBaseDemo01 {
  public static void main(String[] args) {

    String name;//引用类型
    /**
     * 这句话是让栈内存中的变量name,指向堆内存中的一个地址
     * 而这个地址指向了字符串池中的java常量
     *
     * java在堆和方法区都有一个
     * 两者最后会合为一个:堆指向方法区
     */
    name = new String("java");//对象
//----------------------------------------------------
    /**
     * hashCode值相同,但是这是人为new出来的
     */
    String name1 = "java";

    /**
     * true
     * false
     */
    System.out.println(name.hashCode() == name1.hashCode());//true
    System.out.println(name == name1);//false

  }

}

StringBuffer和StringBuilder

  1. 1.0时有StringBuffer(会慢点,线程安全),
  2. 1.5后有StringBuilder(效率高,线程不安全)

相比String效率高,节省内存:内部是一个可变长字符串


可变长字符串实现

*新数组的长度(newCapacity)等于原数组的长度(value)2后再+2

StringBuffer


StringBuffer的方法都被synchronized修饰

append

StirngBuilder线程不安全

StringBuilder


package com.li.changGe.commonlyusedClass.strings;

public class StringBufferAndStringBuilderDemo01 {
  public static void main(String[] args) {

    StringBuffer stringBuffer = new StringBuffer("长歌");
    StringBuilder stringBuilder = new StringBuilder("世民");

    stringBuffer.append("关山万里路");
    stringBuilder.insert(0,"天佑大唐");

    /**
     * 含头不含尾
     */
    stringBuffer.replace(0,2,"李长歌");
    stringBuilder.delete(0,stringBuilder.length() - 1);

    /**
     * 李长歌关山万里路
     * 天佑大唐世民--> "民"
     */
    System.out.println(stringBuffer.toString());
    System.out.println(stringBuilder.toString());
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helloses

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值