Sting和StringBuilder
String
String类代表的是字符串,java程序中所有使用双引号引起来的都是字符串。
String类位于java.lang包下,凡是位于java.lang包下的类,在使用的时候,不需要导包。java中的所有的字符串都被实现为String类的实例。java程序中所有使用双引号引起来的字符串,都是String类的对象。
String字符串的特点
- 字符串不可改变,他的值在创建之后就不能被更改
- String的值不可变,但是可以被共享
- 字符串的效果相当于字符数组(char[]),但底层 原理却是字节数组(byte[])
String类的构造方法
- String() 初始化新创建的String对象,使其表示空字符序列
- String(char[] value)分配一个新的String,以便他表示当前包含在字符数组参数中的字符序列
- String(byte[] value)通过使用平台的默认字符集解码指定的字节数组来构造新的String
- String s=“abc”;直接赋值的方式创建字符串abc
创建字符串对象的俩种方式
- 通过构造方法创建
使用new创建字符串对象,每一次new都会创建一个内存空间,虽然内容都是相同的,但是地址不同
- 直接赋值的方式创建
使用"asasn"给出的字符串,只要字符串序列相同(顺序和大小写)无论在代码中出现了几次,jvm都只会建立一个String对象,并在字符串常量池中维护
字符串的比较
- 物理地址的比较:==比较的是俩个字符串的地址是否相同
- 字符串内容的比较:
boolean equals(Object anObject) 将字符串与指定的对象比较,必须内容完全一致,区分大小写
boolean equalsIgnoreCase(String anotherString)将此String与其他String比较,忽略大小写的
String类的常用方法
-
char
charAt(int index)
返回char
指定索引处的值。 -
String
concat(String str)
将指定的字符串连接到该字符串的末尾。 -
boolean
endsWith(String suffix)
测试此字符串是否以指定的后缀结尾。 -
boolean
equals(Object anObject)
将此字符串与指定对象进行比较。boolean
equalsIgnoreCase(String anotherString)
将此String
与其他String
比较,忽略案例注意事项。 -
byte[]
getBytes()
使用平台的默认字符集将此String
编码为字节序列,将结果存储到新的字节数组中。 -
int
indexOf(int ch)
返回指定字符第一次出现的字符串内的索引。 -
int
indexOf(int ch, int fromIndex)
返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。 -
int
indexOf(String str)
返回指定子字符串第一次出现的字符串内的索引。 -
int
indexOf(String str, int fromIndex)
返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。 -
String
intern()
返回字符串对象的规范表示。 -
boolean
isEmpty()
返回true
如果,且仅当length()
为0
。 -
int
lastIndexOf(int ch)
返回指定字符的最后一次出现的字符串中的索引。int
lastIndexOf(int ch, int fromIndex)
返回指定字符的最后一次出现的字符串中的索引,从指定的索引开始向后搜索。int
lastIndexOf(String str)
返回指定子字符串最后一次出现的字符串中的索引。int
lastIndexOf(String str, int fromIndex)
返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索。int
length()
返回此字符串的长度。 -
String
replace(char oldChar, char newChar)
返回从替换所有出现的导致一个字符串oldChar
在此字符串newChar
。-
boolean
startsWith(String prefix)
测试此字符串是否以指定的前缀开头。 -
char[]
toCharArray()
将此字符串转换为新的字符数组。String
toLowerCase()
将所有在此字符String
使用默认语言环境的规则,以小写。 -
String
toUpperCase()
将所有在此字符String
使用默认语言环境的规则大写。 -
String
substring(int beginIndex)
返回一个字符串,该字符串是此字符串的子字符串。 -
String
substring(int beginIndex, int endIndex)
返回一个字符串,该字符串是此字符串的子字符串。 -
static String
valueOf(boolean b)
返回boolean
参数的字符串boolean
形式。static String
valueOf(char c)
返回char
参数的字符串char
形式。static String
valueOf(char[] data)
返回char
数组参数的字符串char
形式。static String
valueOf(char[] data, int offset, int count)
返回char
数组参数的特定子阵列的字符串char
形式。static String
valueOf(double d)
返回double
参数的字符串double
形式。static String
valueOf(float f)
返回float
参数的字符串float
形式。static String
valueOf(int i)
返回int
参数的字符串int
形式。static String
valueOf(long l)
返回long
参数的字符串long
形式。static String
valueOf(Object obj)
返回Object
参数的字符串Object
形式。
-
String的常见陷阱
String str1="abc";//字符串常量 存储在字符串常量池中 是共享的
String str2=new String("abc");//字符串非常量对象 存储在堆中
- 常量与常量的拼接,结果在常量池,且常量池中不会存在相同内容的常量
- 只要其中有一个是变量,其结果就在堆中
- 如果拼接的结果调用inter(),结果就在常量池中
StringBuilder
一个可变的字符序列;但不保证同步
可以将StringBuilder看成是一个容器,这里的可变指的是StringBuilder对象的内容是可变的。
String和StringBuilder的区别
String:内容不可变
StringBuilder:内容可变
StringBuilder构造方法
-
StringBuilder()构造一个没有字符的字符串构建器,初始容量为16 StringBuilder(int capacity)
-
构造一个没有字符的字符串构建器,由capacity参数指定的初始容量
-
StringBuilder(String str)构造一个初始化为指定字符串内容的字符串构建器
StringBuilder的常用方法
-
StringBuilder
append(int i)
将int
参数的字符串表示法附加到此序列。StringBuilder
append(long lng)
将long
参数的字符串表示法附加到此序列。StringBuilder
append(Object obj)
追加Object
参数的字符串Object
形式。StringBuilder
append(String str)
将指定的字符串附加到此字符序列。 -
StringBuilder
insert(int offset, String str)
将字符串插入到此字符序列中。int
lastIndexOf(String str)
返回指定子字符串最右边出现的字符串内的索引。int
lastIndexOf(String str, int fromIndex)
返回指定子字符串最后一次出现的字符串中的索引。 -
int
length()
返回长度(字符数)。 -
StringBuilder
reverse()
导致该字符序列被序列的相反代替。 -
void
setCharAt(int index, char ch)
指定索引处的字符设置为ch
。 -
String
substring(int start)
返回一个新的String
,其中包含此字符序列中当前包含的字符的子序列。String
substring(int start, int end)
返回一个新的String
,其中包含此序列中当前包含的字符的子序列。String
toString()
返回表示此顺序中的数据的字符串。void
trimToSize()
尝试减少用于字符序列的存储。
实现一个将String和Stringbuilder两个对象之间的相互转换
- 将StringBuilder 转换为String
String
toString()
返回表示此顺序中的数据的字符串。
- 将String转换为StringBuilder
StringBuilder(String str)
构造一个初始化为指定字符串内容的字符串构建器。
StringBuilder和String的使用场景
-
如果只是单纯的使用到一个字符串,则直接使用String
-
如果字符串的内容是需要动态改变(动态拼接)则是用Stringbuilder
StringBuffer 和Stringbuilder的区别
- Stringbuffer 线程同步的 线程安全的
- Stringbuilder线程不同步 线程不安全的
在一般情况下 使用StringBuilder ,在多线程环境下 进行字符串的拼接操作 此时就需要考虑使用StringBuffer