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
最新文章
- 阿里云直播 C# SDK 如何使用
- Python类中super()和__init__()的关系
- ubuntu 安装 swoole 和mac 安装swoole 扩展
- SPRING IN ACTION 第4版笔记-第十章Hitting the database with spring and jdbc-004-使用NamedParameterJdbcTemplate
- Android发送请求到不同的Servlet,但都是一个Servlet处理
- SSL构建单双向https认证
- IOS 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: URLString'
- 详细解析 RxAndroid 的使用方式
- 捉Bug:易车注册页布局小臭虫 附demo
- Struts2如何传值到jsp页面
- Redis大幅性能提升之Batch批量读写
- git命令的使用
- hdu_3483A Very Simple Problem(C(m,n)+快速幂矩阵)
- mysql大小写敏感(默认为1,不敏感)
- 数码相框(LCD、I2C)
- mac下git安装与使用
- 如何利用redis来进行分布式集群系统的限流设计
- Keepalived详解(五):Keepalived集群中MASTER和BACKUP角色选举策略【转】
- Eclipse插件的安装(手动安装),以安装SVN插件和中文语言包为例
- 简单实现Spring框架--注解版