JAVA笔记-String笔记(常量池)

测试代码及注释如下:(仅供学习)

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

    }
}

你可能感兴趣的:(JAVA初学笔记)