String 、StringBuilder、StringBuffer

String 类

一、String 介绍

  1. String 对象用于保存字符串,也是一组字符序列;

  2. 字符串常量对象是用 " " 括起来的字符序列;

  3. 字符串的字符使用 unicode 字符编码,一个字符(不区分字母大小写)占两个字节。

  4. String 类常用的构造器;

    String str1 = new String();
    String str2 = new String(String orignal);
    String str3 = new String(char[] ch);
    String str4 = new String(char[] ch,int startIndex,int count);
    
  5. String 类实现了接口 Serializable【可以串行化:可以在网络中传输】;

  6. String 类实现了接口 Comparable【String 对象可以比较大小】;

  7. String 类是 final 类,不能被其它的类继承;

  8. String 类中有属性 private final char value[ ]; 用于存放字符串内容;

  9. 一个 value 是一个 final 类型,不可以被修改指向的(不可以将value赋值给一个字符数组);但是单个字符的内容可以变化;

二、创建String对象的两种方式

  1. 直接赋值 ;

    先从常量池查看是否有赋值的字符串,如果有直接指向;如果没有就先创建,再指向;字符串对象最后指向的是常量池的空间地址;

  2. 调用构造器;

    现在堆中创建空间,里面维护了value的属性,然后指向常量池,判断是否有该字符串,如果有,就直接使用value指向,如果没有就先创建再指向;最终字符串对象指向的是堆空间中的value空间地址;

  3. String类是一个final 类,代表不可变的字符序列;

  4. 字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的;

三、String 类常见方法:

// 1. equals() 前面已经讲过了. 比较内容是否相同,区分大小写
// 2.equalsIgnoreCase() 忽略大小写的判断内容是否相等
// 3.length() 获取字符的个数,字符串的长度
// 4.indexOf() 获取字符在字符串对象中第一次出现的索引,索引从 0 开始,如果找不到,返回-
// 5.lastIndexOf() 获取字符在字符串中最后一次出现的索引,索引从 0 开始,如果找不到,返回-1
// 6.substring() 截取指定范围的子串
// 7.toUpperCase() 转换成大写
// 8.toLowerCase() 转换成小写
// 9.concat() 拼接字符串
// 10.replace() 替换字符串中的字符
// 11.split() 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等
// 12.toCharArray() 转换成字符数组
// 13.compareTo() 比较两个字符串的大小
// 14.format() 格式字符串 占位符有: %s 字符串 %c 字符 %d 整型 %.2f 浮点型

StringBuffer 类

一、基本介绍

  1. java.lang.StringBuffer 代表可变字符序列,可以对字符串内容进行增删;
  2. 很多方法与String相同,但StringBuffer是可变长度的;
  3. StringBuffer 是一个容器;
  4. StringBuffer 的直接父类 是 AbstractStringBuilder
  5. StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化
  6. 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final ,该 value 数组存放 字符串内容,引出存放在堆中的
  7. StringBuffer 是一个 final 类,不能被继承
  8. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除) , 不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String

二、String vs StringBuffer

  1. String 是保存字符串常量,里面的值不可以更改,每次String类的更新,实际上就是更改地址;
  2. StringBuffer 保存的是字符串变量,里面的值可以更改,每次StringBuffer 的分型实际上可以更新内容,不用每次更新地址,效率较高;

三、String 和 StringBuffer 的相互转换

// String -> StringBuffer
// 方式 1 使用构造器
// 注意: 返回的才是 StringBuffer 对象,对 str 本身没有影响
StringBuffer stringBuffer=new StringBuffer(str);
// 方式 2 使用的是 append 方法
StringBuffer stringBuffer1=new StringBuffer();
stringBuffer1=stringBuffer1.append(str);


// StringBuffer ->String
StringBuffer stringBuffer3=new StringBuffer("str");
// 方式 1 使用 StringBuffer 提供的 toString 方法
String s=stringBuffer3.toString();
// 方式 2: 使用构造器来搞定
String s1=new String(stringBuffer3);

四、StringBuffer 类常用方法

 StringBuffer strB = new StringBuffer("hello");
// StrB.append("");增加
// strB.delete();删除
// StrB.replace;替换
// strB.Insert();插入
// strB.length();返回长度

StringBuilder 类

一、基本介绍

  1. 一个可变的字符序列,此类提供一个与StringBuffer 兼容的API,但不保证同步(StringBuilder 不是线程安全)。

  2. 此类被设计用作StingBuffer 的简易替换。用在字符串缓冲区被单个线程使用的时候;

  3. StringBuilder 上的主要操作是 append 和inser 方法,可以重载这些方法,已接受任意类型的数据;

  4. StringBuilder 的直接父类是 AbstractStringBuider;

  5. StringBuilder 实现了Serializable 接口,可以实现序列化(保存数据类型和数据本身,可以用于网络传输,也可以保存到文件);

  6. StringBuilder 是 final 类,不能被继承;

  7. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用。

    public final class StringBuilder
        extends AbstractStringBuilder
        implements java.io.Serializable, CharSequence{
        .......
    }
    

三者比较

一、StringBuilder 和StringBuffer

  1. StringBuilder 和 StringBuffer 非常的相似,均代表可变的字符序列。而且方法也一样;
  2. StringBuilder 是线程不安全的,增加和删除的效率最高;
  3. StringBuffer 是线程安全的,增加和删除的效率较高;

二、String 与StringBuilder、StringBuffer

  1. String 是不可变的字符序列,效率低,但是复用率高;

三、String 、StringBuilder、StringBuffer的选择

  1. 如果字符串存在大量修改操作,一般使用StringBuffer 和 StringBuilder
  2. 如果字符串存在大量修改操作,且单线程:使用 StringBuilder;
  3. 如果字符串存在大量修改操作,且多线程:使用 StringBuffer;
  4. 如果对字符串很少修改,被多个对象引用,使用 String 比如配置信息;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值