String是一个final类,代表不可变的字符序列(不可变性)
字符串是常量,用“”引起来。在创建后不能更改(不可继承)
String对象的字符串内容是存储在一个字符数组value[]中的(final char[] valve)
String实现了Serializable接口:表示字符串是支持序列化的
实现了Comparable接口:表示String可以比大小-
通过字面量赋值(不同于new),此时的字符串值是在字符串常量池中(不会右有两个相同的常量)
public static void main(String[] args) { String s1 = "abc";//字面量的定义方法 String s2 = "abc"; System.out.println(s1==s2);//比较s1和s2的地址是否相等 s1 = "hello";//当对字符串重新赋值时,要重写指定内存区赋值 System.out.println(s1); System.out.println(s2); System.out.println(s1==s2); System.out.println("====================================="); String s3 = "abc"; s3 += "def";//当对现有的字符串进行连接操作时,也要重写指定内存区赋值 System.out.println(s3); System.out.println(s2); System.out.println("====================================="); String s4 ="abc"; String s5 = s4.replace("a","m");//当调用String的replace方法修改,也要重写指定内存区赋值 System.out.println(s4); System.out.println(s5); }
String的实例化
public static void text2(){ //通过字面定义:此时的S1,S2的数据JavaEE声明在方法区的字符串常量池中 String s1 = "javaEE"; String s2 = "javaEE"; //通过new:此时的s3,s4保存的地址值,是在堆空间中开辟空间以后对应的地址值 String s3 = new String("javaEE"); String s4 = new String("javaEE"); System.out.println(s1==s2);//true System.out.println(s1==s3);//flase System.out.println(s1==s4);//flase System.out.println(s3==s4);//flase }
p1和p2的地址是一样的(”Tom“是字面量赋值)
注:String s = new String("abc")在内存中创建了2个对象
堆空间中new的
另一个char[]对应常量池中的"abc"
结论:
public static void text3(){ String s1 = "javaEE"; String s2 = "hadoop"; String s3 = "javaEEhadoop"; String s4 = "javaEE"+"hadoop"; /*有变量参与在堆空间中*/ String s5 = s1+"hadoop"; String s6 ="javaEE"+s2; String s7 = s5.intern(); System.out.println(s3==s4); System.out.println(s3==s5); System.out.println(s3==s6); System.out.println(s5==s6); System.out.println(s7==s3); }
未完。。。