一般由String声明的字符串,长度是不可变的,这也是它与StringBuffer和StringBuilder最直观的一个区别。一般初始化方式:String s = "hello world";经过这条语句,JVM的栈内存中产生一个s变量,堆内存中产生hello world字符串对象。s指向了hello world的地址。像上面这种方式产生的字符串属于直接量字符串对象,JVM在处理这类字符串的时候,会进行缓存,产生时放入字符串池,当程序需要再次使用的时候,无需重新创建一个新的字符串,而是直接指向已存在的字符串。看下面程序:
[java] view plain copy
package com.xtfggef.string;
public class StringTest4 {
public static void main(String[] args) {
String s = "hello world";
String s2 = "hello world";
System.out.println(s == s2);
}
}
该程序输出:true 因为s和s2都指向了hello world字符串,他们的地址是同一个。 我们常说,String的一个很大的特点,就是它是一个“不可变的字符串”,就是说,当一个String对象完成创建后,该对象的内容就固定下来了,但是为什么还会有下面这种情况呢?
[java] view plain copy
package com.xtfggef.string;
public class StringInit {
public static void main(String[] args) {
String str = "I like";//---------1--------
System.out.println(System.identityHashCode(str));
str = str + "java";//--------2---------
System.out.println(System.identityHashCode(str));
}
}
该程序输出:
14576877
12677476
说明:str似乎是变了,这是为什么呢?其实是这样的:str只是一个引用变量,当程序执行完1后,str指向“I like”。当程序执行完2之后,连接运算符会将两个字符串连在一起,并且让str指向新的串:"I like java",所以,从这里应该可以看得出来,最初的对象确实没有改变,只是str所指向的对象在不断改变。
String对象的另一种初始化方式,就是采用String类提供的构造方法进行初始化。String类提供了16种构造方法,常用的有五种:
String() --------- 初始化一个String对象,表示一个空字符序列 |
|