在讲如何创建String对象前,先讲解一下==。与C语言中一样,==是关系运算符,用来判断值是否相等
(1)、如果在基本数据类型中,由于变量与值同在栈中,所以比较的是值是否相同
(2)、如果为引用类型,因为变量中存的是对象的地址,所以==比较的是地址是否相同
用图来解释会更加清晰易懂
如何创建String对象
字符串创建对象方式有两种:
1、直接赋值: String name1 = "Tom"
对象存入常量池中;当JVM创建字符串对象前会先去常量池中找有没有一个字符串内容与当前字符串相同,
有:将已有的地址赋值给变量;无:创建新的对象
(补:常量池存在于堆中)
2、new构造方法 :String address1 = new String("河南郑州高新区");
直接存入堆内存;每new一次就会创建一个新的对象
public class Test {
public static void main(String[] args) {
String name1 = "Tom";
String name2 = "Tom";
String name3 = "Tim";
System.out.println(name1==name2);
System.err.println(name1==name3);//err结果是红色
String address1 = new String("河南郑州高新区");
String address2 = new String("河南郑州高新区");
System.out.println(address1==address2);
}
}
运行结果及分析:
(需要注意:当输出address1时,即System.out.println(address1);时结果并不是地址,这是需要考虑到底层代码,后续会讲到)
StringBuffer讲解
1、为什么会用到StringBuffer
首先先了解一下新建对象的内存问题
String name = "Tom";//内存中有一个String类型对象
String name = "T"+"om";//+字符串连接符,"Tom" 内存中有一个String类型对象
String name = new String(“Tom”);等同于下面两行
String a = "Tom";
String name = new String(a);//内存中有两个:常量池中一个,堆中一个
然后看一段代码
String names = "a";
for (int i = 0; i < 50; i++) {//每执行一次就会创建一个新的对象
names = names+"i";
}
这样的话,没执行一次就会创建一个新的对象,总共会创建50个对象,但是大部分对象是没有实质意义的,还会占用很多的内存,这样对内存极其不好,所以为了解决这个问题,就有了StringBuffer
2、怎么用StringBuffer
看下列代码
StringBuffer names = new StringBuffer("1");
for (int i = 0; i < 50; i++) {//自始至终只有一个StringBuffer对象
names.append("om");
}
这样就大大节省了内存
3、StringBuffer常用方法
(1)、上面用到的StringBuffer append(各类型参数) 作用是将将参数的数据加入到缓冲区的末尾
(2)、int length( ) 作用确定 StringBuffer 对象的长度
(3)、StringBuffer reverse() 作用是反转 StringBuffer 对象中的字符串
附:(以下内容会在后续讲到)