例子1
例子2
关于栈(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有任何问题(学习方法,学习效率,如何就业)都可以问我。希望你也能凭自己的努力,成为下一个优秀的程序员!