1、系列一:
(1)boolean isEmpty():字符串是否为空
str != null && str.isEmpty()
(2)int length():返回字符串的长度
面试题:数组的length和String的length有什么区别?
数组名.length 属性,没有()
字符串对象.length() 方法,有()
面试题:length()是什么长度?
字符串的长度,它是内部char[] value的长度。即字符的个数。
(3)String concat(xx):拼接,等价于+
(4)boolean equals(Object obj):比较字符串是否相等,区分大小写
(5)boolean equalsIgnoreCase(Object obj):比较字符串是否相等,不区分大小写
(6)int compareTo(String other):比较字符串大小,区分大小写,按照Unicode编码值比较大小
(7)int compareToIgnoreCase(String other):比较字符串大小,不区分大小写
(8)String toLowerCase():将字符串中大写字母转为小写
(9)String toUpperCase():将字符串中小写字母转为大写
Character包装类中也有 toLowerCase() 和 toUpperCase()方法,
只不过它是针对一个字符转大小写,而String类中是针对一串字符串转大小写。
(10)String trim():去掉字符串前后空白符,即不会去掉中间的空白符
public class TestStringMethod1 {
@Test
public void test06() {
String str1 = "hello";
String str2 = str1.trim(); //这句代码,并没有修改str1,那么没有产生新对象
System.out.println(str1 == str2);//true
System.out.println(str1.equals(str2));//true
}
@Test
public void test05() {
String str1 = " hello ";
String str2 = str1.trim();//"hello" 产生新对象
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//false 空格也是字符串内容
}
@Test
public void test04() {
String str = " hello ";
str.trim(); //如果字符串修改了,会返回新对象,如果没有重新接收新对象,str不变
System.out.println(str.length());//9
System.out.println("[" + str + "]");
str = str.trim();
System.out.println(str.length());//5
System.out.println("[" + str + "]");
}
@Test
public void test03(){
String str = " ";
//问?str去掉前后空白符之后是否是空字符串
if(str != null && str.trim().isEmpty()){
System.out.println("是");
}else{
System.out.println("不是");
}
}
@Test
public void test02(){
String str = " hello world ";
System.out.println("[" + str.trim() +"]"); //[hello world]
}
@Test
public void test01(){
String str = "hello";
System.out.println(str.length());
}
}
2、系列二:查找
(1)是否包含某个字符/子串
boolean contains("查找目标")
(2)返回某个字符/子串在当前字符串中的位置
int indexOf(查找目标):如果目标存在,就返回它第一次出现的下标,不存在就返回-1
int lastIndexOf(查找目标):如果目标存在,就返回它最后一次出现的下标,不存在就返回-1
public class TestStringMethod2 {
@Test
public void test02(){
String str = "hellojavaworldjavaatguigujava";
System.out.println(str.indexOf('s'));//-1
System.out.println(str.indexOf("java"));//5
System.out.println(str.lastIndexOf("java"));//25
}
@Test
public void test01(){
String str = "hellojavaworldatguigu";
System.out.println(str.contains("s"));//false
System.out.println(str.contains("java"));//true
}
}
3、系列三:截取
(1)String substring(int beginIndex) :从当前字符串(即调用substring的字符串)中截取子串,从[beginIndex]开始截取,一直到最后
(2)String substring(int beginIndex, int endIndex):从当前字符串中截取子串,从[beginIndex]开始截取到[endIndex],并且endIndex不包含。
public class TestStringMethod3 {
@Test
public void test02(){
String str = "hellojavaworldjavaatguigujava";
//想要把str中的hello,world,atguigu截取出来,怎么做?
int index;
while((index = str.indexOf("java")) != -1){
String temp = str.substring(0,index);
System.out.println("temp = " + temp);
str = str.substring(index + "java".length());
/*
第一次循环 str = worldjavaatguigujava
*/
System.out.println("str = " + str);
}
}
@Test
public void test01(){
String fileName = "HelloWorld.java";
//截取文件名“HelloWorld”,不要后缀名
//(1)找到.的位置
int index = fileName.indexOf(".");
//(2)从fileName中截取[0 ,.的位置)
String name = fileName.substring(0, index);
System.out.println("name = " + name);
//截取后缀名
//找到.的位置之后,从.的位置,截取到最后
String ext = fileName.substring(index);
System.out.println("ext = " + ext);
}
}
4、系列四:和char有关的
(1)char charAt(int index)
(2)char[] toCharArray()
(3)new String(char[] arr)
(3)new String(char[] arr,int offset, int length)
(4)String.valueOf(char[] arr)
(4)String.valueOf(char[] arr,int offset, int length)
(5)String.copyValueOf(char[] arr)
(5)String.copyValueOf(char[] arr,int offset, int length)
public class TestStringMethod4 {
@Test
public void test4(){
char[] arr = {'h','j','f','a','d'};
String s = new String(arr);
System.out.println("s = " + s);
String s1 = new String(arr, 1, 3);
System.out.println("s1 = " + s1);
}
@Test
public void test3(){
String str = "hello";
char[] array = str.toCharArray();
for(int i=0; i<array.length; i++){
System.out.println(array[i]);
}
}
@Test
public void test2(){
String str = "hello";
for(int i=0; i<str.length(); i++){
System.out.println(str.charAt(i));
}
}
@Test
public void test(){
Scanner input = new Scanner(System.in);
System.out.print("性别:");
char gender = input.next().charAt(0);
System.out.println("gender = " + gender);
/*
(1)
input是一个变量,它是Scanner类型,
=右边是调用Scanner的有参构造创建了Scanner对象,实参是System.in的常量对象。
调用的是public Scanner(InputStream source) 构造器,因为System.in是InputStream类型。
(3)input.next()是调用input对象的next(),这个方法是Scanner类中声明的。
它是一个非静态的方法。public String next()
返回值类型是一个String类型字符串对象
xx.charAt(0),就行把input.next()返回的字符串对象,再次调用方法,这个方法是String类的。
其中的(0)的(0)表示取String的第一个字符,也就是String对象中char[] value数组的[0]元素。
*/
}
}
5、系列五:编码与解码
编码:把字符数据转为字节数据
解码:把字节数据转为字符数据,因为人只能看懂字符,所以把这个过程称为解码。
编码的方法:
byte[] getBytes():默认按照平台的字符编码方式进行编码的,
例如:当前项目的编码方式是UTF-8,那么"尚硅谷".getBytes()就是按照UTF-8进行的编码
byte[] getBytes(Charset charset)
byte[] getBytes(String charsetName)
结论:(1)同样的字符,特别是中文等非ASCII码范围内的,不同的编码方式,得到的编码值是不同的,
换句话说,编码方式不同,那么互相是无法正确解码的,就会导致乱码。
(2)如果中间缺字节,也会导致乱码。
解码的方法:
new String(byte[] data):默认按照平台的字符编码方式进行解码
new String(byte[] data, Charset charset):按照指定的字符编码方式进行解码
new String(byte[] data, String charsetName) :按照指定的字符编码方式进行解码
总结:不乱码的话要保证编码和解码的编码方式一致,中间不能多和少字节数据。
public class TestStringMethod5 {
@Test
public void test07(){
//如何得到一个汉字等字符的Unicode编码
int num = '尚';
System.out.println("num = " + num);//23578
}
@Test
public void test06()throws UnsupportedEncodingException{
//这个自己数组是按照“GBK”编码的
byte[] data = {-55, -48, -71, -24, -71, -56, 97, 98, 99};//这个字节数组可能是从文件读取的,也可能是从网络接收的,
//下面解码看一下具体的内容
String str = new String(data);//默认按照平台的字符编码方式进行解码,而当前运行环境是UTF-8
System.out.println(str);//��abc
String str2 = new String(data, "GBK");
System.out.println(str2);//尚硅谷abc
}
@Test
public void test05(){
try {
System.out.println(Arrays.toString("尚硅谷abc".getBytes()));//[-27, -80, -102, -25, -95, -123, -24, -80, -73, 97, 98, 99]
System.out.println(Arrays.toString("尚硅谷abc".getBytes("GBK")));//[-55, -48, -71, -24, -71, -56, 97, 98, 99]
System.out.println(Arrays.toString("尚硅谷abc".getBytes("ISO8859-1")));//[63, 63, 63, 97, 98, 99]
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Test
public void test04(){
try {
System.out.println(Arrays.toString("hello".getBytes()));//[104, 101, 108, 108, 111]
System.out.println(Arrays.toString("hello".getBytes("GBK")));//[104, 101, 108, 108, 111]
System.out.println(Arrays.toString("hello".getBytes("ISO8859-1")));//[104, 101, 108, 108, 111]
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Test
public void test03(){
try {
String str1 = "尚硅谷";
byte[] data = str1.getBytes("GBK");
System.out.println(Arrays.toString(data));
//[-55, -48, -71, -24, -71, -56]
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Test
public void test02(){
String str1 = "尚硅谷";
byte[] data = str1.getBytes(); //在我们当前运行环境下 等价于byte[] data = str1.getBytes("UTF-8");
System.out.println(Arrays.toString(data));
//[-27, -80, -102, -25, -95, -123, -24, -80, -73]
}
@Test
public void test01(){
String str1 = "hello";
byte[] data = str1.getBytes();
System.out.println(Arrays.toString(data));
//[104, 101, 108, 108, 111]
}
}
public class TestStringMethod7 {
@Test
public void test05(){
//密码要求:必须有大写字母,小写字母,数字组成,6位
System.out.println("Cly892".matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{6}$"));//true
System.out.println("1A2c45".matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{6}$"));//true
System.out.println("Clyyyy".matches("^(?=.*[A-Z])(?=.*[0-9])[A-Za-z0-9]{6}$"));//false
//下面这个写法只是说,6位字符都在 [A-Za-z0-9]范围内,并没有要求必须有大写、小写、数字都出现
System.out.println("123456".matches("[A-Za-z0-9]{6}"));
}
@Test
public void test04(){
String str1 = "12hela3h3salgH2";
//判断str1字符串是否有字母和数字和下划线等组成,长度任意
System.out.println(str1.matches("\\w+"));//true
}
@Test
public void test03(){
String str1 = "12hela3h3salgH2";
//判断str1字符串是否有字母和数字组成,长度任意
System.out.println(str1.matches("[a-zA-Z0-9]+"));//true
String str2 = "12hela_3h3salgH2";
//判断str2字符串是否有字母和数字组成,长度任意
System.out.println(str2.matches("[a-zA-Z0-9]+"));//false
}
@Test
public void test02(){
String str = "123456";
//判断是否由6个数字组成
System.out.println(str.matches("\\d{6}"));//true
}
@Test
public void test01(){
//判断下面的str1和str2字符串,是否里面全部由数字组成,至少有一个数字 \d+ 或 \d{1,}
String str1 = "123a56";
System.out.println(str1.matches("\\d+"));//false
/*
在正则中\是转义,在Java中\也是转义
Java中转义有:\t,\n,\r,\b,\',\",\\。
此处想要表示是正则中的\d,而不是Java中\d,就要写 \\d
*/
String str2 = "123456";
System.out.println(str2.matches("\\d+"));//true
}
}
(1)判断当前字符串是否以xx开头
boolean startsWith(“目标");
(2)判断当前字符串是否以xx结尾
boolean endsWith("目标")
public class TestStringMethod6 {
@Test
public void test03(){
String fileName = "HelloWorld.java";
//判断这个文件是否是一个“Java的源文件”
//“Java的源文件” 以 ".java"结尾
System.out.println(fileName.endsWith(".java"));
}
@Test
public void test02(){
String str = "hellojava";
//判断str是否以"hello"开头
if(str.startsWith("hello")){
System.out.println("str是以hello开头");
}else{
System.out.println("str不是以hello开头");
}
}
@Test
public void test01(){
String str = "hellojava";
//判断str是否以"hello"开头
if(str.indexOf("hello") == 0){
System.out.println("str是以hello开头");
}else{
System.out.println("str不是以hello开头");
}
}
}
7、系列七:正则匹配
(1)什么是正则?
所谓的正则,就是某个规则,某个文本/字符串的规则。
例如:银行卡密码,要求是6位数字组成,不能是别的字符
尚硅谷后台学生信息管理系统,用户名要求必须是26个英文字母大小写或数字和标点符号组成,
并且要求必须至少有一个大写、一个小写、一个数字、一个特殊标点符号组成,长度不能超过32位。
(2)Java语言也是支持正则的一种编程语言。
除了Java以外,很多语言都支持,比如JavaScript等。
正则不是Java里面的一个语法点。
(3)String类中有很多方法支持正则表达式,
其中一个方法是用于判断 某个字符串是否“匹配”某个正则,boolean matches(String regex)
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
一个\d等这些模式只是代表/匹配一个字符
正则数量词
X? :表示X,一次或一次也没有
X* :表示 X,零次或多次
X+ :表示X,一次或多次
X{n} :表示X,恰好 n 次
X{n,} :表示X,至少 n 次
X{n,m} :表示X,至少 n 次,但是不超过 m 次
这里的X是一个匹配模式,例如:\d等
[abc] :a、b 或 c(简单类)
[^abc] :任何字符,除了 a、b 或 c(否定)
[a-zA-Z] :a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] :a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]]: d、e 或 f(交集)
[a-z&&[^bc]] :a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] :a 到 z,而非 m 到 p:[a-lq-z](减去)
边界匹配器
^ 行的开头
$ 行的结尾
找的一些正则的表达式:
1.验证用户名和密码,要求第一个字符必须为字母,一共6~16位字母数字下划线组成:(^[a-zA-Z]\w{5,15}$)
2.验证电话号码:xxx/xxxx-xxxxxxx/xxxxxxxx:(^(\d{3,4}-)\d{7,8}$)
3.验证手机号码:( ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ )
4.验证身份证号: (^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
5.验证Email地址:(^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$)
6.只能输入由数字和26个英文字母组成的字符串:(^[A-Za-z0-9]+$)
7.整数或者小数:(^[0-9]+(\.\[0-9\]+){0,1}$)
8.中文字符的正则表达式:([\u4e00-\u9fa5])
9.金额校验(非零开头的最多带两位小数的数字):(^(\[1-9\][0-9]*)+(.[0-9]{1,2})?$)
10.IPV4地址:(((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{1,2})|(2[0-4]\\d)|(25[0-5]))
public class TestStringMethod7 {
@Test
public void test05(){
//密码要求:必须有大写字母,小写字母,数字组成,6位
System.out.println("Cly892".matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{6}$"));//true
System.out.println("1A2c45".matches("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[A-Za-z0-9]{6}$"));//true
System.out.println("Clyyyy".matches("^(?=.*[A-Z])(?=.*[0-9])[A-Za-z0-9]{6}$"));//false
//下面这个写法只是说,6位字符都在 [A-Za-z0-9]范围内,并没有要求必须有大写、小写、数字都出现
System.out.println("123456".matches("[A-Za-z0-9]{6}"));
}
@Test
public void test04(){
String str1 = "12hela3h3salgH2";
//判断str1字符串是否有字母和数字和下划线等组成,长度任意
System.out.println(str1.matches("\\w+"));//true
}
@Test
public void test03(){
String str1 = "12hela3h3salgH2";
//判断str1字符串是否有字母和数字组成,长度任意
System.out.println(str1.matches("[a-zA-Z0-9]+"));//true
String str2 = "12hela_3h3salgH2";
//判断str2字符串是否有字母和数字组成,长度任意
System.out.println(str2.matches("[a-zA-Z0-9]+"));//false
}
@Test
public void test02(){
String str = "123456";
//判断是否由6个数字组成
System.out.println(str.matches("\\d{6}"));//true
}
@Test
public void test01(){
//判断下面的str1和str2字符串,是否里面全部由数字组成,至少有一个数字 \d+ 或 \d{1,}
String str1 = "123a56";
System.out.println(str1.matches("\\d+"));//false
/*
在正则中\是转义,在Java中\也是转义
Java中转义有:\t,\n,\r,\b,\',\",\\。
此处想要表示是正则中的\d,而不是Java中\d,就要写 \\d
*/
String str2 = "123456";
System.out.println(str2.matches("\\d+"));//true
}
}
8、系列八:替换
public String replace(CharSequence target, CharSequence replacement):把当前字符串中的目标target替换为replacement代替字符,不支持正则
public String replaceFirst(String regex, String replacement):替换第一个匹配目标,并且匹配时支持正则
public String replaceAll(String regex, String replacement):替换所有匹配目标,并且支持正则
public class TestStringMethod8 {
@Test
public void test04(){
String str = "hel22lo1jav3aatg4ui88gu";
//把str中的数字去掉
str = str.replaceAll("\\d","");
System.out.println(str); //hellojavaatguigu
}
@Test
public void test03(){
String str = "hellojavaatguigu";
//替换str中第一个出现的“a“为"A"
str = str.replaceFirst("a","A");
System.out.println(str); //hellojAvaatguigu
}
@Test
public void test02(){
String str = "hellojavaatguigu";
//替换str中的“a“字母去掉
str = str.replace("a","");
System.out.println(str); //hellojvtguigu
}
@Test
public void test01(){
String str = "hellojavaatguigu";
//替换str中的“a“字母为"A"
str = str.replace("a","A");
System.out.println(str); //hellojAvAAtguigu
}
}
9、系列九:拆分
String[] split(正则):按照某种规则进行拆分
public class TestStringMethod9 {
@Test
public void test2() {
String info = "1.张三.23|2.李四.24|3.王五.25";
//我们要在咱们的系统中,拆分并解读它的信息。
//这些是学生信息,有学号、姓名、成绩
//(1)第一步按照,拆分,分为3个同学的信息
String[] strings = info.split("\\|"); //|在正则中代表或
Student[] arr = new Student[strings.length];
//(2)每一个同学的信息按照:拆分,分为3个属性值
for (int i=0; i<strings.length; i++){
String[] studentString = strings[i].split("\\.");// .在正则中代表任意字符,所以都有特殊意义,需要转义
arr[i] = new Student(Integer.parseInt(studentString[0]), studentString[1], Integer.parseInt(studentString[2]));
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
@Test
public void test01(){
String info = "1:张三:89,2:李四:100,3:王五:56";//这是从别的系统获得的数据
//我们要在咱们的系统中,拆分并解读它的信息。
//这些是学生信息,有学号、姓名、成绩
//(1)第一步按照,拆分,分为3个同学的信息
String[] strings = info.split(",");
/*
{"1:张三:89","2:李四:100","3:王五:56"}
*/
Student[] arr = new Student[strings.length];
//(2)每一个同学的信息按照:拆分,分为3个属性值
for (int i=0; i<strings.length; i++){
String[] studentString = strings[i].split(":");
// 每循环一次studentString数组就代表一个学生信息:
// 例如:第1次,["1","张三","89"]
// 例如:第2次,["2","李四","100"]
// 例如:第3次,["3","王五","56"]
arr[i] = new Student(Integer.parseInt(studentString[0]), studentString[1], Integer.parseInt(studentString[2]));
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
class Student{
private int id;
private String name;
private int score;
public Student(int id, String name, int score) {
this.id = id;
this.name = name;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", score=" + score +
'}';
}
}