1 String中的常用方法2
1.1 split方法
-
将字符串按照指定的内容进行分割,将分割成的每一个子部分组成一个数组
分割内容不会出现在数组中
-
实际上该方法不是按照指定的简单的符号进行分割的,而是按照正则表达式进行分割
1.2 正则表达式
-
用简单的符号组合表示更为复杂的字符串内容
-
可以对某一个字符串进行内容检测(看看目标字符串是否包含正则所表示的那部分子串内容)
-
检测成功后,可以根据需求作进一步的处理,包括:替换,分割等
-
在String字符串中提供了下面几个与正则相关的方法
-
s.matches("\\d");
全串检测 -
s.split("\\d");
拆分 -
s.replaceAll("\\d","A");
替换
-
符号表示
-
a
要求字符串中包含一个字母a -
ab
要求字符串中包含ab这样一组连续的字符 -
a|b
要求字符串中包含a或b字母 -
[^abcd]
要求字符串中包含abcd中至少一个 -
(ab)|(cd)
要求字符串中包ab或cd组合中的一个 -
[a-z]
-
[A-Z]
-
[0-9]
-
[a-zA-Z0-9]
-
\d
表示所有所有数字 [0-9] -
\w
表示所有字符 -
\s
表示空格 -
\D \W \S
表示除xx以外 -
.
表示所有符号
注意1: \d中的\是正则表达式中的转义,我们现在要在java程序中,需要再增加一个\ \\d
注意2: 在正则中.表示所有符号。如果我们就像表示.这个符号 ,需要对.进行转义 \\.
数量表示
-
a{2}
表示字符串中包含两个连续的a -
a{,3}
表示字符串中包含最多3个连续的a , a, aa , aaa -
a{1,}
表示字符串中包含至少1个连续的a -
a{1,3}
表示字符串中包含1到3个连续的a -
a+
表示字符串中至少包含1个连续的a -
a*
表示字符串中包含0或多个a -
a?
表示字符串中包含0或1个a
public static void main(String[] args) {
// String reg = "((139)|(136)|(171)|(196))\\d{8}" ;
// String s = "13613640262" ;
// System.out.println(s.matches(reg));
// if(s.startsWith("139") || s.startsWith("136")||s.startsWith("137") && s.length() == 11)
// a@qq.com
// String reg = "([0-9a-zA-Z].*)@((qq)|(163)|(sina))\\.((com)|(cn))" ;
// String s = "aaa@126.com";
// System.out.println(s.matches(reg));
String reg = "(136)|(137)|(138)" ;
String s = "a136b137c138d" ;
String abc = s.replaceAll(reg, "ABC");
System.out.println(abc);
}
1.3 intern方法
-
使用""方式常见的字符串对象,会在堆的常量区中开辟存储空间。并且只会保留一份
-
intern方法的作用是将使用new关键字创建的字符串对象(地址),尝试从堆区移动到常量区
public static void main(String[] args) {
// String s1 = new String(new char[]{'a','b','c'});
// String s2 = "abc" ;
// System.out.println(s1 == s2);
// String s1 = new String(new char[]{'a','b','c'});
// s1.intern();
// String s2 = "abc" ;
// System.out.println(s1 == s2);
// String s1 = new String("abc");
// s1.intern();
// String s2 = "abc" ;
// System.out.println(s1 == s2);
// String s1 = new String(new char[]{'j','a','v','a'});
// s1.intern() ;
// String s2 = "java" ;
// System.out.println(s1 == s2);
}
2 StringBuilder可变字符串
-
可变字符串有两个, StringBuilder 和 StringBuffer
-
两个类有相同的api
-
StringBuffer是一个早期版本的可变字符串,线程同步,安全性高,性能较低
-
StringBuilder是一个新版本的可变字符串,非线程同步,安全性较低,性能较高
2.1 创建StringBuilder对象
-
只有一种创建手段,使用new + 构造方法
StringBuilder s = new StringBuilder(); //创建了没有任何内容的可变字符串对象
StringBuilder s = new StringBuilder("ab");//创建了一个有初始内容的可变字符串对象
//也可以理解成将String转换成了StringBuilder
StringBuilder s = new StringBuilder(10);//创建了一个没有任何内容的可变字符串
//但指定了内部字符数组的容量
//这个容量默认是16个
2.2 StringBuilder字符串的可变特性
-
String字符串的不可变原因
-
用来存储字符串内容的数组变量使用final修饰,不能再指向其他长度的字符数组地址,长度不可变
-
从封装设计角度,String没有对外提供可以改变字符数组内容的方法,所以内容无法改变
-
-
StringBuilder字符串可变的原因
-
用来存储字符串内容的数组变量没有使用final修饰,可以指向长度更长的字符数组(扩容)
-
从封装设计角度而言,StringBuilder对外提供了可以直接更改字符数组内容的方法
append , insert , delete
-
2.3 StringBuilder常用方法
public static void main(String[] args) {
StringBuilder s = new StringBuilder();
s.append("a"); //字符串结尾追加新内容
s.append("bc");
s.append("def") ;
System.out.println(s);
System.out.println("-----------------");
s.insert(2,"g"); //在字符串的指定位置插入新内容
System.out.println(s);
System.out.println("------------------");
s.delete(1,4) ; //删除指定位置范围内的内容 左闭右开
System.out.println(s);
System.out.println("-----------------");
s.replace(1,3,"xyz"); //替换指定位置范围内的内容,左闭右开
System.out.println(s);
System.out.println("--------------------");
s.reverse(); //反转字符串内容
System.out.println(s);
String ss = s.toString() //将StringBuilder转换换成String对象,可以使用String的方法了
}
3 String字符串连接
-
有两种方式
-
使用+连接两个字符串
"abc" + "bcd"
-
使用concat方法连接两个字符串
"abc".concat("bcd")
-
-
使用concat方法连接字符串,没有特别之处,底层产生了一个新的字符串对象,包含两个子串内容
-
使用+号连接字符串,这里涉及一个 + 运算符重载特点
在使用+号连接字符串时,会先产生一个StringBuilder对象,利用StringBuilder的append方法完成字符串的追加(连接)
将连接后的完整内容,形成一个String对象返回
注意:
-
当需要一次性大量的连接多个字符串时,建议使用+号连接
-
当只需要连接两个字符串时,建议使用concat方法连接
String s1 = "abc" ;
String s2 = "bcd" ;
String s3 = s1 + s2 ;
注意:
-
多个字符串常量使用+号连接时,不会产生StringBuilder。而是在编译期就直接将字符串合并了
-
编译期会对常量值做优化
public static void main(String[] args) {
String s1 = "abc" + "def" ;
String s2 = "abcdef" ;
System.out.println(s1 == s2);
}
public static void main(String[] args) {
String s1 = "abc" ;
String s2 = "def" ;
String s3 = s1 + s2 ;
String s4 = "abcdef" ;
System.out.println(s3 == s4);
}
public static void main(String[] args) {
fina String s1 = "abc" ;
final String s2 = "def" ;
String s3 = s1 + s2 ;
String s4 = "abcdef" ;
System.out.println(s3 == s4);
}