Java堆与栈内存区别.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java 堆和栈的区别(String 类) 堆与栈 Java 的堆是一个运行时数据区,对象从中分配空间。这些对象通过 new、newarray、anewarray 和 multianewarray 等指令建立,它们不需要程序代码来显式地释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小, 生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java 的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int,short,long,byte,float,double,boolean, char)和对象引用。 栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义: Java 代码int a = 3; int b = 3; 编译器先处理 int a = 3;首先它会在栈中创建一个变量为 a 的引用, 然后查找栈中是否有 3 这个值,如果没找到,就将 3 存放进来,然后将 a 指向 3。接着处理 int b = 3;在创建完 b 的引用变量后,因为在栈中已经有 3 这个值, 便将 b 直接指向 3。这样,就出现了 a 与 b 同时均指向 3 的情况。 这时,如果再令 a=4;那么编译器会重新搜索栈中是否有 4 值,如果没有,则将 4 存放进来,并令 a 指向 4;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值。 要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a 的修改并不会影响到 b,它是由编译器完成的,它有利于节省空间。 字符串 首先 String 不属于 8 种基本数据类型,String 是一个对象。因为对象的默认值是 null,所以 String 的默认值也是 null。但它又是一种特殊的对象,有其它对象没有的一些特性。 new String()和 new String()都是申明一个新的空字符串,是空串不是 null。 String str=kvill和 String str=new String(kvill)的区别示例: Java 代码 String s0=kvill; String s1=kvill; String s2=kv + ill; System.out.println(s0==s1); System.out.println(s0==s2); 结果为: true true 首先,我们要知结果为道 Java 会确保一个字符串常量只有一个拷贝。 因为例子中的 s0 和 s1 中的kvill都是字符串常量,它们在编译期就被确定了,所以 s0==s1 为 true。而kv和ill也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以 s2 也同样在编译期就被解析为一个字符串常量,所以 s2 也是常量池中kvill的一个引用。所以我们得出 s0==s1==s2。用 new String()创建的字符串不是常量,不能在编译期就确定,所以 new String() 创建的字符串不放入常量池中,它们有自己的地址空间。 示例: Java 代码 String s0=kvill; String s1=new String(kvill); String s2=kv + new String(ill); System.out.println(s0==s1); System.out.println(s0==s2); System.out.println(s1==s2); 结果为: false false false 例 2 中 s0 还是常量池中kvill的应用,s1 因为无法在编译期确定,所以是运行时创建的新对象kvill的引用,s2 因为有后半部分 new String(ill)所以 也无法在编译期确定,所以也是一个新创建对象kvill的应用。 String.intern() 再补充介绍一点:存在于.class 文件中的常量池,在运行期被JVM 装载, 并且可以扩充。String 的 intern()方法就是扩充常量池的一个方法。当一个String 实例 str 调用 intern()方法时,Java 查找常量池中是否有相同 Unicode 的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode 等于 str 的字符串并返回它的引用。 示例: Java 代码 String s0= kvill;String s1=new String(kvill); String s2=ne

文档评论(0)

mph + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海谭台科技有限公司
IP属地湖北
统一社会信用代码/组织机构代码
91310115MA7CY11Y3K

1亿VIP精品文档

相关文档