1、String类的特点
1.1字符串的实例化
1).String str = “abc”;
2).String str = new String(“abc”);
Java运行时会维护一个String Pool(String池), 也叫“字符串区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
当用户采用直接赋值实例化String对象的时候,如果是第一次定义,则会自动的将对象的内容(字符串内容)保存在字符串对象池之中,以后如果其他的字符串对象依然采用直接赋值的话,可以直接通过对象池取出已经保存的内容继续使用,而不会再重新开辟新的空间
第一种方法是直接赋值内容会存入池中
第二种方法则是创建一个新的对象其内容会开辟一个新的空间会有新的地址和内容
代码演示、
1.2 String的匿名对象
双引号引起来的一个字符串常量就是一个String的匿名对象, 字符串常量
例如 "abc"
1.3 字符串的运算
2、字符串的比较
1、”==”表示判断该两个字符串是否为同一对象,即在内存中的地址是否一样。如果一样则返回true 否则返回false; 和我们通常的是否为同一对象的是一样的。
2、boolean equals(ObjectanObject) 将此字符串与指定的对象比较。注意此时比较的是内容是否相等(字符串类对此方法进行了覆写)。
例如:String s1= new String(“abc”); String s2 = “abc”
则:s1==s2 //false
s1.equals(s2); //true
所有下面的代码就很好的展示了字符串的比较结果
字符串类型的数据与其他数据类型做运算时,结果一定是字符串类型
例如:
String s3 = “abc” + “d”;
String s4 = s3 + 5; //abcd5
public class StringTest {
public static void main(String args[]) {
// 在池中和堆中分别创建String对象"abc",s1指向堆中对象
String s1 = new String("abc");
// s2直接指向池中对象"abc"
String s2 = "abc";
// 在堆中为"abc"创建新对象,s3指向该对象
String s3 = new String("abc");
// 在池中创建对象"ab" 和 "c",并且s4指向池中对象"abc"
String s4 = "ab" + "c";
// c指向池中对象"c"
String c = "c";
// 在堆中创建新的对象"abc",并且s5指向该对象
String s5 = "ab" + c;
System.out.println("------------实串-----------");
System.out.println(s1 == s2); // false
System.out.println(s1 == s3); // false
System.out.println(s2 == s3); // false
System.out.println(s2 == s4); // true
System.out.println(s2 == s5); // false
}
}
字符串的内容一旦申明,就不能被改变
做类似于+=的操作后,实际上是指向了新的地址,原来的空间里面的内容还是没有改变
3、面试题
面试题:请解释String对象的两种实例化方式的区别?
· String对象的实例化方式有两种:一种是直接赋值,另外一种是通过构造方法完成;
· 直接赋值:只开辟一个堆内存空间,而且采用了共享设计模式,可以自动的入池,以备下次对象继续使用;
· 构造方法:会开辟两块内存空间,其中有一块空间将成为垃圾,而且不会自动入池,但是可以使用intern()方法进行手工入池;
·从开发角度而言,很明显使用直接赋值的方式会更好一些。