Strinig
对于字符串而言,哈希码值是不会改变的。
因为字符串是被共享的,保证哈希码值一样的情况下,字符串一样,对象一样。
常用API
indexOf() 获取指定元素第一次出现的位置
indexOf(" ",fronIndex) 从指定位置寻找指定元素
lastIndexOf() 获取指定元素最后一次出现的位置
intern() 强制返回这个字符串的字面量
replace(char oldChar, char newChar) 替换
substring(begnIndex) 截取,从指定索引到最后
substring(begnIndex,endIndex) 从开始索引到结束索引,包钱不包后
trim() 去掉两边的空格
valueOf() valueOf底层调用了对象的toString方法
split(" ") 切割
// 边界符如果在字符串的开头,那么会切出一个" “,有几个切几个
// 边界符如果在字符串的中间,那么会切出一个” “,如果有多个边界符,那么会切n-1个” "
// 边界符如果在字符串的后面,那么被直接切掉,无论有多少个
练习
输入一个字符串以及一个子串,打印这个子串在字符串中出现的所有的位置
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
String subStr = scanner.nextLine();
// abcdaka
int index = 0;
while (index < str.length()){
index = str.indexOf(subStr,index);
if (index != - 1){
System.out.println(index);
index++;
}else{
break;
}
}
}
// 输入一个字符串和一个数字,数字表示字节的个数,
// 按照指定的字节个数截取字符串(使用GBK编码),并且如果出现乱码就舍弃乱码。
public static void main(String[] args) throws UnsupportedEncodingException {
// 获取字符串和字符个数
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int n = scanner.nextInt();
// 先将字符串转换为字节数组
byte[] bs = str.getBytes("gbk");
// 判断要截取的字节个数是否合法
if (n < 0 || n > bs.length){
return;
}
// 按照指定的字节个数进行截取
String sub = new String(bs,0,n,"gbk");
// 判断是否截取了半个字符
int index = sub.length() - 1;
if (sub.charAt(index) != str.charAt(index)){
sub = new String(bs,0,n-1,"gbk");
}
System.out.println(sub);
}
// 练习:输入一个字符串作为密码:由8-12位组成,由大写字母/小写字母/数字/空格至少出现2种
private static boolean cheakPassword(String password){
// 密码的长度是8-12位
if (!password.matches("[a-zA-Z\\d ]{8,12}")){
return false;
}
// 记录出现的字母的类型
int count = 0;
// 判断是否出现了小写字母
if (password.matches(".*[a-z].*")){
count++;
}
// 判断是否出现了大写字母
if (password.matches(".*[A-Z].*")){
count++;
}
// 判断是否出现了空格
if (password.matches(".* .*")){
count++;
}
// 判断是否出现了数字
if(password.matches(".*\\d.*")){
count++;
}
return count>=2;
}
// 练习:计算字符串的平均碎片长度 aaabbcaabbcc --> aaa bb c aa bb cc --> 12 / 6 = 2
// 获取碎片的总长度
String str2 = "aaabbcaabbcc";
int len = str2.length();
// 去除叠字之后的长度就是碎片的长度
double count = str2.replaceAll("(.)\\1+","$1").length();
// 计算平均碎片长度
System.out.println(len / count);
正则表达式
// 匹配字符串
// 第一个字符: a/b/c
// 第二个字符: 3/4/6/8
// 第三个字符:o/p/q
System.out.println(str.matches("[abc][3468][opq]"));
每个[ ]表示一个字符
判断由一个小写字母组成的字符串
System.out.println(str.matches("[a-z]"));
// 判断由一个字母组成的字符串
System.out.println(str.matches("[a-zA-Z]"));
// 只要是连续范围,都可以使用
System.out.println(str.matches("[m-x]"));
// 判断数字
System.out.println(str.matches("[0-9]"));
// 判断由一个字符组成的字符串,这个字符不是a/b/c
System.out.println(str.matches("[^abc]"));
// 匹配由3个字符组成的字符串
// 开头是数字,结尾是字母 \\d表示数字
// .通配符 可以表示任意一个字符
System.out.println(str.matches("\\d.[a-zA-Z]"));
// 匹配 .
System.out.println(str.matches("\."));
// 匹配
System.out.println(str.matches("\\"));
// 数量词 +
// ab abb abbb abbbb…
// + 表示之前的字符至少出现1次 >=1
System.out.println(str.matches(“ab+”));
// 匹配由字母开头后续是数字的字符串
System.out.println(str.matches("[a-zA-Z]\d+"));
// 由数字作为头和尾的字符串
// * 表示之前的字符可有可无 >=0
System.out.println(str.matches("\d.*\d"));
// 匹配+ \\+
System.out.println(str.matches("\\+"));
// 匹配* \\*
System.out.println(str.matches("\\*"));
// 匹配一个不超过两位的数字组成的字符串
// ? 表示之前的字符最多出现一次 <= 1
System.out.println(str.matches("\d\d?"));
// * + ? 这三个数量词字符后面只能出现一次
// 总结 + >=1
// * >=0
// ? <=1