String 类
位于java.lang包
public final class String extends Object implements Serializable, Comparable<String>,
CharSequence
String是final修饰的,是常量,它们的值在创建之后不能更改
字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享
String效果上相当于cher[],但底层原理确是byte[]1.9之后
所有的字符串面值"ddd" 都做为此类的实例实现
只要是双引号字符串,就算没有new,也是String对象
特点
字符串的内容不可变,指的是同一块堆内存里的值是不会改变的
创建String的常见方式
> String str1=new String(); 这样创建的对象为空值,但由于String是不可变的,所以这个可以省略
> char[] ch={'1','2','4'}
String str2=new String(ch);
> byte[] by={45,33,22,66,88}; String类底层就是byte数组1.9之后
String dtr3=new String(by);
> String str="ddddd"
常量池
直接使用双引号创建的字符串,会自动保存在常量池里(常量池的对象保存的也是地址值,指向的是创建对象的byte数组)
且常量池在堆内存里
常用方法
boolean equals (String str) 进行字符串内容的比较
boolean equalsIgnoreCase(String str) 忽略大小写进行比较
String concat(String str) 将当前字符串和参数字符串拼接为新的字符串斌且返回
char charAt(int index) 获取指定索引位置的单个字符
int indexof(String str) 查找参数字符串在该字符串中首次出现的位置,没有返回-1
String subString(int index) 从参数位置开始截取,到末尾
String subString(int index,int end) 从index开始截取,到end-1位置的字符串
char[] toCharArray() 将字符串拆分为字符数组并且返回
byte[] getbytes() 获得当前字符串对象的底层字节数组
String replace(CharSequence old,CharSequence newstring) 将字符串中的old替换为newstring
将所有出现的老字符串替换为新的字符串,并且返回
String[] split(String regex) 按照参数的规则,将字符串分割成若干份
该参数其实是一个正则表达式 当然也可以使用普通地字符进行切割
当使用到一些特殊地符号时,需要使用转义如"\\."
静态方法, static String valueOf() 将其他类型地数据转换为字符串,int ,long,float,double,boolean,char等
其实,构造中也有对于byte数组转为字符串的方法
弊端
由于字符串不可变, 改变字符串其实是创建了另一个实例 ,这样依赖就会占用空间多,效率低
下 ,但是字符串缓冲区的是可以改变的,如下
StringBuilder 字符串缓冲区可以改变
public final class StringBuilder extends Objectimplements Serializable, CharSequence
一个可变的字符序列 不是线程安全的
可以看成一个长度可以变的字符串 可以提高效率
底层也是数组,但没有被final修饰
初始容量为16
byte[] value=new byte[16];
在内存中。始终是一个数组
如果超过了容量,不会分配新的缓冲区,而是会自动扩容一倍
构造方法
public StringBuuilder() :构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
public StringBuilder(int capacity) :构造一个不带字符,但具有指定初始容量capacity的字符串缓冲区。
public StringBuilder(String str) :构造一个字符串缓冲区,并将其内容初始化为指定的字符串内
容。该字符串的初始容量为 16 加上字符串参数的长度
public StringBuilder(CharSequence seq): 它包含与指定的 CharSequence 相同的字符 ,该字符
串缓冲区的初始容量为 16 加上 CharSequence 参数的长度。
成员方法 (常用)
public StringBuilder append(Object obj) 追加 Object 参数的字符串表示形式。
它支持各种数据的加入 Stringbuffer String 都可以 ,数组等
StringBuilder insert(int oio,float s)
将 float 参数的字符串表示形式插入此序列中。
其中可以是其他类,Object也可以,除了byte个short
public int capacity() 返回当前容量
public char charAt(int index)返回此序列中指定索引处的 char 值
public StringBuilder delete(int start,int end)
移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的
字符,如果不存在这种字符,则一直到序列尾部,如果 start 等于 end,则不发生任何更改
public StringBuilder deleteCharAt(int index)移除此序列指定位置上的 char。
public int indexOf(String str,int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符
串在该字符串中的索引 fromIndex开始索引
public int indexOf(String str)返回第一次出现的指定子字符串在该字符串中的索引
public StringBuilder insert(int offset,Object obj):将 Object 参数的字符串表示形式插入此字符
序列中。 其他的数据类型都可以
public void setCharAt(int index, char ch) 给定索引处的字符设置为 ch
public StringBuffer reverse() 将此字符序列用其反转形式取代
public String toString() 返回此序列中数据的字符串表示形式。
等等众多常用方法
上面的StringBuilder不是线程安全的
还有一个类
StringBuffer 除了是线程安全的,其他都一样
由此我们得知,
当是单线程时,我们使用StringBulider
当是多线程时,我们使用StringBuffer