一. 字符串基础
1. 创建字符串String
1) 使用引号包含文本的方式创建String对象
java虚拟机会在字符串池中查找该对象是否已经存在。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
String str = "ab";
String str2 = "ab" + "cd";
2) 使用new方式新建String对象 (包括null)
对于所有包含new方式新建对象的表达式,新建的对象都不会加入字符串池中。
//新建一个空String对象
String str = new String();
//参数为字符串
String str = new String("abc");
//参数为一个字符数组char[]或 字节数组byte[]
char[] arr = {'a','b','c','d','f'}; //把字符数组转变为字符串
String str = new String(arr);
注:
- 两个new方式新建的对象,即使它们的字符串内容相同,但由于不是同一个对象,因而使用"=="比较的话,返回结果是false。
- 所以如果想比较两个字符串内容是否相同的话,要是用equals()方法。例:str1.equals(str2)
2. String类中split()方法的使用
public String[] split(String regex){
// 参数limit默认为0
return split(regex,0);
}
1)java的split方法实则是调用了重载方法,默认方法参数limit传0。当limit==0时,只有存在的最后的空格会被去掉,在中间和前面的空格都不会被去掉。
2)当limit > 0 时,limit等于字符串要被分割的份数。如果limit > 最大分割份数,字符串只会按照最大的分割数分割;参数limit是整型,不能使用小数。
3)当limit < 0 时,不会去掉任何分割后的字符。
3. 由 基本数据型态 转换成 String
1)String 类别中提供了将 基本数据型态 转换成 String的 static 方法,也就是String.valueOf() 这个参数多载的方法。
2)有下列几种:
String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串
String.valueOf(char c) : 将 char 变量 c 转换成字符串
String.valueOf(char[] data) : 将 char 数组 data 转换成字符串
String.valueOf(char[] data, int offset, int count) :
将 char 数组 data 中由 data[offset] 开始取 count 个元素 转换成字符串
String.valueOf(double d) : 将 double 变量 d 转换成字符串
String.valueOf(float f) : 将 float 变量 f 转换成字符串
String.valueOf(int i) : 将 int 变量 i 转换成字符串
String.valueOf(long l) : 将 long 变量 l 转换成字符串
String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString()
3)用法如:
int i = 10;
String str = String.valueOf(i);
这时候 str 就会是 "10"
4. 由 String 转换成 数字的基本数据型态
1)要将 String 转换成基本数据型态,大多需要使用基本数据型态的包装类别
比如说 String 转换成 byte,可以使用 Byte.parseByte(String s)
这一类的方法如果无法将 s 分析 则会丢出 NumberFormatException
2)例子
byte :
Byte.parseByte(String s) : 将 s 转换成 byte
Byte.parseByte(String s, int radix) : 以 radix 为基底 将 s 转换为 byte
比如说 Byte.parseByte("11", 16) 会得到 17
double : Double.parseDouble(String s) : 将 s 转换成 double
float : Double.parseFloat(String s) : 将 s 转换成 float
int : Integer.parseInt(String s) : 将 s 转换成 int
long : Long.parseLong(String)
5. String, StringBuffer与StringBuilder的区别
1)String类
在java中字符串属于对象,java提供了String类来创建和操作字符串。String类是不可变类,一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的。
2)StringBuffer & StringBuilder
为了节省内存空间,应对经常性的字符串相关操作,引入两个新的类StringBuffer类与StringBuilder类来对变化的字符串进行处理。
StringBuilder类不是线程安全的 (不能同步访问),但相较于StringBuffer有速度优势。StringBuffer类效率低,但线程安全。两个类的方法都相同。
3)StringBuilder/StringBuffer 常用方法
public StringBuilder append(String s) / append(char c) :将指定字符串/字符添加到此序列
public StringBuffer reverse() :将此字符串用其反转形式取代
public char charAt(int index) :返回序列中指定下标的字符
public StringBuilder delete(int start, int end) :删除起始下标(含) 到结尾下标(不含) 之间的子字符序列
public StringBuilder insert(int offset, String str) :在指定下标插入字符串
public int length() :返回该字符序列的长度
String toString() :返回该字符序列的 字符串
String substring(int start, int end) :返回起始下标(含) 到结尾下标(不含) 之间的子字符串
void setLength(int newLength) :将字符序列设定为指定的长度,当给定参数大于原字符序列的长度时,用空格字符('\u0000')来填充
二. 正则表达式 regex
1. 基本语法
两个特殊字符'^'和'$',分别指出一个字符串的开始和结束。例:
"^The":表示所有以"The"开始的字符串("There","The cat"等);
"of despair$":表示所以以"of despair"结尾的字符串
'*', '+'和'?'这三个符号,分别表示“零个或若干个”,“一个或若干个”还有“零个或一个”。例:
"ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);
"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
"ab?":表示一个字符串有一个a后面跟着零个或者一个b;
{ }用大括号表示可以重复次数的范围,必须指定范围的下限。例:
"ab{2}":表示一个字符串有一个a跟着2个b("abb");
"ab{2,}":表示一个字符串有一个a跟着至少2个b;
"ab{3,5}":表示一个字符串有一个a跟着3到5个b。
'.'可以替代任何字符。例:
"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
'^'放在方括号里的第一位,表示不希望出现的字符。例:
"%[^a-zA-Z]%"表示两个百分号中不应该出现字母;
'\' 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。
例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。
'\d' 匹配一个数字字符。等价于[0-9]。
'\D' 匹配一个非数字字符。等价于[^0-9]。
'\n' 匹配一个换行符。
2. 理解java字符串与正则表达式
- 正则表达式字符串是Java字符串的输出结果。
- java中的反斜杠"\"用作字符的转义。例如:java字符串写做"\\\\" ,会被编译器转义为正则表达式"\\",用来匹配字符串中的"\"。
- 在一些特殊字符 (如“ .、{、[、(、?、$、^ 和 * ”) 前要加双斜杠"\\"来匹配其普通含义。