String类
/**
* String类
* java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描述,如:"abc"。
* 该类由final关键字修饰,表示该类不能被继承。
* 从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一些空间。
* String常量池
* 由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量
* 池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对
* 象,从而提高了性能。
*/
public class StringTest {
public static void main(String[] args) {
// 常量池作用
String s8 = "abc";
String s9 = "abc";
// 比较地址值 true
System.out.println(s8 == s9);
// 1、无参构造
String s1 = new String();
System.out.println(s1);
System.out.println("-----------------");
// 2、使用byte[]构造对象
byte[] bArr = {97, 98, 99 ,100 ,101};
String s2 = new String(bArr, 1, 3);
System.out.println(s2);
String s3 = new String(bArr);
System.out.println(s3);
System.out.println("-----------------");
// 3、使用char[]构造对象
char[] cArr = {'a', 'b', 'c', 'd', 'e'};
String s4 = new String(cArr, 1, 3);
System.out.println(s4);
String s5 = new String(cArr);
System.out.println(s5);
System.out.println("-----------------");
// 4、根据参数指定的字符串来构造对象,新创建的对象为参数对象的副本
String s6 = "abc";
String s7 = new String(s6);
System.out.println(s7);
System.out.println("-----------------");
// 笔试考点
// 1、下面的代码会创建几个对象?分别存放在什么地方?
String s10 = "hello"; // 1个对象,存放在常量池(方法区)
String s11 = new String("hello"); // 2个对象,参数存放在常量池,s11存放在堆区
// 2、常量池和堆区对象比较
String s12 = "hello"; // 常量池
String s13 = "hello"; // 常量池
String s14 = new String("hello"); // 堆区
String s15 = new String("hello"); // 堆区
System.out.println(s12 == s13); // 比较地址 true
System.out.println(s12.equals(s13)); // 比较内容 true
System.out.println(s14 == s15); // 比较地址 false
System.out.println(s14.equals(s15)); // 比较内容 true
System.out.println(s13 == s14); // 比较地址 false
System.out.println(s13.equals(s14)); // 比较内容 true
System.out.println("-----------------");
// 3、常量有优化机制,变量没有
String s16 = "abcd";
String s17 = "ab" + "cd"; // 常量优化机制
System.out.println(s16 == s17); // true
String s18 = "ab";
String s19 = s18 + "cd";
System.out.println(s16 == s19); // false
System.out.println("-----------------");
// 常用成员方法
String s20 = "abcd";
// 将当前字符串内容转换为byte数组并返回
byte[] bytes = s20.getBytes();
for (byte aByte : bytes) {
System.out.println(aByte); // 97 98 99 100
}
System.out.println("-----------------");
// 用于将当前字符串内容转换为char数组并返回
char[] chars = s20.toCharArray();
for (char aChar : chars) {
System.out.println(aChar); // a b c d
}
System.out.println("-----------------");
// 方法charAt用于返回字符串指定位置的字符。
char c = s20.charAt(1);
System.out.println(c); // b
// 返回字符串字符序列的长度
System.out.println(s20.length()); // 4
// 判断字符串是否为空
System.out.println(s20.isEmpty()); // false
System.out.println("-----------------");
// int compareTo(String anotherString) 比较调用对象和参数对象的大小关系
String s21 = "hello";
System.out.println(s21.compareTo("world")); // 'h' - 'w' => 104 - 119 = -15
System.out.println(s21.compareTo("haha")); // 'e' - 'a' => 101 - 97 = 4
System.out.println(s21.compareTo("hehe")); // 'l' - 'h' => 108 - 104 = 4
System.out.println(s21.compareTo("heihei")); // 'l' - 'i' => 108 - 105 = 3
System.out.println(s21.compareTo("helloworld")); // 长度:5 - 10 = -5
System.out.println("-----------------");
// int compareToIgnoreCase(String str) 不区分大小写
System.out.println(s21.compareToIgnoreCase("HELLO")); // 不区分大小写
System.out.println("-----------------");
// String concat(String str) 用于实现字符串的拼接
String s22 = "world";
System.out.println(s22.concat(s21));
System.out.println("-----------------");
// boolean contains(CharSequence s) 用于判断当前字符串是否包含参数指定的内容
System.out.println(s22.contains("ol")); // false
System.out.println(s22.contains("or")); // true
System.out.println("-----------------");
// String toLowerCase() 返回字符串的小写形式
String s23 = "HELLO";
System.out.println(s23.toLowerCase()); // hello
System.out.println("-----------------");
// String toUpperCase() 返回字符串的大写形式
System.out.println(s22.toUpperCase()); // WORLD
System.out.println("-----------------");
// String trim() 返回去掉前导和后继空白的字符串
String s24 = " nice to meet you! ";
System.out.println("s24 :" + s24); // s24 : nice to meet you!
System.out.println("s24 :" + s24.trim()); // s24 :nice to meet you!
System.out.println("-----------------");
// boolean startsWith(String prefix) 判断字符串是否以参数字符串开头
System.out.println(s24.startsWith(" ")); // true
System.out.println(s23.startsWith("he")); // false
System.out.println(s23.startsWith("HE")); // true
System.out.println("-----------------");
// boolean startsWith(String prefix, int toffset) 从指定位置开始是否以参数字符串开头
System.out.println(s24.startsWith(" ",0)); // true
System.out.println(s24.startsWith(" ",1)); // true
System.out.println(s24.startsWith(" ",2)); // true
System.out.println(s24.startsWith(" ",3)); // false
System.out.println(s24.startsWith("n",3)); // true
System.out.println("-----------------");
// boolean endsWith(String suffix) 判断字符串是否以参数字符串结尾
System.out.println(s24.endsWith(" "));// true
System.out.println("-----------------");
// boolean equals(Object anObject) 用于比较字符串内容是否相等并返回
System.out.println("hello".equals("hello")); // true
System.out.println("-----------------");
// int hashCode() 获取调用对象的哈希码值
System.out.println("hello".hashCode()); // 99162322
System.out.println("-----------------");
// boolean equalsIgnoreCase(String anotherString) 用于比较字符串内容是否相等并返回,不考虑大小写,
System.out.println("hello".equalsIgnoreCase("HEllo")); // true
System.out.println("-----------------");
// int indexOf(int ch) 用于返回当前字符串中参数ch指定的字符第一次出现的下标
System.out.println("abcd".indexOf(98)); // 1
System.out.println("abcd".indexOf('b')); // 1
System.out.println("abcdbcd".indexOf(98)); // 1
System.out.println("-----------------");
// int indexOf(int ch, int fromIndex) 用于从fromIndex位置开始查找ch指定的字符
System.out.println("abcdbcdbcd".indexOf(98, 2)); // 4
System.out.println("-----------------");
// int indexOf(String str) 在字符串中检索str返回其第一次出现的位置,若找不到返回-1
System.out.println("abcdbcdde".indexOf("bcd")); // 1
System.out.println("abcdbcdde".indexOf("bce")); // -1
System.out.println("-----------------");
// int indexOf(String str, int fromIndex) 表示从字符串的fromIndex位置开始检索str第一次出现的位置
System.out.println("abcdbcdde".indexOf("bcd", 2)); // 4
System.out.println("abcdbcdde".indexOf("bce", 1)); // -1
System.out.println("-----------------");
// int lastIndexOf(int ch) 用于返回参数ch指定的字符最后一次出现的下标
System.out.println("abcdbcdde".lastIndexOf("b")); // 4
System.out.println("abcdbcdde".indexOf("f")); // -1
System.out.println("-----------------");
// int lastIndexOf(int ch, int fromIndex) 用于从fromIndex位置开始查找ch指定字符最后一次出现的下标
System.out.println("abcdbcdde".lastIndexOf("b", 3)); // 1
System.out.println("-----------------");
// int lastIndexOf(String str) 返回str指定字符串最后一次出现的下标
System.out.println("abcdbcdde".lastIndexOf("bcd")); // 4
System.out.println("abcdbcdde".indexOf("bce")); // -1
System.out.println("-----------------");
// int lastIndexOf(String str, int fromIndex) 用于从fromIndex位置开始反向搜索的第一次出现的下标。
System.out.println("abcdbcdde".lastIndexOf("bcd", 3)); // 1
System.out.println("-----------------");
// String substring(int beginIndex, int endIndex) 返回字符串中从下标beginIndex(包括)开始到endIndex(不包括)结束的子字符串
System.out.println("abcdbcd".substring(1, 5)); // bcdb
System.out.println("-----------------");
// String substring(int beginIndex) 返回字符串中从下标beginIndex(包括)开始到字符串结尾的子字符串
System.out.println("abcdbcd".substring(1));// bcdbcd
System.out.println("-----------------");
}
}
正则表达式
正则表达式本质就是一个“规则字符串”,可以用于对字符串数据的格式进行验证,以及匹配、查
找、替换等操作。该字符串通常使用^运算符作为开头标志,使用$运算符作为结尾标志,当然也可以省
略。
正则表达式 | 说明 |
---|---|
[abc] | 可以出现a、b、c中任意一个字符 |
[^abc] | 可以出现任何字符,除了a、b、c的任意字符 |
[a-z] | 可以出现a、b、c、……、z中的任意一个字符 |
[a-zA-Z0-9] | 可以出现a-z、A-Z、0-9中任意一个字符 |
. | 任意一个字符(通常不包含换行符) |
\d | 任意一个数字字符,相当于[0-9] |
\D | 任意一个非数字字符 |
\s | 空白字符,相当于[\t,\n,\x0B,\f,\r] |
\S | 非空白字符 |
\w | 任意一个单词字符,相当于[a-z,A-Z,_,0-9] |
\W | 任意一个非单词字符 |
X? | 表示X可以出现一次或一次也没有,也就是0 ~ 1次 |
X* | 表示X可以出现零次或多次,也就是0 ~ n次 |
X+ | 表示X可以出现一次或多次,也就是1 ~ n次 |
X{n} | 表示X可以出现恰好 n 次 |
X{n,} | 表示X可以出现至少 n 次,也就是>=n次 |
X{n,m} | 表示X可以出现至少 n 次,但是不超过 m 次,也就是>=n并且<=m次 |
方法名称 | 方法说明 |
---|---|
boolean matches(String regex) | 判断当前正在调用的字符串是否匹配参数指定的正则表达式规则 |
String[] split(String regex) | 参数regex为正则表达式,以regex所表示的字符串为分隔符,将字符串拆分成字符串数组 |
String replace(char oldChar, char newChar) | 使用参数newChar替换此字符串中出现的所有参数oldChar |
String replaceFirst(String regex,String replacement) | 替换此字符串匹配给定的正则表达式的第一个子字符串 |
String replaceAll(String regex,String replacement) | 将字符串中匹配正则表达式regex的字符串替换成replacement |
案例题目:
// 使用正则表达式描述一下银行卡密码的规则:要求是由6位数字组成。
String s1 = "^\\d{6}$";
System.out.println("请输入银行卡密码:");
Scanner sc = new Scanner(System.in);
while(true) {
String s2 = sc.next();
if (s2.matches(s1)) {
System.out.println("银行卡格式正确");
break;
} else {
System.out.println("银行卡格式不正确!!!");
}
}
// 使用正则表达式描述一下QQ号码的规则:要求是由非0开头的5~15位数组成。
String s3 = "[1-9]\\d{4,14}";
System.out.println("请输入您的QQ号:");
Scanner sc = new Scanner(System.in);
while(true) {
String s4 = sc.next();
if (s4.matches(s3)) {
System.out.println("QQ号格式正确");
break;
} else {
System.out.println("QQ号格式不正确!!!");
}
}