1. Java中Strings不是以null结尾
不像C和C++,Java中的String不会以null字符结尾。Java中的String是对象并且被字符数组所支持。Java String通过调用java.lang.String类的toCharArray()方法得到字符数组。
2. Strings是不可变的和final的
Java中的String是不可变的意味着一旦被创建就不能被修改。如果你使用toLowerCase(),toUpperCase()或其他的方法修改,而是创建新的String。因为String是final的不允许继承或重载。
3. Strings保存在String池中
正如我之前所说,在Java中String是特殊类并且字符串常量(比如“abc”)存在单独的字符串池中,在Java内存的特殊内存位置上,确切地说是在PermGen空间里。当使用字符串常量来创建新的字符串对象时,JVM首先检查字符串池中是否存在类似内容的对象,如果存在就返回这个对象,并且不创建一个新的对象。如果你使用new运算符创建对象,JVM不会执行字符串池的检查。比如,
String name = "Scala"; //1st String object
String name_1 = "Scala"; //same object referenced by name variable
String name_2 = new String("Scala") //different String object
//this will return true
if(name==name_1){
System.out.println("both name and name_1 is pointing to same string object");
}
//this will return false
if(name==name_2){
System.out.println("both name and name_2 is pointing to same string object");
}
name == name1 返回 true,因为两者指向相同的对象。而name = name2 返回 false,因为它们指向不同的对象。需要记住“==”操作符比较的是对象的内存位置不是字符串的字符。默认情况下Java将所有的字符串常量存入字符串池中,但是你也可以通过调用java.lang.String类的intern()方法将一些字符串放入池中,如使用new()操作符创建的字符串。
4. 用Equals方法比较字符串
字符串类重载equals方法并提供内容的相等,这些基于字符,大小写和顺序。因此如果你想比较两个字符串对象,为了检查是否它们相同,经常使用equeals()方法而不是“==”。正如先前的例子如果我们使用equals方法来比较对象,它们都是相等的,因为它们都包含相同的内容。举例说明:
String name = "Java"; //1st String object
String name_1 = "Java"; //same object referenced by name variable
String name_2 = new String("Java") //different String object
if(name.equals(name_1)){
System.out.println("name and name_1 are equal String by equals method");
}
//this will return false
if(name==name_2){
System.out.println("name_1 and name_2 are equal String by equals method");
}
5. 使用indexOf()和lastIndexOf()或matches(String regex)方法检索字符串
Java的字符串类提供便捷的方法来查找当前字符串对象的一个字符或子字符串或存在特定模式的字符串。你可以使用indexof(),如果当前字符串对象中存在一个字符或字符串,此方法可以返回它们的位置,如果不存在则返回-1。lastIndexOf类似只是从字符串后端检索。String.match(String regex)甚至更强大,允许你通过这则表达式来检索字符串。举例说明:
String str = "Java is best programming language";
if(str.indexOf("Java") != -1){
System.out.println("String contains Java at index :" + str.indexOf("Java"));
}
if(str.matches("J.*")){
System.out.println("String Starts with J");
}
str ="Do you like Java ME or Java EE";
if(str.lastIndexOf("Java") != -1){
System.out.println("String contains Java lastly at: " + str.lastIndexOf("Java"));
}
正如所预料的一样indexOf会返回0,因为这些字符在字符串中的索引是0。lastIndexOf返回第二个“Java”的索引,是23开始并且matches会返回true,因为J.*模式是以J开头的后面匹配任意字符或数字。
记住matches是难以捉摸和不直观的。如果你只放“Java”将会返回false,因为字符串不等于“Java”。
除了indexOf(),lastIndexOf()和matches(String regex),字符串也有像startsWith()和endsWith()方法,这些可以检查字符串是否以特定的字符串开始或结尾。
6. 用SubString获得Java的部分字符串
Java字符串提供另一个有用的方法substring(),可以用来获取部分字符串。只要你指定开始和结束索引substring()方法就可以返回那个区间的字符。索引从0开始到String.length()-1。String.length()返回字符串的字符数,包含空格(tab,space)。值得注意的是substring也被字符数组所支持。如果原始字符串对象非常大而substring非常小是很危险的,因为即使是对数组的一小部分引用也会被阻止垃圾回收。举例说明:
String str = "Java is best programming language";
//this will return part of String str from index 0 to 12
String subString = str.substring(0,12);
System.out.println("Substring: " + subString);
7. “+” 的重载用于字符串连接
Java不支持操作符重载,但是字符串是特例,“+” 可以用来连接两个字符串。它甚至通过简单的和空字符串“”连接就可以用来将int, char, long 或者 double 转化为字符串。“+” 的内部实现在Java 5 之前是StringBuffer并且从Java 5开始使用StringBuilder。这些引入了StringBuffer和StringBuilder管理字符串的观点。由于两者都代表可变对象,他们可以被用来减少由于临时的String创建的字符串垃圾。
8. 使用trim()去除字符串空格
Java字符串提供trim()方法去除字符串两端的空格。字符串也提供replace()和replaceAll()方法来取代字符,replaceAll方法支持使用正则表达式。
9. split()方法可用正则表达式分割字符串
split(regex)可以使用正则表达式来分隔字符串。
10. 不要在字符串中存储敏感数据
如果用于存储诸如密码,社会安全号码或其他敏感信息的敏感数据,字符串会构成安全威胁。因为Java的字符串是不可变的,并且保存在字符串池中,会在Java堆中保留很长时间,所以没有方法可以消除字符串的内容,会给可以访问Java内存的人暴露风险,如从内存dump中都取。char[]可以用来存储密码或敏感信息。
|