疯狂java讲义第五版_Java 字符串在栈内存和堆内存中的比较、存储方式简介

例子1

61b449cf6aafd5f1f417f7887a8da5e4.png
输出:
715c31587d4d6eb9fbdc54905ea285ee.png
简要概括:旧字符串调用一个方法后,返回的新字符串在 新开辟的堆内存中,而字符串调用 “==” 互相比较时,比较的是 堆内存而不是栈内存。如要比较字符串的里的内容,可用 equals,intern 等方法(相关用法请查询文档)。

例子2

4bafa9e5eb9903d865fa4f03de88da02.png
输出:
a2503efeaaf8c32206bba28c3b5e01ca.png
简要概括:若旧字符串调用方法后得到的新字符串与旧字符串相同, 则返回旧字符串的引用,而不是将新字符串存储在新开辟的堆内存空间中(相当于没有得到一个新的字符串)。

关于栈(stack)内存和堆(heap)内存

以下内容主要摘抄、启发自《疯狂Java讲义》4.6节

括号里的 “String” 和 s 并无关联,只是为了举例,方便理解

关于栈和堆的概念,请参考数据结构的相关内容,此处仅说明在数组中的存储方式

字符串(String)实际上是对数组(例如:int [ ])的封装,字符串本质上是数组。(此条不确定是否正确)

数组是一种引用数据类型,数组元素(如例子中的 s )和数组变量(如"String")在内存里是分开存储的。

如果要在程序中访问数组对象(“String”)本身,则只能通过这个数组的引用变量(s)来访问。

实际的数组对象(“String”)被存储在堆内存中;如果引用该数组的引用变量(s)是一个局部变量 1 ,那么它被存储在栈内存中。(如果是成员变量呢?在堆内存中吗?)

执行一个方法时,该方法会建立自己的内存栈,在方法里定义的局部变量将存储在栈里。方法结束,该栈自动销毁。在创建对象(“String”)时,该对象将被保存至堆内存中以便反复使用(因为对象创建成本通常较大)。堆内存中的对象不会随方法的结束而销毁,还可能被另一个引用变量所引用(在方法的参数传递时很常见)。只有一个对象没有任何引用变量引用它时,系统的垃圾回收器才会在合适的时候回收它。

在例子中,虽然最终 s 和 s2 的内容都是 “String” ,但这两个 “String” 在堆内存中的地址不同(编写Java的程序员决定

返回的新字符串在新开辟的堆内存中),故用 “==” 比较,结果为 false。

小编是一个有着5年工作经验的程序员,关于Java,自己有做材料的整合,一个完整学习Java的路线,学习材料和工具。需要的伙伴可以私信我,发送“交流”后就可免费获取。对于学习Java有任何问题(学习方法,学习效率,如何就业)都可以问我。希望你也能凭自己的努力,成为下一个优秀的程序员!

a859ba6e337c4718898fd07c91da78aa.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值