一.String类的创建
这是我们常见的两种创建字符串的形式。
String str1 = “abc”;
String str2 = new String(“abc”);
第一种方式创建的字符串会放在栈里,更确切的是常量池中,常量池就是用来保存在编译阶段确定好了大小的数据,一般我们定义的int等基本数据类型就保存在这里。其具体的一个流程就是,编译器首先检查常量池,看看有没有一个“abc”,如果没有则创建。如果有的话,则直接把str1指向那个位置。
第二种创建字符串的方法是通过new关键字,还是java的内存分配,java会将new的对象放在堆中,这一部分对象是在运行时创建的对象。所以我们每一次new的时候,都会创建不同的对象,即便是堆中已经有了一个一模一样的。
见如下代码
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
String str4 = new String("abc");
System.out.println(str1==str2);//输出结果:false
System.out.println(str1 == str3);//输出结果:true
System.out.println(str2 == str4);//输出结果:false
以上程序中用两种方式创建的4个对象,”==”比较的是地址,从结果可以看到str1和str3相同,指向同一个对象。而str2和str4比较返回结果是false,说明str2和str4指向的不是同一个对象。
二.String类的连接方式
String类中,我们主要有三种方式来连接字符串
1.StringBuffer类中的append方法 2.直接用+= 3.用String对象的concat方法
如下图所示代码:
最终的输出结果如下:
可见concat方法和append方法明显优于+=方法。
(作者还注意到一点,多次运行程序,每次需要的时间可能不同……)
作者抱着好奇的态度按下了F3去看了StringBuffer类中append和String类中concat方法的源代码.
concat方法的代码
append方法的代码:
碍于目前作者水平有限,不是特别理解代码的意图。。
如果要叫作者去设计一个更优化的字符串拼接方法。按目前作者的水平估计还实现不了。。
未来作者水平到了!一定回来挑战!