标签:
一、字符串是什么
1.字符串对象或其等价对象(如char数组),在内存中总是占据最大的空间快
2.String和char数组
char数组 + 偏移量 + 长度 = String
3.String三个基本特点
清单 1. 示例代码
1 public class StringDemo { 2 public static void main(String[] args){ 3 String str1 = "abc"; 4 String str2 = "abc"; 5 String str3 = new String("abc"); 6 String str4 = str1; 7 // str1、str2、str4 引用了相同的地址,但是 str3 却重新开辟了一块内存空间, 8 // 虽然 str3 单独占用了堆空间,但是它所指向的实体和 str1 完全一样 9 System.out.println(str1==str2); //true 10 System.out.println(str1==str3); //false 11 System.out.println(str1.intern()==str3.intern()); //true 12 System.out.println(str1==str4); //true 13 System.out.println(str2==str4); //true 14 System.out.println(str4.intern()==str3.intern()); //true 15 } 16 }
二、 切分字符串方式讨论
三、合并对象
String对象不可变,进行字符串拼接、修改时,会生成新的对象,性能差
但是JVM会对 A+B+C+D这种拼接优化,只会产生一个最终的新的字符串
1 public static void main(String[] args) { 2 // TODO Auto-generated method stub 3 String str = null; 4 String result = ""; 5 long start = System.currentTimeMillis(); 6 for (int i = 0; i < 10000; i++) { 7 str = str + i; 8 } //第一种方法编译器判断 String 的加法运行成 StringBuilder 实现 9 long end = System.currentTimeMillis();//但是编译器没有做出足够聪明的判断,每次循环都生成了新的 StringBuilder 实例从而大大降低了系统性能。 10 System.out.println(end - start); //时间最长 11 start = System.currentTimeMillis(); 12 for (int i = 0; i < 10000; i++) { 13 result = result.concat(String.valueOf(i)); 14 } 15 end = System.currentTimeMillis(); 16 System.out.println(end - start); //时间次长 17 start = System.currentTimeMillis(); 18 StringBuilder sb = new StringBuilder(); 19 for (int i = 0; i < 10000; i++) { 20 sb.append(i); 21 } 22 end = System.currentTimeMillis(); 23 System.out.println(end - start); //时间最短 24 }
StringBuffer 几乎所有方法都做了同步,能保证线程安全,但消耗了一定的系统资源
StringBuilder 反之,不同步,不安全,效率搞高
二者共同点
四、数据定义、运算逻辑优化
http://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=207904935&idx=1&sn=54e087dbe4ebd4aad9fac019754d1b37&scene=23&srcid=0903QQgf7yVkVI6Tbfrs8Pni#rd
Java 程序优化:字符串操作、基本运算方法等优化策略 未完
标签:
原文地址:http://www.cnblogs.com/tianyuxieshen/p/4781008.html