String与StringBuilder的使用及区别
1.Java 中字符串的不变性
1>String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存 空间不同
2> 每次 new 一个字符串就是产生一个新的对象,即便两个字符串的内容相同,使用 ”==” 比较时 也为 ”false” ,如果只需比较内容是否相同,应使用 ”equals()” 方法
public static void main(String[] args) {
String s1 = "imooc";
String s2 = "imooc";
String s3 = "I love"+s1;
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
System.out.println("s1和s3内存地址相同吗?" + (s1 == s3));
String s4 = "I love " + s1;
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
}
运行结果:
s1和s2内存地址相同吗?true
s1和s3内存地址相同吗?false
s3和s4内存地址相同吗?false
2.String类的常用方法
注意:
- 字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1
- 使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引;如果没有匹配结果,返回 -1
- 使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符
public static void main(String[] args) {
String fileName = "HelloWorld.java";
String email = "laurenyang@imooc.com";
/*
参考步骤:
1、获取文件名中最后一次出现"."号的位置
2、根据"."号的位置,获取文件的后缀
3、判断"."号位置及文件后缀名
*/
int index = fileName.lastIndexOf(".");
String prefix = fileName.substring(index);
// 判断必须包含"."号,且不能出现在首位,同时后缀名为"java"
if (index > 0 &&(prefix.equals(".java"))) {
System.out.println("Java文件名正确");
} else {
System.out.println("Java文件名无效");
}
// 判断邮箱格式是否正确:合法的邮箱名中至少要包含"@", 并且"@"是在"."之前
/*
参考步骤:
1、获取文件名中"@"符号的位置
2、获取邮箱中"."号的位置
3、判断必须包含"@"符号,且"@"必须在"."之前
*/
int index2 = email.indexOf("@");
int index3 = email.indexOf('.');
if (index2 != -1 && index3 > index2) {
System.out.println("邮箱格式正确");
} else {
System.out.println("邮箱格式无效");
}
}
}
3.StringBuilder 类
定义:
4.StringBuilder 类的常用方法
public static void main(String[] args) {
// 创建一个空的StringBuilder对象
StringBuilder str = new StringBuilder();
// 追加字符串
str.append("jaewkjldfxmopzdm");
// 从后往前每隔三位插入逗号
for(int i = str.length()-3; i >= 0; i=i-3 )
{
str.insert(i,",");
}
// 将StringBuilder对象转换为String对象并输出
System.out.print(str.toString());
}
运行结果:
j,aew,kjl,dfx,mop,zdm
5.String与StringBuilder的区别
效率高低:
StringBulider>StringBuffer>String;String确定字符串之后是固定的不可改变的;重新添加字符串就会成为一个新的对象,并非是原对象;StringBulider确定字符串后可对字符串进行修改、增加内容,且指定的还是原对象,性能比string高;StringBulider和StringBuffer比较,前者没有实现线程安全功能,后者是线程安全,所以前者比后者高;
6.检测字符串是否相等
若检验两个字符串是否相等,而不需要区分大小写,则使用equalsIgnoreCase方法eg:“Hello”.equalsIgnoreCase(“hello”)