关于String的若干问题:
- String中的“==”与equals() 方法:
(1)对于String对象使用“==”判定时,其实是判定两个String对象是否为同一String对象的引用(内存地址是否相同);
(2)equals()用于判定两个String对象的内容是否一致;
public class TestEquals {
static String str1=new String("abcde");
static String str2=new String("abcde");
static String str3="abcde";
static String str4="abcde";
public static void main(String[] args) {
System.out.print("str1==str2 ? ");
System.out.println(str1==str2);
System.out.println("str1.equals(str2) ? "+str1.equals(str2));
System.out.println("str1.equals(str3) ? "+str1.equals(str3));
System.out.print("str1==str3 ? ");
System.out.println(str1==str3);
System.out.print("str3==str4 ? ");
System.out.println(str3==str4);
}
}
输出结果://str1==str2 ? false
//str1.equals(str2) ? true
//str1.equals(str3) ? true
//str1==str3 ? false
//str3==str4 ? true
String与char[]比较:
(1)String 对象是不可变的,JDK中对于String对象内容修改的方法实质上是重新创建了一个全新的String对象,原始的String一旦创建直到GCC将其收回才会消失。
(2)保存在char[]中的值是可以随时修改的,每次修改完之后之前的值将消失;
因此,相对来说char[]比String保密性更好。取出String中的内容:
String str1=new String("abcde");
String str2=new String("234");
String str3=new String("2.0f");
char[] strChar=str1.toCharArray();
Int strInt=Integer.parseInt(str2);
Float strFloat=Float.parseFloat(str3);
- 字符串拆分:
String str4=new String("a,b,c,d;e");
String[] strTemp=str4.split(",");
for(String ss:strTemp)
System.out.print(ss+",");
String vs StringBuilder vs StringBuffer :
(1) 上面已经提及,String是不可变的,而StringBuilder对象值是可变的,StringBuilder提供的insert(), replace(), subString(), append() 等用于操纵字符串内容;
(2) 相比StringBuffer,StringBuilder是java SE5引入的,在此之前,一般使用StringBuffer;相比StringBuilder,StringBuffer是线程安全的,因此开销会大,更慢。Apache Commons Lang包中的StringUtils:
(1) repeat()实现字符串重复构造;
(2) countMatches() 可以统计子串出现次数;int n = StringUtils.countMatches("11112222", "1"); System.out.println(n); String strRep=StringUtils.repeat("String ,", 6); System.out.println(strRep);