字符串String
**字符串(String)**是指多个字符连接起来组合成的字符序列,例如”中国”,“hello world”都为字符串。注意对比字符,字符只能存储一个字符使用单引号’中’,’国’。
字符串底层源码
字符串定义
创建String对象
String str = new String**(“hello”);**
引用字符串
String str = “hello”;
字符串常量池
字符串String实在开发中大量使用的类型,String的设计者为提高String的效率,设计了字符串常量池技术用来提高性能。当定义一个字符串后,会先放入字符串常量池,当访问字符串时,先会从常量池查找,如果常量池中有此字符串则,返回其引用,否则重新创建要给字符串放入常量池中。
字符串api
常用api
常用api案例
char charAt(int index)
程序案例:
String str = "hello String";
System.out.println("charAt(6): " + str.charAt(65));
程序运行结果:
charAt(5): S
boolean startsWith(String)
程序案例:
String str = "hello String";
System.out.println("startsWith: " + str.startsWith("hello"));
程序运行结果:
startsWith: true
boolean endsWith(String)
程序案例:
String str = "hello String";
System.out.println("endsWith: " + str.endsWith("hello"));
程序运行结果:
boolean startsWith: false
int indexOf(String)
程序案例:
String str = "hello String";
System.out.println("indexOf(\"String\"): " + str.indexOf("String"));
程序运行结果:
indexOf(“String”): 6
String substring(int ,int)
程序案例:
String str = "hello String";
System.out.println("str.substring(3,5):" + str.substring(3,5));
程序运行结果:
str.substring(3,5):lo
String replace(char oldChar, char newChar)
程序案例:
String str = "hello String";
System.out.println("str.replace('l', 'x'):" + str.replace('l', 'x'));
程序运行结果:
str.replace(‘l’, ‘x’):hexxo String
boolean contains(CharSequence)
程序案例:
String str = "hello String";
System.out.println("str.contains(\"Str\"):" + str.contains("Str"));
程序运行结果:
str.contains(“Str”):true
String toLowerCase()
程序案例:
String str = "hello String";
System.out.println("str.toLowerCase():" +str.toLowerCase());
程序运行结果:
str.toLowerCase():hello string
String toUpperCase()
程序案例:
String str = "hello String";
System.out.println("str.toUpperCase():" +str.toUpperCase());
程序运行结果:
str.toUpperCase():HELLO STRING
String trim()
程序案例:
String str = " hello String ";
System.out.println("str.trim():" +str.trim());
程序运行结果:
str.trim():hello String
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
匹配字符
**[xyz]**匹配包含方括号中的某一个字符
程序案例:
String str = "f";
String regex = "[abcdefg]";
System.out.println(str.matches(regex));
程序运行结果:
true
不匹配字符
**[^xyz]**匹配不包含方括号中的任意一个字符
程序案例:
String str = "f";
String regex = "[abcdefg]";
System.out.println(str.matches(regex));
程序运行结果:
true
匹配某个字符
[a-z] 匹配a~z之间的任意一个字符。
[A-Z] 匹配A~Z之间的任意一个字符。
[0-9] 匹配0~9之间的任意一个字符。
程序案例:
String str = "f";
String regex = "[a-z]";
System.out.println(str.matches(regex));
程序运行结果:
true
不匹配某个字符
**[^a-z]**不包含a~z之间的任意一个字符。
程序案例:
String str = "f";
String regex = "[^a-z]";
System.out.println(str.matches(regex));
程序运行结果:
false
特殊符号
点(.)号:点号(.): 匹配除“\n”之外的任何单个字符。
程序案例:
String str = "apple";
String regex = ".+";
System.out.println(str.matches(regex));
程序运行结果:
true
如果要匹配点(.)符号 ,需要使用[.] 。
数字字符\d:匹配一个数字字符。等价于[0-9]。
程序案例:
String str = "1";
String regex = "\\d";
System.out.println(str.matches(regex));
程序运行结果:
true
非数字字符\D: 匹配一个非数字字符。等价于[ˆ0-9]。
程序案例:
String str = "a";
String regex = "\\D";
System.out.println(str.matches(regex));
程序运行结果:
true
单词字符\w: 匹配包括下划线的任何单词字符。等价于"[A-Za-z0-9_]"
程序案例:
String str = "a";
String regex = "\\w";
System.out.println(str.matches(regex));
程序运行结果:
true
非单词字符\W: 匹配任何非单词字符。等价于"[ˆA-Za-z0-9_]"
程序案例:
String str = "%";
String regex = "\\W";
System.out.println(str.matches(regex));
程序运行结果:
true
匹配数量
星(*)号: 匹配前面的子表达式零次或多次。
程序案例:
String str = "apple";
String regex = "[a-z]*";//匹配每一位都是字母出现了多次
System.out.println(str.matches(regex));
程序运行结果:
true
程序案例:
String str = "";
String regex = "[a-z]*";//匹配0次
System.out.println(str.matches(regex));
程序运行结果:
true
+号: 匹配前面的子表达式一次或多次
程序案例:
String str = "apple";
String regex = "[a-z]+";
System.out.println(str.matches(regex));
程序运行结果:
true
?号: 匹配前面的子表达式零次或一次
程序案例:
String str = "a";
String regex = "[a-z]?";
System.out.println(str.matches(regex));
程序运行结果:
true
{n}: n是一个非负整数。匹配确定的正好n次
程序案例:
String str = "apple";
String regex = "[a-z]{5}";
System.out.println(str.matches(regex));
程序运行结果:
true
{n,}: n是一个非负整数。匹配至少n次
程序案例:
String str = "apple";
String regex = "[a-z]{3,}";//至少匹配三次
System.out.println(str.matches(regex));
程序运行结果:
true
{m,n}: m,n是非负整数。匹配至少m次,至多n次
程序案例:
String str = "apple";
String regex = "[a-z]{3,7}";//匹配三次到七次
System.out.println(str.matches(regex));
程序运行结果:
true
逻辑
XY匹配:即先匹配X在匹配Y
程序案例:
String str = "a9";
String regex = "[a-z][0-9]";//第一个匹配字母,第二个匹配数字
System.out.println(str.matches(regex));
程序运行结果:
true
X|Y匹配: 匹配X或者匹配Y,(group)括号表示一组
程序案例:
String str = "org";
String regex = "(org)|(edu)";//分成两组org或者edu
System.out.println(str.matches(regex));
程序运行结果:
true
程序案例:
String str = "a";
String regex = "a|pple";//匹配a或者pple,无圆括号表示a或者,然后是pple字符串
System.out.println(str.matches(regex));
程序运行结果:
true
使用正则的字符串方法。
String[] split(String regex):根据正则表达式将字符串拆分为字符串数组。
程序案例:
/*
* 将字符串按照正则拆分为字符串数组
*/
String desc = "李白#$%唐^&&诗人*&静夜思";
String[] str = desc.split("[^\\u2E80-\\u9FFF]+");
System.out.println("姓名: " + str[0]);
System.out.println("朝代: " + str[1]);
System.out.println("职业: " + str[2]);
System.out.println("作品: " + str[3]);
程序运行结果:
姓名: 李白
朝代: 唐
职业: 诗人
作品: 静夜思
String replaceAll(String regex, String replacement):
根据正则表达式替换子字符串
程序案例:
/*
* 提取字符串中的所有数字
*/
String str = "123world34#¥*sdsf2222";
String regex ="[^0-9]";//非数字
String s = str.replaceAll(regex, "");
System.out.println(s);
程序运行结果:
123342222
常见正则表达式
StringBuider/StringBuffer
为什么使用StringBuilder
在开发中会涉及到大量的字符串拼接操作。由于String底层是不可变的数组,每次操作都实际上重新创建了一下新的字符串,如果进行频繁字符串操作会占用更多的内存,而且拼接会创建新字符串效率也会大大降低。
项目中进行字符串拼接大都采用可变字符串即StringBuilder/StringBuffer对象提高新性能。
StringBuilder对象
底层实现
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
StringBuilder 常用API
方法名称 | 方法描述 | 案例 |
---|---|---|
append() | 在字符串末尾添加 | stringBuilder.append(“end”); |
deleteCharAt(int) | 删除指定位置字符 | stringBuilder.deleteCharAt(1); |
delete(int,int) | 删除指定范围的字符 | stringBuilder.delete(3,7); |
indexOf(String) | 字符串的位置 | stringBuilder.indexOf(“app”); |
reverse() | 将StringBuilder中内容反转 | stringBuilder.reverse(); |
toString() | 将StringBuilder内容返回为字符串 | stringBuilder.toString( ); |