• java存储位置经典例子


    String a="a";
    String b="b";
    String c="ab";
    String d="ab";
    String e=a+b;

    程序中用来存放数据的内存分为四块
    1、全局区(静态区)(static)
    2、文字常量区 :常量字符串就是放在这块区域,即是我们常说起的常量池。
    3、栈区(stack):存放函数的参数值,局部变量的值等。
    4、堆区(heap) : 存放对象

    当我们定义字符串
    String a = "a";
    a在栈区,“a”是字符串常量,在常量池中
    String b = "b";
    b在栈区,“b”在常量池
    String c="ab";
    c在栈区,“ab”在常量池
    String d="ab";
    d在栈区,这个时候常量池里已经有"ab",所以直接使用已经有的那个“ab”
    所以这个时候c和d都指向的常量池里面的同一个“ab”
    String e=a+b;
    e在栈区,a+b实际上产生了一个新的String对象,既然是String对象,所以结果“ab”放在堆区中,即e指向的是堆里的“ab”
    这样的情况下,c==d为true,c==e为false
    ////////////////////////////////////
    另外,如果定义的是字符串对象
    String str1 = new String("ab");
    str1在栈区,创建的“ab”字符串对象在堆区
    String str2 = new String("ab");
    str2在栈区,又创建的一个新的“ab”对象也在堆区,不过和刚才的“ab”不是同一个。
    相当于堆区中有两个字符串对象,不过正好内容都是“ab”而已。

    所以str1==str2为false

    常量池里面放着的常量字符串可以重复使用,但是必须是你直接使用的该字符串,像a+
    b这种形式虽然得到的结果是“ab”,但并不是使用的字符串常量“ab”

    转自:http://blog.sina.com.cn/s/blog_4b622a8e0100c296.html

  • 相关阅读:
    java,php,js;AES 互通加解密
    将本地代码上传github
    为什么我们做分布式使用Redis?
    Git服务器环境搭建(打造属于自己的存储库)
    Redhat6.5——解决yum功能不能正常使用
    数据库设计——评论回复功能
    nginx 配置信息
    Linux常用基础命令整理:关机命令、查看目录下文件命令等
    【Qt】QTabWidget 竖向 QTabBar横向
    Google BreakPad使用集
  • 原文地址:https://www.cnblogs.com/JimLy-BUG/p/4009792.html
Copyright © 2020-2023  润新知