JavaSE核心API--字符串操作类
java.lang.String
1)理论讲解:charAt方法
char charAt(int index)
获取给定位置对应的字符
代码演示:
0123456789012345
String str="thinking in java";
char c=str.charAt(10);
System.out.println(c);//输出为n
// //判断回文
// String line="上海自来水来自海上";
// for (int i = 0; i < line.length()/2; i++) {
// if (line.charAt(i)!=line.charAt(line.length()-1-i)) {
// System.out.println("不是回文!");
// break;
// }
// }
// System.out.println("是回文!");
// //判断回文
// String line="上海自来水来自海上";
// for (int i = 0; i < line.length()/2; i++) {
// if (line.charAt(i)!=line.charAt(line.length()-1-i)) {
// System.out.println("不是回文!");
// return;//对于返回值类型为void的方法,return的作用是结束该方法,下面语句都不执行
// }
// }
// System.out.println("是回文!");
//判断回文
String line="上海自来水来自来海上";
for (int i = 0; i < line.length()/2; i++) {
if (line.charAt(i)!=line.charAt(line.length()-1-i)) {
System.out.print("不");//如果不相等则输出“不”不换行与“是回文!”进行拼接
break;
}
}
System.out.println("是回文!");//这是必走语句
2)理论讲解: indexOf方法
int indexOf(String str)
获取给定字符串在当前字符串中的位置,若当前字符串中不含有给定内容则返回值为-1
代码演示:
// 0123456789012345
String str="thinking in java";
int index=str.indexOf("in");//默认从0开始查找
System.out.println(index);//2
index=str.indexOf("in",3);//从指定位置开始查找
System.out.println(index);//5
index=str.lastIndexOf("in");//返回最后一次查找到的位置
System.out.println(index);//9
3)理论讲解:length方法
int length()
获取当前字符串的长度(字符个数)
代码演示:
/**
* 专门用于统计字符个数
*/
String str="我爱java";
int len=str.length();
System.out.println("len:"+len);
4)理论讲解:正则表达式方法一
字符串支持正则表达式方法一:
boolean matches(String regex)
使用给定的正则表达式验证当前字符串是否符合格式要求,符合则返回true
以下需要注意:
无论给定的正则表达式是否指定了边界匹配(^...$)都是做完全匹配验证的。
代码演示:
// String email="fancq@tedu.cn";
/**
* 邮箱的正则表达式
* \w+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
*/
Scanner scan=new Scanner(System.in);
System.out.println("请输入邮箱:");
String email=scan.nextLine();
String regex="\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
boolean match=email.matches(regex);
if (match) {
System.out.println("是邮箱!");
} else {
System.out.println("不是邮箱");
}
scan.close();
5)理论讲解:正则表达式方法二
字符串支持正则表达式方法二:
String[] split(String regex)
将当前字符串中按照满足正则表达式的部分进行拆分,并将拆分出的每部分以一个字符串数组形式返回
代码演示:
String str="abc123def456ghi";
/*
* 按照数字部分拆分,得到所有的字母部分
*/
String[] arr=str.split("[0-9]+");
System.out.println(arr.length);
System.out.println(Arrays.toString(arr));
6)理论讲解:正则表达式方法三
字符串支持正则表达式方法三:
String replaceAll(String regex,String str)
将当前字符串中满足正则表达式的部分替换为str
代码演示:
String str="abc123def456ghi";
/*
* 将当前字符串的数字部分替换为"*******"
*/
str=str.replaceAll("\\d+", "*******");
System.out.println(str);
/*
* 将敏感词汇和谐******
* 输入密码不可见******
*/
String s="123";
s=s.replaceAll(s, str);
System.out.println(s);
7)理论讲解:startsWith和endsWith方法
boolean startsWith(String str)
boolean endsWith(String str)
判断字符串是否是以给定的字符串开始或结尾的
代码演示:
String str="thinking in java";
boolean starts=str.startsWith("thin");
System.out.println(starts);
boolean ends=str.endsWith("ava");
System.out.println(ends);
//xxx.png 判断文件名是否是以.png结尾
Scanner sc=new Scanner(System.in);
System.out.println("请输入文件名:");
String str2=sc.nextLine();
boolean flagend=str2.endsWith(".png");
if (flagend) {
System.out.println("该文件是图片!");
} else {
System.out.println("该文件不是图片!");
}
sc.close();
8)理论讲解:StringBuilder类
StringBuilder是专门设计用来编辑字符串内容的API
由于String不适合频繁修改,所以在实际开发中如果有经常修改字符串的操作时,可以使用StringBuilder来完成
StringBuilder内部维护一个可变的字符数组,所以修改的过程中资源占用小,并且提供了对应的操作:增,删,改,插
代码演示:
String str="好好学习java";
//默认方式创建内部表示一个空字符串:""
// StringBuilder builder=new StringBuilder();
//创建时表示给定字符串内容
StringBuilder builder=new StringBuilder(str);
/**
* 好好学习java
* 好好学习java,为了找个好工作!
* append:将指定内容追加到当前字符串末尾
*/
builder.append(",为了找个好工作!");
str=builder.toString();
System.out.println(str);
/**
* 好好学习java,为了找个好工作!
* 好好学习java,就是为了改变世界!
* replace:将指定范围内的字符串替换为给定内容
*/
builder.replace(9, 16, "就是为了改变世界");
str=builder.toString();
System.out.println(str);
/**
* 好好学习java,就是为了改变世界!
* ,就是为了改变世界!
* delete:删除指定范围内的字符串
*/
builder.delete(0, 8);
str=builder.toString();
System.out.println(str);
/**
* ,就是为了改变世界!
* 活着,就是为了改变世界!
* insert:将指定内容插入到指定位置
*/
builder.insert(0, "活着");
str=builder.toString();
System.out.println(str);
9)理论讲解:String类
String是不变对象,要想改变需重新创建另一个对象
JVM对String有一个优化,即:常量池
当使用字面量形式创建字符串对象时,JVM会将其缓存在常量池中,
当再次使用该字面量创建字符串对象时即重用对象,避免内存中堆积大量内容一样的字符串对象,减少内存占用
字符串只适合重用,不适合频繁修改
代码演示:
String s1="123abc";
String s2="123abc";
String s3="123abc";
/**------------常见面试题
* 这里发挥了编译器的一个特性:
* 编译器在编译源代码时,若发现一个计算表达式
* 参与计算的内容是一个确定不变的值时,会在编译期间直接进行计算
* 并将计算结果编译到.class文件中,避免jvm在每次执行程序时再次重复运算,
* 从而提高性能(即虚拟机的优化)。
* 如下代码,编译器编译后改为了:
* String s4="123abc";
*/
String s4="123"+"abc";
//编译器在执行该行代码时,若结果是确定不变的(即常量,非变量),则直接把结果编译好了,而不用在虚拟机上面再次编译
//此处String s4="123"+"abc";就相当于String s4="123abc";
System.out.println(s4);//123abc
System.out.println(s2==s4);//true
String s5="123";
String s6=s5+"abc";//遇到计算表达式看运算结果是不是确定值,如果有变量则需要重新创建对象,此时s6和s5都引用了不同的对象
System.out.println(s6);//123abc
System.out.println(s2==s6);//false
10)理论讲解:substring方法
String substring(int start,int end)----含头不含尾start~end-1
截取指定范围内的字符串
代码演示:
// 0123456789012
String str="www.baidu.com";
/*
* java API中有一个特点,通常使用两个数字表示范围时,都是“含头不含尾”的
*/
String sub=str.substring(4, 9);//实际上的范围是4-8
System.out.println(sub);//结果输出为baidu
sub=str.substring(4);//从位置4一直截取到末尾
System.out.println(sub);//输出结果为baidu.com
11)理论讲解:toUpperCase和toLowerCase方法
String toUpperCase()
String toLowerCase()
将当前字符串中的英文部分转换成全大写或全小写
代码演示:
String str="我爱java";
String upper=str.toUpperCase();
System.out.println(upper);
String lower=str.toLowerCase();
System.out.println(lower);
12)理论讲解:trim方法
String trim()
该方法返回一个去除原字符串两边空白之后的新字符串
代码演示:
String str=" Hello World ";
String trim=str.trim();
System.out.println(str);
System.out.println(trim);
13)理论讲解:valueOf方法
字符串提供了一组重载的valueOf方法,可以将其他类型转换为字符串
代码演示:
int d=123;
String str=String.valueOf(d);//把d转成字符串类型str
//任何内容和字符串连接结果也能转换为字符串,但执行性能较差
str=d+"";
System.out.println(str);
double dou=123.123;
String str2=String.valueOf(dou);
System.out.println(str2);