1.推荐使用String直接赋值
?
?
class="java" name="code">public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2); // 输出结果为true
System.out.println(str1 == str3); // 输出结果为false
}
? ? java当中为了避免系统大量的产生String对象,于是就设计出一个字符串常量池。当创建一个String时,首先会在常量池当中检查是否存在这个常量,若不存在,则创建,若不存在,则将内存地址指向此常量地址。而new String的情况下,Java不会去常量池寻找,而是直接在堆中建立对象,所以使用str1==str3自然不成立。通过上面的介绍,由于常量池是由JVM本身进行维护的,所以JVM本身已对常量池进行了大量优化,所以使用直接赋值的方式会比使用new String的方式效率更高,更节省内存空间。
?
?
?
?
public static void main(String[] args) {
// 1
String str1 = "AHelloA";
str1 = str1.replaceAll("A", "");
System.out.println(str1.equals("Hello")); // 输出为true
// 2
String str2 = "$Hello$";
str2 = str2.replaceAll("$", "");
System.out.println(str2.equals("Hello")); // 输出为false
// 3
String str3 = "$Hello$";
str3 = str3.replaceAll("\\$", "");
System.out.println(str3.equals("Hello")); // 输出为true
// 4
String str4 = "$Hello$";
str4 = str4.replace("$", ""); // 更改了replace方法
System.out.println(str4.equals("Hello")); // 输出为true
}
? ? ?这是因为replaceAll的方法其实是接受一个正则表达式,而$符号刚好是正则表达式的结束符号,所以出现了//2的情况。
?
?
3.注意String的不变性
?
?
public static void main(String[] args) {
// 1
String str1 = "Hello";
str1 += " World";
System.out.println(str1); // 输出Hello World
// 2
str1.replace("World", "");
System.out.println(str1); // 输出Hello World
}
? ? 在上面的代码当中,//1中一共创建了3个String,第一为Hello,第二为World,第三为Hello World。String类中提供的修改字符串的方法,包括substring,replace,concat等都是返回一个新的字符串,这是因为字符串的不变性造成的,所以在调用这些方法时需要用另一个或本调用的string去进行接收。
?
4.注意字符串的位置?
?
?
public static void main(String[] args) {
String str1 = 1 + 2 + "Hello";
System.out.println(str1); // 输出3Hello
String str2 = "Hello" + 1 + 2;
System.out.println(str2); // 输出Hello12
}
? ? String是一个霸道的类型,任何与String类型进行+号操作的其他类型,都会自动升格为String类型。第一个例子中首先执行1+2的操作,再偶遇到String的Hello,再进行了自动升格;而第二个例子中,在还没进行整形的加法运算时,就首先偶遇到了String,已经自动提升为String,所以就等于Hello1+2的操作,自然等于Hello12。
?
5.正确使用String,StringBuffer,StringBuilder?
?
? ? 在上文当中,曾经提到过String的不变性,在String原因下,就产生出了StringBuffer和StringBuilder,后2者为可变的字符串,亦可以称为缓冲字符串,主要原理其实很简单,就是缓冲字符串中的字符串形式是char数组,以下来分析StringBuffer和String的几点不同:
6.使用字符串解决编码问题
?
public static void main(String[] args) throws UnsupportedEncodingException {
String str1 = "你好";
// 第一种方法,此种方法需要知道来源字符串的编码
byte[] byte1 = str1.getBytes("GBK");
String str2 = new String(byte1);
// 第二种方法,此种方法需要知道转变为什么格式的字符串,推荐使用
String str3 = new String(str1.getBytes(), "UTF-8");
}
?
?
7.对字符串排序持宽容心态?
?
? ? 例如创建了一个字符串数组,使用Arrays.sort()进行自然排序,注意是自然排序,就会出现排序混乱的情况,为什么呢?因为我们Java对字符串排序时是根据了UNICODE编码来进行排序,是UNICODE编码对汉字的顺序并不是连贯连续的,所以若然要对字符串进行精确排序,可以选择使用pingyin4j转换成拼音后再首字母排序。
?
?
?