Java字符串知识框架图
Paste_Image.pngJava字符串
** 1. 不可变字符串(String) **
** 2. 可变字符串(StringBuffer,StringBuilder) **
不可变字符串(String)
String是一个不可变的字符序列,那么为什么String类是不可变的呢?因为创建一个String对象,本质就是一个字符的数组,并且String类内的属性,除了hash属性外,其他的属性都被定义成私有的(private)且是最终的(final)属性。
String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。
- 创建String对象
创建一个String对象我们有两种形式,一种是引用静态区中的字符串的字面量,另外一种是引用堆上的字符串对象。
ex:
- 创建String对象
public static void main(String[] args){
String str = "赵贺强";
String str1 = new String("zhaoheqiang");
}
- String中常用的方法
ex:
public static void main(String[] args){
String str = "zhaoheqiang";
//获取字符串的长度
System.out.println(str.length());
//获取字符
System.out.println(str.charAt(5));
//大小写
System.out.println(str.toUpperCase()+":"+str.toLowerCase());
//拼接字符串
System.out.println(str+"赵贺强"+";"+str.concat("Derry"));
//比较字符串是否相等
System.out.println(str.equals("zhaoheqiang")+str.compareTo("赵贺强"));
//判断开头,或者结尾是否包含某个字符或者字符串
System.out.println(str.startsWith("zhao"));
System.out.println(str.endsWith("qiang"));
//模式匹配,字符串第一次或者最后一次出现字符或者字符串的下标位置
System.out.println(str.indexOf("a")+":"+str.lastIndexOf("a"));
//是否包含某个字符或者字符串
System.out.println(str.contains("he"));
//获取子串
System.out.println(str.substring(0,5)+":"+str.substring(5));
//删除字符串左右空白符
System.out.println(str.trim());
/*替换replace/replaceAll
replaceAll参数regex是一个 regular-expression的匹配模式而不是一个简单的String;
*/
System.out.println(str.replace("a","b")+str.replaceAll("a","b"));
/*
以某种匹配模式去分割字符串, 参数regex是一个正则的匹配模式而不是一个简单的String,
对于分割的字符(串),通常是常见,普通的,没什么问题;但是对某些特殊字符,
如果字符(串)正好是正则的一部分,则需要转义才能使用,这些字符有** | , + , * , ^ ,
$ , / , | , [ , ] , ( , ) , - , . , \**等, 因它们是正则表达式中的一部分,
所以如果想用该字符本身, 这些字符需要进行转义(\\)才能表示它本身。
*/
String str="abc|XYZ";
String[] b = str.split("\\|");
System.out.println(str.split("a"));
System.out.println(Arrays.toString(b));
//判断字符串是否为空
System.out.println(str.isEmpty());
}
可变的字符串
- StringBuffer
StringBuffer类是线程安全的。StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。
- StringBuilder
StringBuilder类是线程不安全的。有加锁开销,效率略低。不用加锁,效率更高。StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。
StringBuffer和StringBuilder都继承AbstractStringBuilder类,都重写了AbstractStringBuilder类的方法,常用的方法请参考StringBuffer和StringBuilder API
String,StringBuffer和StringBuilder区别可以参考
http://blog.csdn.net/kingzone_2008/article/details/9220691
http://www.zhihu.com/question/20101840
网友评论