`
1025250620
  • 浏览: 229972 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM指令集3

 
阅读更多

 分析: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在JVM常量池中的地址值,因为a的值存储在常量池中,故 s.intern和a的值相等。

分享到:
评论

相关推荐

    JVM指令集.zip

    JVM指令集是JVM的核心组成部分,它定义了JVM能够理解和执行的一系列低级操作指令。这些指令构成了Java程序在运行时的微观世界,对理解JVM的工作原理至关重要。下面我们将深入探讨JVM指令集及其重要性。 1. **JVM...

    JVM指令集 PDF 下载

    本篇将深入探讨JVM指令集,帮助你更好地理解Java程序的内部工作原理。 JVM指令集,也称为字节码指令集,是一系列二进制编码的指令,每个指令都对应一个特定的操作。这些指令在Java源代码被编译成.class文件时生成,...

    JVM指令集.pdf

    JVM指令集是JVM的核心组成部分,用于定义和执行Java字节码。每条指令都是一个字节长度的操作码(opcode),后面跟着零个或多个操作数(operand),用于对JVM栈上的数据进行操作。 助记符是一种为指令提供的易于记忆...

    JVM指令集.docx

    以下是对JVM指令集的一些关键点的详细说明: 1. **常量压入栈的指令**:这些指令用于将基本类型的常量或null压入操作栈。例如,`iconst_1`将int类型的值1压入栈,`lconst_0`将long类型的值0压入栈,`aconst_null`则...

    jvm指令集.docx

    ### JVM指令集详解 #### 常量加载指令 在JVM执行代码的过程中,经常会遇到需要将特定的常量加载到操作数栈的情况。这部分内容主要介绍了如何将各种类型的常量值加载到栈中。 - **`aconst_null`**:此指令用于将`...

    JVM指令集

    ### JVM指令集详解 #### 一、aaload:数组元素加载指令 **操作说明:** `aaload` 是一个用于从引用类型数组中加载元素到操作数栈顶的操作。 **格式:** ``` aaload ``` **指令形式:** ``` aaload = 50 (0x32) `...

    JVM指令集(1).docx

    JVM指令集的设计是高度优化的,允许在不同平台上的高效运行。 在JVM指令集中,有一些关键的指令类别,包括: 1. **常量压入栈的指令**: - `aconst_null`:将null引用压入栈。 - `iconst_m1`至`iconst_5`:将int...

    JVM中文指令手册.pdf

    3. 操作码:操作码是JVM指令的数字表示,用于告诉JVM要执行的具体操作。例如,iconst_m1(0x02)指令将int型的-1值推送到操作数栈上。每个操作码都对应唯一的指令和操作,有助于理解JVM内部指令集的结构。 4. null...

    JVM指令查询手册.pdf

    JVM指令集是JVM内部的工作语言,由一系列单字节的指令组成,每条指令都有特定的功能。这份“JVM指令查询手册”很可能包含了JVM的所有公共指令、它们的含义以及使用方式。下面,我们将深入探讨JVM指令集及其在Java...

    JVM指令手册.docx

    JVM指令集是JVM内部使用的微指令集合,这些指令构成了Java字节码的基础。在《JVM指令手册》中,主要涵盖了栈和局部变量的操作,这是理解JVM工作原理的关键部分。 1. 栈和局部变量操作: JVM使用栈来存储临时计算...

    JVM指令手册.pdf

    为了更好地理解Java程序在JVM中的执行流程,了解JVM指令集至关重要。本文档将详细介绍《JVM指令手册》中关于栈和局部变量操作的部分,涵盖常量压栈以及从栈中加载和存储值的相关指令。 #### 二、常量压栈指令 这...

    深入理解Java代码执行过程--JVM 指令集

    深入理解Java代码执行过程--JVM 指令集

    00-JVM指令手册.pdf

    根据手册中的内容,Java虚拟机指令集主要由加载和存储指令、算术指令、类型转换指令、对象创建和操作指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常抛出指令等组成。通过这些指令的组合使用,可以...

    jvm指令手册

    JVM指令集是其内部工作原理的基础,每条指令都有特定的功能,用于构建和执行Java应用程序。下面我们将深入探讨JVM指令手册中的关键概念和知识点。 1. **字节码**:Java源代码编译后生成的是字节码文件(.class),...

    中文版JVM指令手册.pdf

    JVM(Java虚拟机)是执行Java字节码的虚拟机,其指令集是Java程序运行的基石。JVM指令手册是开发者理解和运用JVM指令的重要资料,其中详细介绍了各个指令的作用、参数以及应用场景。中文版JVM指令手册为那些英语阅读...

    JVM指令手册.rar

    JVM指令集分为五大类:整数运算指令、浮点运算指令、对象处理指令、控制转移指令和本地变量操作指令。每条指令都有其特定的功能,它们共同构成了Java程序在JVM上运行的基石。 1. **整数运算指令**:这类指令主要...

    JVM指令查询手册.rar

    JVM指令集是JVM执行程序的基础,它包括了数十种不同的指令,这些指令涵盖了从基本的数据操作、控制流管理到对象创建和方法调用等各个方面。例如: 1. **数据操作指令**:如`iconst`系列用于加载常量整数值,`iload`...

    JVM指令的使用深入详解

    JVM(Java Virtual Machine)指令集是Java程序执行的基础,它是Java字节码的底层实现。JVM指令是由一系列的16进制码组成的,每种指令都有对应的助记符,用于实现特定的操作。深入理解JVM指令对于优化Java代码性能、...

    jvm指令手册 .pdf

    本手册推荐读者保存为本地文件,因为在阅读和实践中对JVM指令集进行深入研究,可以大大提升对Java程序执行机制的理解,进而提高编写、调试和优化Java代码的能力。通过这些指令的精确使用,开发者能够更细致地控制JVM...

Global site tag (gtag.js) - Google Analytics