API基础
一、String (字符串类型)
1、java.lang.String使用了final修饰,不能被继承;
2、字符串底层封装了字符数组及针对字符数组的操作算法;
3、字符串底层封装了字符数组及针对字符数组的操作算法;
4、Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的定长编码
二、字符串常量池
1、Java对字符串有一个优化措施:字符串常量池
2、Java推荐我们使用字面量和直接量的方式来创建字符串,并且会缓存所有以字面量形式创建的字符串对象,当使用相同字面量再次创建字符串时会重用对象以减少内存开销,避免内存中堆积大量内容相同的字符串对象
3、在使用字面量创建字符串时,JVM会检查是否有该对象
(1)若没有,则创建该字符串的对象的并存入常量池;
(2)若有,则直接将该对象返回而不在创建一个新的字符串对象;
三、字符串常用方法
1、length():
返回当前字符串的长度(字符个数)
String str = "我爱Java!";
int len = str.length();
System.out.println(len);// 7
2、indexOf():
(1)检索给定字符串在当前字符串的开始位置
(2)如果当前字符串不包含给定内容时,返回值为-1
(3)int indexOf(String str,int fromIndex)
从指定位置开始检索第一次出现给定字符串的位置
String str = "thinking in java"; //检索in在字符串str中出现的开始位置
int index = str.indexOf("in");
System.out.println(index); //2
//如果当前字符串不包含给定内容时,返回值为-1;
index = str.indexOf("IN");
System.out.println(index);//-1
index = str.indexOf("in",3);//从第4个字符开始找in第一次出现的位置
index = str.lastIndexOf("in");//检索最后一次出现in的位置
3、substring():
String substring(int start,int end)
(1)截取当前字符串中指定范围内的字符串,两个参数分别为开始位置的下标和结束位置的下标;
(2)注:在JAVA API中通常使用两个数字表示范围时是"含头不含尾"的.
String str = "www.tedu.cn";
String name = str.substring(4,8);
System.out.println(name);//tedu
name = str.substring(4);
System.out.println(name);//tedu.cn
4、charAt():
char charAt(int index)
返回当前字符串中指定位置上的字符
5、trim():
去除一个字符串两边的空白字符
String str =" hello jinde ";
System.out.println(str);// hello jinde 有空格
str = str.trim();
System.out.println(str);//hello jinde(去除字符串两边的空白字符)
6、startsWith()和endsWith()
(1)boolean startsWith(String str)
判断当前字符串是否是以给定的字符串开始的
(2)boolean endsWith(String str)
判断当前字符串是否是以给定的字符串结尾的
String str = "thinking in java";
boolean starts = str.startsWith("think"); //判断str是否以think开头
System.out.println("starts"+starts); //true
boolean ends = str.endsWith(".png"); //判断str是否以.png结尾
System.out.println("ends"+ends); //false
7、toUpperCase()和toLowerCase()
(1)String toUpperCaseDemo
将当前字符串的英文部分转为全大写
(2)String toLowerCaseDemo
将当前字符串的英文部分转为全小写
String str = "我爱Java!";
String upper = str.toUpperCase();//将str英文部分全转为全大写
System.out.println(upper); //我爱JAVA!
String lower = str.toLowerCase();//将str英文部分全转为全小写
System.out.println(lower); //我爱java!
8、valueOf()
static String valueOf(数据类型 a)
(1)将其他数据类型转换为String
(2)调用时用String.valueOf();
int a = 123;
String s1 = String.valueOf(a); //将int型变量a转换为String类型赋值给s1
System.out.println(s1); //123
四、StringBuilder类
由于String是不变对象,每次修改内容都要创建新对象,因此String不适合做频繁修改操作.为了解决这个问题,java提供了StringBuilder类.
1、StringBuilder称为可变字符串
2、StringBuilder内部也是字符数组,其API可以直接修改其内部数组的内容
3、当数组容量不足时,会自动扩容;
4、运算期间会尽力减少创建数组的数量
package string;
public class StringBuilderDemo03 {
public static void main(String[] args) {
/*
* 测试StringBuilder的连接性能
*/
StringBuilder buf = new StringBuilder();
long t1 = System.currentTimeMillis();
for (int i =0; i<50000; i++){
buf.append("A");
}
long t2 = System.currentTimeMillis();
System.out.println(t2-t1);
}
}
buf-> char[]{A, C, B, 0, 0, 0, 0, 0, 0, 0, 0...0}
// 0 1 2 3 4 5
StringBuilder buf = new StringBuilder();
buf.append("A")
.append("A")
.append("A")
.append("B")
.insert(1,"C")
.delete(2,4);
Stirng str = buf.toString();
(1)append() :追加,在StringBulider的后面添加字符,当容量满了自动扩容,扩容规则1倍+2
(2)insert(位置,char) 插入字符
(3)delete(开始位置,结束位置):删除一点范围的字符,包括开始,不包括结束。
(4)StringBuilder的API返回的大多是当前对象,可以连续使用调用方法。
(5)toString()方法可以将StringBuilder转换为String。
五、正则表达式
1、用于测试、检测字符串规则的表达式
2、经常用于检测字符串是否符合特定的规则,在网站上经常用于检测用户输入
数据是否符合规范:
(1)检测用户名是否为8-10位数字 英文(大小写)
(2)检测电话号码是否符合规则
(3)检测邮箱地址是否符合规则等
3、Java提供了正则API,用于检测一个字符串是否符合正则规则
boolean matches(正则)检测当前字符串是否符合正则规则
s1="helloworld";
s2="hellokiter"
boolean b1 = s1.matches(rule);//true
boolean b2 = s2.matches(rule);//true
4、字符集:匹配一个有效字符范围
(1)语法:[]
(2)意义:
匹配一个字符,其有效范围:123456中的某一个
例子:
hello[123456]
//匹配六个字符
//前5个必须是Hello
//第六个字符必须是123456中的一个
5、字符范围
规则 | 正则表达式 | 范围 |
---|---|---|
匹配 0~9 一个字符 | [0123456789] | [0-9] |
匹配A-Z一个字符 | [ABCDEFGHIJKLMNOPQRSTUVWXYZ] | [A-Z] |
匹配a-z一个字符 | … | [a-z] |
匹配a-zA-Z一个字符 | [a-zA-Z] |
Hello[1-6]
6、预定义字符集
规则 | 正则 | 预定义字符集 | 栗子 |
---|---|---|---|
匹配一个数字 | [0-9] | \d | Hello\d |
匹配一个单词字符 | [a-zA-Z0-9_] | \w | A\w |
匹配一个空白字符 | \s | Hello\sWorld | |
匹配任意一个字符 | . | A. | |
匹配一个非数字 | \D | ||
匹配一个非空白 | \S | ||
匹配一个非单词字符 | \W |
java String: "\\w\\w\\w\\w\\w\\w"
package string;
public class RegDemo07 {
public static void main(String[] args) {
/*
* 测试 用户名规则:6个单词字符组成
* - \ 在java字符串中需要进行转义为 \\
*/
//正则表达式:
String reg = "\\w\\w\\w\\w\\w\\w";
System.out.println(reg);
//被检查的字符串
String s1 = "Jerry1"; //可以通过检查
String s2 = "Tom-12"; //不可以通过检查
String s3 = "Andy"; //不可以通过检查
System.out.println(s1.matches(reg));
System.out.println(s2.matches(reg));
System.out.println(s3.matches(reg));
}
}
7、简写数量词
约定左侧元素出现的次数。
例子:
\w\w\w\w\w\w 等价 \w{6}
语法:
X{n} 规定左侧X出现n次
X{n,m} 规定左侧X出现最少n次, 最多m次
X{0,n} 规定左侧X出现0到n次
X{n,} 规定左侧X出现最少n次
X? 和 X{0,1} 等价,X可以没有或者有一个
X+ 和 X{1,} 等价,X至少有一个,多了随意,简称:一个以上
X* 和 X{0,} 等价,X至少有0个,多了随意 简称:0个以上
例子:
- 网站的用户名是 8~16个单词字符: \w{8,16}
- 网站的密码是单词字符, 最少8个, 多了不限: \w{8,}
- 匹配Hello World,中间至少有一个空白: Hello\s+World
- 不能匹配 : “HelloWorld”
- 不能匹配: “Hello World!”
- 能匹配: “Hello World”
- 能匹配: “Hello World”
- 能匹配: “Hello World”
六、分组
将一组规则作为整体进行处理
例子正则:
-
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
-
(\d{1,3}\.)(\d{1,3}\.)(\d{1,3}\.)\d{1,3}
-
`(\d{1,3}.){3}\d{1,3}
package string;
public class RegDemo11 {
public static void main(String[] args) {
/*
* 检查IP地址是否符合规则
*/
//定义正则规则
//String reg = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}";
String reg = "\\d{1,3}(\\.\\d{1,3})(\\.\\d{1,3})(\\.\\d{1,3})";
//String reg = "(\\d{1,3}\\.){3}\\d{1,3}"; //测试分组
//定义被检查的字符串
String ip1 = "192.168.2.70";
String ip2 = "10.0.0.20";
String ip3 = "8.8.8.8";
//定义错误的被检查字符串
String ip4 = "192点168点2点70";
String ip5 = "192-168-2-70";
//检查
System.out.println(ip1.matches(reg));
System.out.println(ip2.matches(reg));
System.out.println(ip3.matches(reg));
System.out.println(ip4.matches(reg));
System.out.println(ip5.matches(reg));
}
}
七、Java正则API
1、matches
检查字符串是否整体符合正则表达式规则
2、plit 劈开字符串
(1)将一个字符串劈开为几个子字符串
(2)使用
str 存储的是被劈开的字符串
正则 用于匹配劈开的位置点, 如: , 或者 \.
返回值 是劈开以后的数组,每个元素是 劈开的子字符串段落
劈开以后,匹配的位置就没有了
String[] arr = str.split(正则);
(3)案例
String str = "1, Tom, 110, tom@tedu.cn";
// , , ,
// arr= "1" " Tom" " 110" " tom@tedu.cn"
String[] arr = str.split(",");
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
3、replaceAll 全部替换
(1)replace: 替换;all:全部;将正则表达式匹配到的字符,都替换为新字符串
(2)
Scanner scanner = new Scanner(System.in);
System.out.print("请输入:");
String str = scanner.nextLine();
//String str = "我草疫情又严重了,我去,又要做核算了。";
// str.replaceAll("正则", 替换字符串);
String s = str.replaceAll("我[去草靠艹]", "***");
System.out.println(s);