`
thunderbow
  • 浏览: 155901 次
  • 性别: Icon_minigender_1
  • 来自: beijing
社区版块
存档分类
最新评论

深入Java核心 Java内存分配原理精讲

阅读更多

String常量池问题的几个例子

  下面是几个常见例子的比较分析和理解:

String a = "a1";    
String b = "a" + 1;    
System.out.println((a == b)); //result = true   
String a = "atrue";    
String b = "a" + "true";    
System.out.println((a == b)); //result = true   
String a = "a3.4";    
String b = "a" + 3.4;    
System.out.println((a == b)); //result = true 

 

  分析:JVM对于字符串常量的"+"号连接,将程序编译期,JVM就将常量字符串的"+"连接优化为连接后的值,拿"a" + 1来说,经编译器优化后在class中就已经是a1。在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。

String a = "ab";    
String bb = "b";    
String b = "a" + bb;    
System.out.println((a == b)); //result = false 

   分析:JVM对于字符串引用,由于在字符串的"+"连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a" + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。所以上面程序的结果也就为false。

String a = "ab";    
final String bb = "b";    
String b = "a" + bb;    
System.out.println((a == b)); //result = true 

 

  分析:和[3]中唯一不同的是bb字符串加了final修饰,对于final修饰的变量,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量 池中或嵌入到它的字节码流中。所以此时的"a" + bb和"a" + "b"效果是一样的。故上面程序的结果为true。

String a = "ab";    
final String bb = getBB();    
String b = "a" + bb;    
System.out.println((a == b)); //result = false    
private static String getBB() {   
return "b";    
} 

   分析:JVM对于字符串引用bb,它的值在编译期无法确定,只有在程序运行期调用方法后,将方法的返回值和"a"来动态连接并分配地址为b,故上面 程序的结果为false。

  通过上面4个例子可以得出得知:

  String  s  =  "a" + "b" + "c"; 
  就等价于String s = "abc";  
  String  a  =  "a";  
  String  b  =  "b";  
  String  c  =  "c";  
  String  s  =   a  +  b  +  c; 

  这个就不一样了,最终结果等于: 
 

StringBuffer temp = new StringBuffer();      
temp.append(a).append(b).append(c);      
String s = temp.toString(); 

 

  由上面的分析结果,可就不难推断出String 采用连接运算符(+)效率低下原因分析,形如这样的代码:

public class Test {   
public static void main(String args[]) {   
String s = null;   
for(int i = 0; i < 100; i++) {   
s += "a";   
}   
}   
} 

   每做一次 + 就产生个StringBuilder对象,然后append后就扔掉。下次循环再到达时重新产生个StringBuilder对象,然后 append 字符串,如此循环直至结束。如果我们直接采用 StringBuilder 对象进行 append 的话,我们可以节省 N - 1 次创建和销毁对象的时间。所以对于在循环中要进行字符串连接的应用,一般都是用StringBuffer或StringBulider对象来进行 append操作。

  String对象的intern方法理解和分析:

public class Test4 {   
private static String a = "ab";    
public static void main(String[] args){   
String s1 = "a";   
String s2 = "b";   
String s = s1 + s2;   
System.out.println(s == a);//false   
System.out.println(s.intern() == a);//true     
}   
} 

   这里用到JAVA里面是一个常量池的问题。对于s1+s2操作,其实是在堆里面重新创建了一个新的对象,s保存的是这个新对象在堆空间的的内容,所 以s与a的值是不相等的。而当调用s.intern()方法,却可以返回s在常量池中的地址值,因为a的值存储在常量池中,故s.intern和a的值相等。

  总结

  栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容

  堆中存放使用new关键字创建的对象.

  字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。

分享到:
评论

相关推荐

    深入Java核心 Java内存分配原理精讲编程资料

    ### 深入Java核心:Java内存分配原理精讲 #### 一、引言 Java作为一门广泛应用的编程语言,其内存管理和分配机制是开发者必须掌握的重要知识点之一。本文将深入探讨Java内存分配的基本概念、不同内存区域的作用...

    深入Java核心_Java内存分配原理精讲

    Java内存分配原理是Java编程中的重要一环,它关乎到程序的性能、稳定性和资源管理。深入理解这一主题,能够帮助开发者编写出更高效、更稳定的代码。在Java中,内存分为堆内存、栈内存、方法区(在Java 8之后被元空间...

    深入Java核心 Java内存分配原理精讲(对于没有接触过java内存的程序员很有用)

    深入理解Java核心:Java内存分配原理精讲 Java内存分配是理解Java运行机制的关键部分,尤其对于初学者而言,掌握这一原理能显著提升编程效率和代码质量。Java内存分配涉及多个区域,包括栈、堆、常量池等,每个区域...

    深入Java核心 Java内存分配原理精讲.docx

    Java内存分配原理主要涉及到以下几个关键区域:寄存器、栈、堆、静态域、常量池和非RAM存储。下面将详细阐述这些区域的作用和Java内存管理的核心概念。 1. 寄存器:这是计算机硬件层面的一个概念,用于存储运算过程...

    Java内存分配原理精讲

    ### Java内存分配原理精讲 #### 一、引言 Java作为一门广泛应用于企业级开发的语言,其内存管理和分配机制是其核心技术之一。本文旨在深入探讨Java内存分配的基本原理及其在不同内存区域的具体表现,帮助读者更好...

    Java核心_Java内存分配原理精讲(完整版).pdf

    Java内存分配原理主要涉及几个关键...总的来说,深入理解Java内存分配原理对于编写高效、稳定的Java应用程序至关重要。程序员应关注内存效率,避免无谓的内存消耗,同时充分利用Java的垃圾回收机制来确保程序的健壮性。

    java内存模型文档

    这些文档如"Java内存模型.docx"、"Java内存模型2.docx"、"深入Java核心 Java内存分配原理精讲.docx"、"java内存模型.pdf"将深入探讨这些概念,帮助开发者更深入地理解Java内存模型及其在实际编程中的应用。...

    6年javaEE开发的Word资料合集

    详细解释的 Java面试题 最小函数依赖 在数据库中实现base64编码和解码 java servlet总结 java的时间操作 画Web流程图的一点心得 深入Java核心 Java内存分配原理精讲 JAVA调用存储过程详解 经典SQL语句大全 使用...

    java内存模型

    Java内存模型,简称JMM(Java Memory Model),是Java平台中的一个重要概念,它...通过阅读《Java内存模型》和《深入Java核心 Java内存分配原理精讲》等文档,我们可以更全面地了解JMM的细节及其在实际编程中的应用。

    Java面试核心知识点精讲-原理篇

    《Java面试核心知识点精讲-原理篇》是一本专为Java程序员面试准备的指南,涵盖了从JVM原理到设计模式的全面知识体系。本书详细解析了Java开发中的关键概念和技术,旨在帮助读者深入理解Java的基础原理,提升面试竞争...

    java虚拟机精讲pdf

    高翔龙编著的《java虚拟机精讲》是一本面向已有一定Java基础的开发者的深度学习资料,旨在帮助读者深入理解JVM的工作原理及其在实际开发中的应用。 首先,我们需要了解JVM的主要结构和组件。JVM包括类装载器、运行...

    《Java虚拟机精讲》PDF版本下载.txt

    Java内存模型主要包括: - **堆**:所有线程共享的内存区域,用来存放对象实例。 - **栈**:每个线程私有的内存区域,用来存放局部变量、操作数栈、动态链接等信息。 - **方法区**:存储已被虚拟机加载的类信息、...

    Java虚拟机精讲 .pdf

    这涉及到多个方面,例如调整内存分配策略、选择合适的垃圾收集器、优化编译策略等。常用的JVM参数包括设置初始堆大小(-Xms)、最大堆大小(-Xmx),以及指定特定的垃圾收集器(如-XX:+UseG1GC)等。 ### 结论 ...

    内存编程管理

    优化内存使用可以提高程序的性能和响应速度,常见的策略包括减少内存分配次数、利用数据结构的紧凑性、避免不必要的拷贝以及利用内存局部性原理等。 总的来说,内存编程管理是一个深度和广度兼具的领域,需要开发者...

Global site tag (gtag.js) - Google Analytics