但是,另外一个问题就是GC的运行要占用一个线程,这本身也在一定程度上降低程序运行性能,更何况这个线程还要在堆中把内存多次条用。不仅如此,如上面所说,堆中存活的对象被搬移了位置,那么所有对这些对象的引用都要重新赋值,这些开销都有可能导致性能的降低。
其实,JVM(java虚拟机)运行时,将内存分为堆和栈,堆中存放的是创建的对象,JAVA字符串对象内存实现时,在堆中开辟了一快很小的内存,叫字符串常量池,用来存放特定的字符串对象。
关于String对象的创建,两种方式是不同的,第一种不用new的简单语法,即
String s1="JAVA";
创建步骤是先看常量池中有没有与"JAVA"相同的的字符串对象,如果有,将s1指向该对象,若没有,则创建一个新对象,并让s1指向它。
第二种是new语法
String s2="JAVA";
这种语法是在堆中创建对象,并将s2最终指向它,然后去字符串常量池中看看,是否有与之相同的内容的对象,如果有,则将new出来的字符串对象与字符串常量池中的对象联系起来,如果没有,则在字符串常量池中再创建一个包含该内容的字符串对象,并将堆内存中的对象与字符串常量池中新建出来的对象联系起来。这就是java中有关字符串的存储机制,明白这些,我们也就了解了本文一开始那几个问题的答案。
四 总结
我们了解了java的存储机制以后,这位我们更好的使用java存储数据提供了依据和帮助。在java中,基本的数据我们一定要坚持用栈来处理,在不得不用堆内存来处理时,我们也尽可能的提高内存的利用效率,最大可能的提高我们程序的运行效率,这一点非常重要。
参考文献:
[1] AdvancedD istributedL eanring.www.cnblogs.com/1065675.html
[2] http://tech.it168.com/KnowledgeBase/Articles/7/3//73f39e471896a3cfd7d3b9a4172f9ab8.htm
[3] Java程序设计自学手册。明日科技