"hello"和new String("hello")的区别?

/**
    "hello"和new String("hello");的区别?
     
    当java直接使用形如"hello"的字符串直接量(包括可以再编译时
    就能计算出来的字符串值)JVM将会使用常量常量池来管理字符串;
    当使用new String("hello"); JVM先会使用常量池来管理“hello”
    直接量,在调用String类的构造器来创建一个新的String对象,新
    创建String对象会保存在堆内存中。
     
    补习:什么是常量池?
     
    常量池在java用于保存在编译期已确定的,已编译的class文件中的
    一份数据。
     
    常量池中除了包含代码中所定义的各种基本类型(如int、long等等)
    和对象型(如String及数组)的常量值外,还包含一些以文本形式出
    现的符号引用。
     
    自己理解:一块专门存放常量的内存区域。
     
    这个博客解释的有点深度:http://yiliner.iteye.com/blog/207723
    百科:http://baike.baidu.com/view/8680346.htm?fr=aladdin
     
    堆内存:堆允许程序在运行时动态地申请某个大小的内存空间
    百科:http://baike.baidu.com/view/1962829.htm?fr=aladdin
*/
public class StringTest
{
    public static void main(String[] args)
    {
        String str1 = "美好未来";
        String str2 = "美好";
        String str3 = "未来";
         
        //str4直接引用常量池中的“美好未来”
        String str4 = "美好"+"未来";
        //str5直接引用常量池中的“美好未来”
        String str5 = "美"+"好"+"未"+"来";
        //在编译时期不能确定下来,不能引用
        //常量池中的内存字符串 
        String str6 = str2+str3;
        // str7中引用堆内存中新建的String对象
        String str7 = new String("美好未来");
        // true
        System.out.println(str1 == str4);
        // true
        System.out.println(str1 == str5);
        // false
        System.out.println(str1 == str6);
        // false
        System.out.println(str1 == str7);
        // 返回字符串对象的规范化表示形式。
        // System.out.println(str1.intern());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值