String与StringBuffer对比

String

特点

由于 String 类使用 private final char value[]来实现字符串存储,所以String对象一旦创建,不可改变。这点相较与StringBuffer类有所不同,StringBuffer是可变的,而且是线程安全的。

常量池

常量池(Constant Pool)是一个由数组组成的表,用来存储程序中的各种常量,包括Class、String、Integer等各种Java基本数据类型;而我们创建的String常量也存储与常量池的String Pool中。

创建String
//直接的""创建机制
String s1 = "first";
String _s1 = "first";
System.out.println(s1  == _s1 );//true
String s2 = new String();
String s3 = new String("string");
String s4 = "first" + "second";

编译期常量在编译完成后,"hello"就已存储在 Constant Pool 常量池中;到了运行期时,虚拟机会调用intern()方法,拿着"hello"去常量池中查找有没有这个对象(通过equals方法)。存在则返回常量池中相应的内存单元的引用位置,赋值给str1,str2同理。假如不存在,则会新建一个的 “hello” 放到 Constant Pool 中,返回内存单元的引用位置,赋值给引用的变量。

intern()方法: 当调用intern方法时,JVM会在常量池中通过equals()方法来匹配是否存在等值的String;若存在,则直接返回其地址,否则再新建。

new String(“hello”)的创建机制
String str1 = "hello";
String str2 = new String("hello");//创建两次String对象,一次在String Pool中,一次在堆内存中
System.out.println(str1 == str2);//false

在Java中,new一个新对象,不管在String Pool中是否存在相同的字符串对象,总会创建一个新的String对象存储在堆内存(heap)中,然后返回heap中相应内存单元的地址,赋值给str1;而srt2是指向String Pool中相应内存单元。

String常用方法
//1、构造方法
String str = new String(byte[] bytes);//参数为字节数组,走编码表
String str = new String(char[] ch);//参数为字符数组,不走编码表,将字符数组变成字符串

//   返回值    |       方法            |       解释
     int          length()               //获取字符串str长度
     string       substring(begin,end)   //截取字符串的一部分,包括头不包括尾,返回新的字符串
     string       substring(begin)       //截取从begin开始的字符串,返回新的字符串
     boolean      startWith(str1)        //判断是否以指定字符串str1开头
     boolean      endsWith(str1)         //判断是否以指定字符串str1结尾
     boolean      contains(str1)         //判断是否包含某一子串
     int          indexOf(str1)          // 获取str1 在str 第一次出现的位置
     int          indexOf(char ch)       // 获取字符ch在str 第一次出现的位置
     char         charAt(index)          //根据位置(index)获取字符
     byte[]       getBytes()             //将字符串转成字节数组,走码表
     char[]       toCharArray()          //将字符串转成字符数组
     boolean      equalsIngnoreCase(String str) //判断是否相同,忽略字母的大小写
     String       toUpperCase()          //将str变成大写字母
     String       toLowerCase()          //将str变成小写字母
     String       trim()                 //去掉str中的空格
     String[]     split(",")             //将str用 ","分割成String数组
StringBuffer

由于String类过于浪费内存,为了提高字符串的操作效率,StringBuffer 横空出世。StringBuffer 是线程安全的可变字符序列,还有他的兄贵类StringBuilder是线程不安全的可变字符序列,但运行速度比StringBuffer快。
与String类不同,StringBuffer类在修饰字符数组时并没有用final修饰。导致其在操作字符串时效率非常高,不用反复在String pool中创建对象,节约了内存,提高了操作效率。StringBuffer的默认初始长度为16,支持扩容;

与String对比
String str = "hello"+"world";
//简单的一行代码,但却十分消耗内存;相当于在String pool中创建了三个对象,"hello"、"world"和"helloworld"
StringBuffer strB = new StringBuffer();
strB.append("hello").append("world");
//StringBuffer对象,由于其成员变量char[]非final修饰,value数组可以反复变化,比较String就非常节约内存
常用方法
        返回值     |      方法                     |            注释
    StringBuffer    append(任意类型)                    将任意类型数据加在容器末尾
    StringBuffer    delete(start ,end[不包含])          删除start到end的字符内容
    StringBuffer    insert(index ,数据)                 将任意类型数据加在指定索引
    StringBuffer    replace(start,end,string[不包含])   将从start开始到end的字符串替换为string
    StringBuffer    reverse()                           将缓冲区中的字符串反转
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

suppppper

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

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

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

打赏作者

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

抵扣说明:

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

余额充值