字符串介绍:
字符串是程序开发当中,使用最频繁的类型之一,有着与基础类型相同的地位,甚至在 JVM(Java 虚拟机)编译的时候会对字符串做特殊的处理,比如拼加操作可能会被 JVM 直接合成为一个最终的字符串,从而到达高效运行的目的。
1 、String 特性
String是标准的不可变类(immutable),对它的任何改动,其实就是创建了一个新对象,再把引用指向该对象;
Sting对象赋值之后就会在常量池中缓存,如果下次创建会判定常量池是否已经有缓存对象,如果有的话直接返回该引用给创建者。
2 、字符串创建
两种方式:
//字符串的创建形式
String str1 = "dabing";
String str2 = new String("dabing");
3、字符串拼接
//字符串的拼接
String str3 = "da"+"bing";
String str4 = "da";str4 += "bing";
String str4 = "da"; String str6 = str + "wang";
4、 字符串截取
字符串的截取使用 substring() 方法,使用如下:
//字符串的两种截取方式
String str5 = "abcdefg";
//从下标为3的开始截取,包含开始下标,输出cdefg
System.out.println(str5.substring(3));
//从下标为2开始截取下标为4的,包含开始下标不包含结束下标,输出cd
System.out.println(str5.substring(2, 4));
5 、字符对比及”==” 和 equals 的区别是什么?
“==” 对基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
示例代码:
String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
解析:因为 x 和 y 指向的是同一个引用,所以 “==” 也是 true,而 new String() 方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
String s1 = "hi," + "da" + "bing";
String s2 = "hi,";
s2 += "da";
s2 += "bing";
String s3 = "hi,dabing";
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // true
System.out.println(s2.equals(s3)); // true
6 、String、StringBuffer、StringBuild
StringBuffer、StringBuild 都是可以变的字符串类型,StringBuild 和 String 相似都是非线程安全的,所以多线程下推荐使用 StringBuffer。
StringBuffer 使用:
StringBuffer sb = new StringBuffer("da");
// 添加字符串到尾部
sb.append("bing"); // 执行结果:dabing
// 插入字符串到到当前字符串下标的位置
sb.insert(0,"hi,"); // 执行结果:hi,dabing
// 修改字符中某个下标的值
sb.setCharAt(0,'H'); // 执行结果:Hi,dabing
三者的区别:
线程安全:String 和 StringBuild 为非线程安全类,StringBuffer 为线程安全类;
值可变:String 值不可变,StringBuild 和 StringBuffer 值可变;
性能:StringBuffer 使用了 synchronization 保障了线程的安全,所以性能方面不如 StringBuild。