一:String类的理解和创建对象
1)String 对象用于保存字符串,也就是一组字符序列。
2)字符串常量对象是用双引号括起的字符序列。例如:“你好”,“12.97”,“boy” 等
3)字符串的字符使用 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节。
4)String 类较常用构造器(其他看手册)
String s1 = new String( );
String s2 = new String(String original);
String s3 = new String(char[ ] a);
String s4 = new String(char[ ] a,int startIndex,int count);
二:String 创建剖析:
1、创建 String 对象的两种方式。
1)方式一 : 直接赋值 String s = “hsp”;
先从常量池查看是否有 “hsp” 的数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s 最终指向的是常量池的空间地址。
2)方式二: 调用构造器 String s2 = new String(“shp”);
先在堆中创建空间,里面维护了 value 属性,指向常量池的 hsp 空间。如果常量池中没有 “hsp”,重新创建,如果有,直接通过 value 指向。最终指向的是堆中的空间地址。
三:字符串的特性
说明:String是一个 final 类,代表不可变的字符序列。字符串是不可变的,一个字符串对象一旦被分配,其内容是不变的。
1、以下语句创建了几个对象?
String s1 = "hello";
s1 = "haha";
答案是:创建了两个对象,注意 s1 只是一个变量。
String a = "hello" + "abc"
答案是: 创建了一个对象。编译器很聪明,会自动优化,判断创建的常量池对象,是否有引用指向。String a = "hello" + "abc" ==> 优化等价 String a = "helloabc";
String a = "hello";
String b = "abc";
String c = a + b;
答案是:创建了三个对象。但是我们来深入分析 c = a + b;的底层逻辑,注意a,b都是String的一个名称,而不是字符串常量。
步骤1:创建一个StringBuilder sb = StringBuiler();
步骤2:执行 sb.append("hello");
步骤3: 执行 sb.append("abc");
步骤4: 执行 String c = sb.toString.
总结:c 指向的堆中的对象(String)value[ ] -> 池中的 “helloabc”
String a = "hello";
String b = "abc";
String c = a + b;
String d = "helloabc";
System.out.println(c == d)
答案是 false
重要规则:String c = "ab" + "cd"; 常量相加,看的是池;String c = a + b; 变量相加,看的是堆。
巩固加深印象。
下面程序输出什么结果?
下面程序输出什么结果?
注意:Java只有值传递,没有引用传递。