1.推荐使用String直接赋值
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的方式效率更高,更节省内存空间。
2.注意正则表达式引发的问题
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的几点不同:
- 在频繁的字符串运算,例如拼接,删除,增加,替换,解释XML,进行SQL拼接的时候,请优先考虑使用StringBuffer、StringBuilder;
- 在性能考虑方面,由于StringBuffer带有缓冲区,而且最终使用toString() 方法转换成1个字符串,我们试想,StringBuffer无论里面的信息是多么的复杂,但最终是生成了1个字符串对象,效率会比用+号拼接不停生成字符串的效率要高 ;
- 想使用更多功能时,例如字符串翻转reverse,字符串插入insert,这些都是 String所不提供的,而StringBuffer却支持,所以想增加某些功能时,使用 StringBuffer;
- StringBuffer和StringBuilder区别?StringBuffer是线程安全的,在多线程的环境底下应该使用StringBuffer,而StringBuilder线程是不安全的,由于现在流行的SSH框架,而struts2中Action是线程安全的,所以 请大胆的使用StringBuilder 。
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转换成拼音后再首字母排序。
相关推荐
java代码-使用java解决xml--查找并替换字符串(避免乱码)的问题的源代码 ——学习参考资料:仅用于个人学习使用!
字符串a-z排序
java代码-使用java解决从字符串中解析二维数组的源代码 ——学习参考资料:仅用于个人学习使用!
java代码-使用java解决字符串前面或后面补零的源代码 ——学习参考资料:仅用于个人学习使用!
字符串-Java解题分析-学习资料.zip 是一个关于Java中字符串处理的解题分析和学习资料的压缩文件。该资源主要涵盖了Java中字符串的基本操作、常见算法和问题解析,旨在帮助开发者深入理解字符串在Java中的运用,提高...
java 字符串 详细实例代码 字符串检索 可改变字符串 字符串生成器 日期和时间字符串格式化
java-string-similarity, 各种字符串相似性和距离算法 java-string-similarity 实现不同字符串相似度和距离度量的库。 目前已经实现了许多算法( 包括Levenshtein编辑距离和 sibblings,jaro winkler,最长公共子序列...
java代码-使用java解决Map转JSON字符串的源代码 ——学习参考资料:仅用于个人学习使用!
305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)305-字符串函数string.h应用举例(51单片机C语言实例Proteus仿真和代码)...
java代码-java字符串工具类源代码合集 ——学习参考资料:仅用于个人学习使用!
不需要关心接受的字符串编码是UTF_8还是GBK,还是ios-8859-1,自动转换为utf-8编码格式,无需判断字符串原有编码,用法://处理编码String newStr = GetEncode.transcode(oldStr);
JAVA中字符-字符串常用的方法.doc
java课件-6-字符串和数组.pptx
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
java代码-使用java字符串排序的源代码 ——学习参考资料:仅用于个人学习使用!
Java 实例 - 字符串优化源代码-详细教程.zip
Java 实例 - 字符串搜索源代码-详细教程.zip
Java 实例 - 字符串分割源代码-详细教程.zip
Java 实例 - 字符串反转源代码-详细教程.zip
Java 实例 - 字符串比较源代码-详细教程.zip