String 类
一、String 介绍
-
String 对象用于保存字符串,也是一组字符序列;
-
字符串常量对象是用 " " 括起来的字符序列;
-
字符串的字符使用 unicode 字符编码,一个字符(不区分字母大小写)占两个字节。
-
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);
-
String 类实现了接口 Serializable【可以串行化:可以在网络中传输】;
-
String 类实现了接口 Comparable【String 对象可以比较大小】;
-
String 类是 final 类,不能被其它的类继承;
-
String 类中有属性 private final char value[ ]; 用于存放字符串内容;
-
一个 value 是一个 final 类型,不可以被修改指向的(不可以将value赋值给一个字符数组);但是单个字符的内容可以变化;
二、创建String对象的两种方式
-
直接赋值 ;
先从常量池查看是否有赋值的字符串,如果有直接指向;如果没有就先创建,再指向;字符串对象最后指向的是常量池的空间地址;
-
调用构造器;
现在堆中创建空间,里面维护了value的属性,然后指向常量池,判断是否有该字符串,如果有,就直接使用value指向,如果没有就先创建再指向;最终字符串对象指向的是堆空间中的value空间地址;
-
String类是一个final 类,代表不可变的字符序列;
-
字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的;
三、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 类
一、基本介绍
- java.lang.StringBuffer 代表可变字符序列,可以对字符串内容进行增删;
- 很多方法与String相同,但StringBuffer是可变长度的;
- StringBuffer 是一个容器;
- StringBuffer 的直接父类 是 AbstractStringBuilder
- StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化
- 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final ,该 value 数组存放 字符串内容,引出存放在堆中的
- StringBuffer 是一个 final 类,不能被继承
- 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除) , 不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String
二、String vs StringBuffer
- String 是保存字符串常量,里面的值不可以更改,每次String类的更新,实际上就是更改地址;
- 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 类
一、基本介绍
-
一个可变的字符序列,此类提供一个与StringBuffer 兼容的API,但不保证同步(StringBuilder 不是线程安全)。
-
此类被设计用作StingBuffer 的简易替换。用在字符串缓冲区被单个线程使用的时候;
-
StringBuilder 上的主要操作是 append 和inser 方法,可以重载这些方法,已接受任意类型的数据;
-
StringBuilder 的直接父类是 AbstractStringBuider;
-
StringBuilder 实现了Serializable 接口,可以实现序列化(保存数据类型和数据本身,可以用于网络传输,也可以保存到文件);
-
StringBuilder 是 final 类,不能被继承;
-
StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用。
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{ ....... }
三者比较
一、StringBuilder 和StringBuffer
- StringBuilder 和 StringBuffer 非常的相似,均代表可变的字符序列。而且方法也一样;
- StringBuilder 是线程不安全的,增加和删除的效率最高;
- StringBuffer 是线程安全的,增加和删除的效率较高;
二、String 与StringBuilder、StringBuffer
- String 是不可变的字符序列,效率低,但是复用率高;
三、String 、StringBuilder、StringBuffer的选择
- 如果字符串存在大量修改操作,一般使用StringBuffer 和 StringBuilder
- 如果字符串存在大量修改操作,且单线程:使用 StringBuilder;
- 如果字符串存在大量修改操作,且多线程:使用 StringBuffer;
- 如果对字符串很少修改,被多个对象引用,使用 String 比如配置信息;