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转换成拼音后再首字母排序。
?
?
?