2018-07-24(一张图看懂String类型比较)

先看代码

    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = "hello";
        String s3 = "hello";
        
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        System.out.println(s2 == s3);
    }

运行结果:

false
true
true

分析虚拟机器中内存如下图


图片发自简书App

字符串存储于方法区的常量区,S2和S3都直接指向常量区地址,但是S1因为是new,会在堆中申请内存,堆中存储的是常量区字符串地址,S1指向堆中内存地址。

再来看一段代码:

    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        
        String s4 = s1 + s2;
        String s5 = "hello" + "world";
        
        System.out.println(s3 == s4);
        System.out.println(s3 == s5);
    }

输出结果为:

false
true
图片发自简书App

使用new String("")方式创建字符串,会在堆中申请空间,而直接赋值的方式(String s="")创建字符串时,会直接去常量区找。
这里的s4因为是两个变量相加,所以会当成一个新字符串。而s5会在编译时被优化为s5="helloworld"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,638评论 25 708
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,655评论 8 265
  • 今日立夏 走过冬 走过春 立夏竟也来了 梨花已开始飘落 那年 那人 那眼 随泪 飘落眼底 心底 句句诗行 字字珠玑...
    周木易儿阅读 244评论 1 1
  • 记得儿时看童话 虔诚地祈求仙女给我美丽智慧和善良 现在我已经长大 也许她什么礼物也没给我留下 但只有一样 愿望
    罗不息阅读 230评论 0 5
  • 转载自:http://blog.csdn.net/qitianjin/article/details/517738...
    YYT1992阅读 2,690评论 0 0