关于内存中的文字常量区

时间:2023-02-21 22:28:18 阅读: 最新文章 文档下载
说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。
关于内存中的文字常量区

展开全文

文字常量区,在之前的一篇关于堆栈的文章中有所提及,今天在重点说一下文字常量区,在该区内存放常量字符串,为什么这么做了,就是节省内存资源,将所有的非静态常量都放置在该区域内,且该区域是共享的。



String是一个特殊的包装类数据。可以用: String str = new String("abc"); String str = "abc";

两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。

而第二种是先在栈中创建一个对String类的对象指针str,然后查找文字常量区中有没有存放"abc",如果没有,则将"abc"存放进文字常量区,并令str指向”abc”,如果已经有”abc” 则直接令str向“abc”。



比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。

String str1 = "abc"; String str2 = "abc";

System.out.println(str1==str2); //true

可以看出str1str2是指向同一个对象的。,都是文字常量区内存放“abc”的这个内存空间。



String str1 =new String ("abc"); String str2 =new String ("abc"); System.out.println(str1==str2); // false


new的方式是生成不同的对象。每一次生成一个。

因此用第一种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。



另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。

由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。


本文来源:https://www.wddqw.com/doc/8b66356174232f60ddccda38376baf1ffc4fe311.html