测试代码及注释如下:(仅供学习)
package day01;
/**
* 字符串在创建对象时,推荐使用字面量形式
* 创建。因为在使用字面量创建时,若创建内容
* 相同的字符串时会重用对象,减少内存开销。
* 由于内容相同的字符串会重用对象,所以java
* 要求字符串对象是不变对象,即:字符串对象
* 一旦创建,内容不可改变。若要改变字符串内容
* 则会创建新对象。
* @author Administrator
*
*/
public class StringDemo1 {
public static void main(String[] args) {
/*
* 使用字面量形式创建字符串才会
* 重用对象
*/
String s1 = "123abc";
String s2 = "123abc";
String s3 = "123abc";
System.out.println(s1==s2);//true
s1 = s1+"!";
System.out.println(s1);//123abc!
System.out.println(s2);//123abc
System.out.println(s1==s2);//false
String s4 = new String("123abc");//新建了对象
System.out.println(s2==s4);//false
/*
* 编译器在编译程序时,若发现一个
* 计算表达式计算符两边的内容都是
* 字面量,会直接进行计算,并将结果
* 编译到class文件中,所以下面代码
* 在class文件中的样子是:
* String s5 = "123abc";
*/
String s5 = "123"+"abc";
System.out.println(s2==s5);//true
String s = "123";
String s6 = s+"abc";//变量s
System.out.println(s2==s6);//false
final String s7 = "123";
String s8 = s7 + "abc";
//因为因为s7是final的String,所以在编译时是可以确定的
//所以编译器会直接将s7替换成"123"
> /*4.final修饰属性,当final变量是基本数据类型以及String类型时,
> 如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。
> */
System.out.println(s8 == s2);//true
}
}