Java中的字符串类型是一种引用类型java.lang.String
。另外,还有两种辅助字符串类型java.lang.StringBuffer
和java.lang.StringBuilder
。
String是字符串常量类,最大的特点就是不可修改。
看下面代码:
String s="Hello";
System.out.println(s);
s="Hello World";
System.println(s);
输出结果为:
Hello
Hello World
看似s的内容改变了。但是,上面的代码实际上是先把内容为"Hello"的字符串对象赋给s,后来又把内容为"Hello World"的对象赋给s,并不是在一个对象上改变它的内容。事实上,String类封装了一个final的char[]类型属性。
String字符串的不可变性有很对好处,比如字符串常量池的实现、字符串的安全性与高效性。关于String的深入剖析涉及到JVM的运行机制,有兴趣可以看一下这篇博客:深入理解Java中的String(大坑)
但同时使得涉及字符串内容的更新操作都会创建一个新的String对象,影响性能。所以,为了高效完成字符串的修改操作,Java提供了StringBuffer类和StringBuilder类。
StringBuffer是一个具有缓存区的字符串类,支持字符串的动态修改,并且是线程安全的。
为了适应只有当线程的情况,Java5.0提出了StringBuilder类,它与StringBuffer具有基本一样的方法,但是线程不安全。
根据这三个类的特点,选用的基本原则是:
1.字符串内容不变的用String。
2.单线程需要修改字符串内容用StringBuilder。
3.多线程修改字符串内容用StringBuffer。
1.字符串常量直接赋值。如String s="Hello"
。
2.使用new。如String s=new String("Hello")
。
【注】情况1是最常用的。1和2的区别在于字符串的储存位置,设计JVM知识。
3.从char[]创建字符串:String(char[] value)
和String(char[] value, int offset, int count)。
4.从StringBuffer/StringBuilder类创建字符串对象:String(StringBuffer/StringBuilder buffer)
或stringBuffer.toString()
。
我们常常需要用到字符串与字符数组直接的转化。
1.char[] ->String : String(char[] value)
和String(char[] value, int offset, int count)
。
2.String -> char[] :char[] toCharArray()
和void getChars(int srcBegin, int srcEnd,char[] dst, int dstBegin)
【注】getChars(int srcBegin, int srcEnd,char[] dst, int dstBegin)将源字符串的[srcBegin,srcEnd)赋给dst的[dstBegin,dstBegin+srcBegin-srcEnd)。如
char[] ch=new char[6];
"Hello World".getChars(2,8,ch,0); //char=[l,l,o, ,W,o]
提取子串最常用的方法是String substring(int offset,int end)
。
此外,当子串为后缀时,也可以用Stirng substring(int offset)
方法。
1.判等:boolean equals(String anotherString)
当忽略大小写时,有boolean equalsIgnoreCase(String anotherString)
【注】字符串的判等千万不能用==
2.字典顺序比较:int compareTo(String anotherString)
int compaerToIgnoreCase(String anotherString)
忽略大小写
【注】s1.compareTo(s2)的返回值:s1在字典前于s2,返回负数,后于s2返回正值,s1与s2内容相等返回0。
3.与StringBuffer/StringBuilder判等:boolean contentEquals(StringBuffer buffer)
1.int indexOf(int ch)
和int indexOf(int ch, int fromIndex)
2.int indexOf(String substr)
和int indexOf(String substr)
3.int lastIndexOf(int ch)
和int lastIndexOf(int ch, int fromIndex)
4.int lastIndexOf(String substr)
和int lastIndexOf(String substr)
记忆:检索用indexOf,支持字符和字符串的检索,如果需要,第二个参数指定检索开始位置,需要检索最后位置时用LastIndex。
1.是否包含:boolean contains(String str)
。
2.前缀检查:boolean startsWith(String prefix)
和boolean startsWith(String prefix, int toffset)
。
3.后缀检查:boolean endsWith(String suffix)
。
4.正则表达式匹配:boolean matches(String regex)
。
虽然String是常量类型,当时,从原有字符串创建新的字符串也很常见,下面是一些常见的字符串变换。
1.大小写转化:String toUpperCase()
和String toLowerCase()
。
2.单个字符替换:String replace(char oldChar, char newChar)
。(会替换所有)
3.字符串替换:String replaceAll(String regex, String dst)
和String replaceFirst(String regex, String dst)
。
4.去掉首尾空格:String trim()。
1.基本类型 -> String:Stirng.valueOf()
【注】valueOf的参数可以是任何基本类型对象,它会返回对应对象的字符串形式。
2.String->基本类型: 可以用数据基本类型的包装类型(Integer、Double、Byte、Long、Float)的对应静态函数parseXXX()
实现String类型到基本类型的转化。另外,String->boolean类型是用Boolean.getBoolean(String str)
。
因为StringBuilder与StringBuffer的方法基本一致,这里用StringBuffer示例,StringBuilder也有同样方法。
构造函数StringBuffer()
和StringBuffer(String str)
使得可以创建一个空串的StringBuffer对象,也可以从已有字符串创建StringBuffer对象。
StringBuffer的意义就是为了支持字符串的修改,所以这部分的使用十分重要。
1.从末尾添加:append()
方法支持从StringBuffer的字符串末尾添加各种类型的字符串形式,使用时,参数为添加的对象。
2.指定插入:insert()
方法支持指定位置的添加,第一个参数为插入位置,第二个参数为插入内容,支持对种类型。
3.删除:delete(int offset,int end)
和deleteCharAt(int index)
。
4.指定位置字符替换:setCharAt(int index, char ch)
。
5.指定位置字符串替换:replace(int start,int end,String str)
。
6.反转字符串:reverse()
。
String中有些字符串很常用的方法,在StringBuffer与StringBuilder中也有一样的 。
如:CharAt
、indexOf
。