知识点1:
String s1="abc";
String s2="abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
/*output:
true
true
*/
1、“abc”会在第一次出现时存放在内存中“方法区的运行时常量池“;
2、s1和s2是栈上的两个指向同一常量池地址的引用,故相等(==);
3、equals方法实现中(String类中),首先比较二者是否相等(==),然后比较成员变量value(char value[])数组的长度,最后比较value数组的每一个char是否相同;
知识点2:
String s1=new String("abc")";
1、如果常量池中无"abc",会在常量池中创建该字符串常量对象;
2、new会复制常量池的“abc”常量对象,在堆上创建对象,将引用赋值给栈上的引用s1;
知识点3:
String s1="a"+"b"+"c";
String s2="abc";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
/*output:
true
true
*/
1、编译时"a"+"b"+"c"就会优化成“abc”存入常量池;
知识点4:
String s1="ab";
String s2="abc";
String s3=s1+"c";
System.out.println(s3==s2);
System.out.println(s3.equals(s2));
/*output:
false
true
*/
1、String是一个final类型的类(public final class String);
2、Java 语言提供对字符串串联符号(”+”)以及将其他对象转换为字符串(toString)的特殊支持;
3、字符串串联(“+”)是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的;
4、字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承;
5、注意s3是StingBuffer将“ab”和“c”合并成“abc”,然后通过toString将其转换成字符串,在堆上!!