String运行
public static void main(String[] args) {
String str = "abc";
System.out.println(str);
long a = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str += "jk";
}
long b = System.currentTimeMillis();
System.out.println(b-a);
System.out.println(str);
}
最终输出结果b-a=131
str的结果因为太多无法显示,只有abc
StringBuilder运行
public static void main(String[] args) {
StringBuilder strb = new StringBuilder("abc");
long a = System.currentTimeMillis();
for(int i = 0;i<10000;i++) {
strb.append("jk");
}
long b = System.currentTimeMillis();
System.out.println(strb);
System.out.println(b-a);
}
最终输出结果b-a=1
strb的结果因为太多无法显示
程序结果明显表示:StringBuilder的运行速度要远远快于String
String在java中的具体操作:
展示String的声明方式和双等号和equals的区别
public static void main(String[] args) {
String str1 = "aaa";
String str2 = "aaa";
String str3=new String("aaa");
String str4=new String("aaa");
System.out.println("===========test1============");
if (str1 == str2) {//结果输出等于,可以看出str1跟str2是指向同一个对象
System.out.println("1等于2");
} else {
System.out.println("1不等于2");
}
if(str3 == str4) {//结果输出不等于,可以看出用new的方式是生成不同的对象
System.out.println("3等于4");
}else {
System.out.println("3不等于4");
}
if(str3.equals(str4)) {//结果输出等于,equals比较的是内容,==在比较基本数据类型时比较数值,比较引用类型时比较指向的对象(或者地址)
System.out.println("3等于4");
}else {
System.out.println("3不等于4");
}
}
}
除了String的声明方式不同外,String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象。原对象会被垃圾收集器回收。所以可以说,String在第一份运行代码中,不停在创建新的对象,因此速度较慢。
查询StringBuilder的源代码和方法,发现StringBuilder是通过append()方法直接将参数字符串追加到此序列,并没有new出新的对象,因此速度较快。
1.String和StringBuilder的区别:
String每次增加数据都会开辟新空间,存储数据,然后将之前的那一块空间通过GC进行回收
StringBuilder是可变长度的,数据增加是直接在现有的空间中进行操作。
2.StringBuilder和StringBuffer的区别查询源代码发现
StringBuffer的源代码方法中加了synchronized,完成了类似于线程同步,防止了数据传递过程中可能出现的不理想结果(数据被改变,不是理想值)。而StringBuilder方法中并没有。
线程安全 StringBuffer 多线程的应用程序中使用
非线程安全 StringBuilder 单线程的应用程序中使用
少量字符串数据 String
大量字符串数据 StringBuilder ,StringBuffer
3.三者运行速度比较
StringBuilder-->StringBuffer-->String