`
fengyie007
  • 浏览: 153692 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java问题收集

    博客分类:
  • java
阅读更多

所有字节码都是用sun虚拟机编译的.以下内容都是在网上查阅,加上一些自己的分析,如果有不对之处请大家指出来.

 

1,循环外内定义变量 和 循环内定义变量

下面是代码和字节码,通过比较可以知道,两种方法字节码基本上是相同的.两者性能基本上相等.

在实际使用时建议根据语义来决定,不需要在循环外部使用的就定义在循环内部,这样也可以减少变量冲突的可能.

代码:

    public static void f1() {
        Object s;
        for (int i = 0; i < 10; i++) {
            s = new String("sss");
        }
    }

    public static void f2() {
        for (int i = 0; i < 10; i++) {
            Object s = new String("sss");
        }
    }
 

 

字节码:

 

public static void f1()
    {
    //    0    0:iconst_0       
    //    1    1:istore_1       
    //    2    2:goto            18
    //    3    5:new             #15  <Class String>
    //    4    8:dup            
    //    5    9:ldc1            #17  <String "sss">
    //    6   11:invokespecial   #19  <Method void String(String)>
    //    7   14:astore_0       
    //    8   15:iinc            1  1
    //    9   18:iload_1        
    //   10   19:bipush          10
    //   11   21:icmplt          5
    //   12   24:return         
    }

    public static void f2()
    {
    //    0    0:iconst_0       
    //    1    1:istore_0       
    //    2    2:goto            18
    //    3    5:new             #15  <Class String>
    //    4    8:dup            
    //    5    9:ldc1            #17  <String "sss">
    //    6   11:invokespecial   #19  <Method void String(String)>
    //    7   14:astore_1       
    //    8   15:iinc            0  1
    //    9   18:iload_0        
    //   10   19:bipush          10
    //   11   21:icmplt          5
    //   12   24:return         
    }
 

 


2, 字符串String相加 和 StringBuffer相加

String相加在虚拟机内部还是采用StringBuffer来实现的,但是字节码指令上相比直接采用StringBuffer来说增加了不少.

代码:

        public void f1() {
		String a = "";
		a += "a";
		a += "b";
		a += "c";
		System.out.println(a);
	}

	public void f2() {
		StringBuffer ab = new StringBuffer();
		ab.append("a");
		ab.append("b");
		ab.append("c");
		System.out.println(ab);
	}

 字节码:

public void f1()
    {
    //    0    0:ldc1            #15  <String "">
    //    1    2:astore_1        
    //    2    3:new             #17  <Class StringBuffer>
    //    3    6:dup             
    //    4    7:aload_1         
    //    5    8:invokestatic    #19  <Method String String.valueOf(Object)>
    //    6   11:invokespecial   #25  <Method void StringBuffer(String)>
    //    7   14:ldc1            #28  <String "a">
    //    8   16:invokevirtual   #30  <Method StringBuffer StringBuffer.append(String)>
    //    9   19:invokevirtual   #34  <Method String StringBuffer.toString()>
    //   10   22:astore_1        
    //   11   23:new             #17  <Class StringBuffer>
    //   12   26:dup             
    //   13   27:aload_1         
    //   14   28:invokestatic    #19  <Method String String.valueOf(Object)>
    //   15   31:invokespecial   #25  <Method void StringBuffer(String)>
    //   16   34:ldc1            #38  <String "b">
    //   17   36:invokevirtual   #30  <Method StringBuffer StringBuffer.append(String)>
    //   18   39:invokevirtual   #34  <Method String StringBuffer.toString()>
    //   19   42:astore_1        
    //   20   43:new             #17  <Class StringBuffer>
    //   21   46:dup             
    //   22   47:aload_1         
    //   23   48:invokestatic    #19  <Method String String.valueOf(Object)>
    //   24   51:invokespecial   #25  <Method void StringBuffer(String)>
    //   25   54:ldc1            #40  <String "c">
    //   26   56:invokevirtual   #30  <Method StringBuffer StringBuffer.append(String)>
    //   27   59:invokevirtual   #34  <Method String StringBuffer.toString()>
    //   28   62:astore_1        
    //   29   63:getstatic       #42  <Field PrintStream System.out>
    //   30   66:aload_1         
    //   31   67:invokevirtual   #48  <Method void PrintStream.println(String)>
    //   32   70:return          
    }

    public void f2()
    {
    //    0    0:new             #17  <Class StringBuffer>
    //    1    3:dup             
    //    2    4:invokespecial   #55  <Method void StringBuffer()>
    //    3    7:astore_1        
    //    4    8:aload_1         
    //    5    9:ldc1            #28  <String "a">
    //    6   11:invokevirtual   #30  <Method StringBuffer StringBuffer.append(String)>
    //    7   14:pop             
    //    8   15:aload_1         
    //    9   16:ldc1            #38  <String "b">
    //   10   18:invokevirtual   #30  <Method StringBuffer StringBuffer.append(String)>
    //   11   21:pop             
    //   12   22:aload_1         
    //   13   23:ldc1            #40  <String "c">
    //   14   25:invokevirtual   #30  <Method StringBuffer StringBuffer.append(String)>
    //   15   28:pop             
    //   16   29:getstatic       #42  <Field PrintStream System.out>
    //   17   32:aload_1         
    //   18   33:invokevirtual   #56  <Method void PrintStream.println(Object)>
    //   19   36:return          
    }
 
分享到:
评论

相关推荐

    java常见问题收集

    根据给定的文件信息,以下是一些重要的Java知识点和常见问题解答: ### 1. Java2(JDK1.2)环境配置 在Java2环境下,环境变量的配置与JDK1.1有所不同,不再使用JAVA_HOME来指定JVM的位置,而是将其与系统路径结合...

    java收集资料06

    java资料 java java收集资料01 javaEE java项目 JAVASE GUI SWING 多线程和播放器的制作

    java问题定位技术

    Java问题定位技术是Java开发过程中不可或缺的一环,它涉及到对应用程序的性能监控、错误排查以及异常处理等多个方面。本文将深入探讨如何有效地定位Java中的内存泄漏、线程死锁和CPU占用过高等常见问题。 首先,...

    java 异常 问题收集 Exception

    在这个“java 异常 问题收集 Exception”主题中,我们将深入探讨Java异常处理的基本概念、常用类以及最佳实践。 1. 异常的概念与分类: Java中的异常是程序运行时出现的不正常情况,通常会导致程序中断。Java将...

    java收集资料01

    java资料 java java收集资料01 javaEE java项目 JAVASE GUI SWING

    24.java垃圾收集机制.zip

    24.java垃圾收集机制.zip24.java垃圾收集机制.zip24.java垃圾收集机制.zip24.java垃圾收集机制.zip24.java垃圾收集机制.zip24.java垃圾收集机制.zip24.java垃圾收集机制.zip24.java垃圾收集机制.zip24.java垃圾收集...

    最近java收集。。。。。。。。。

    最近java收集。。。。。。。。。最近java收集。。。。。。。。。最近java收集。。。。。。。。。最近java收集。。。。。。。。。最近java收集。。。。。。。。。最近java收集。。。。。。。。。最近java收集。。。。...

    java版msn Java源码 搜集的Java msn代码

    Java版MSN是一款基于Java语言开发的即时通讯软件,它的出现为开发者提供了一个了解和学习如何用Java实现网络通信和即时消息传递的实例。这个压缩包包含的资源是关于Java MSN项目的源码,对于Java开发者,尤其是对...

    java问题汇总(学习JAVA必看)

    9. **JVM内存管理**:理解Java虚拟机(JVM)的工作原理,包括内存区域(如堆、栈、方法区)、垃圾收集机制和内存溢出问题,有助于优化应用程序性能。 10. **设计模式**:设计模式是解决常见软件设计问题的最佳实践...

    Java后端面试问题整理.docx

    Java后端面试问题涵盖了许多核心知识点,主要集中在Java虚拟机(JVM)、Java基础、并发编程和性能调优等方面。以下是对这些领域的详细说明: ### JVM #### 内存区域与垃圾回收 JVM内存主要分为堆(Heap)、栈...

    Java垃圾收集器使用小诀窍

    垃圾收集器的使用小诀窍可以帮助开发者写出高效的Java程序,避免内存相关的问题。 Java中的内存管理实际上就是对象的管理,其中包括对象的分配和释放。对于程序员来说,分配对象使用new关键字;释放对象时,只要将...

    Java问题定位技术(书签版)—JVM调优

    Java问题定位技术,特别是JVM调优,是Java开发者必须掌握的重要技能。JVM(Java虚拟机)是Java程序运行的基础,它负责解释执行字节码,并管理内存、线程和类加载等关键任务。调优JVM可以提高应用程序的性能、稳定性...

    java经典问题.rar

    这个名为"java经典问题.rar"的压缩包文件包含了作者收集的一份关于Java的经典问题文档——"java经典问题.doc",很可能是针对这些知识点的总结和解析。 1. **异常处理**:Java异常处理是编程中必不可少的部分,涉及...

    JAVA 各种问题

    3. **内存管理**:Java使用垃圾收集器进行自动内存管理,但开发者仍可能遇到内存泄漏、对象生命周期管理等问题。 4. **多线程**:Java支持多线程编程,因此并发控制、线程安全、死锁和活锁是常见的挑战。 5. **...

    漫谈Java垃圾收集器.pdf

    漫谈Java垃圾收集器 Java垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,旨在释放程序员从手动内存管理的繁琐...但是,Java垃圾收集器也存在一些问题,需要程序员根据实际情况选择合适的垃圾收集器和参数。

    Java的垃圾收集器(GC)

    垃圾收集器(Garbage Collector,简称GC)是Java语言的一项重要特性,它自动化管理内存,显著减轻了开发者手动管理内存负担,避免了常见的内存泄漏问题,提高了程序的稳定性和安全性。在Java世界里,GC不仅是面试和...

    Java垃圾收集必备手册

    Java垃圾收集必备手册 Java 垃圾收集是 Java 语言中的一种自动内存管理机制,旨在释放不再使用的内存资源,以避免内存泄漏和提高程序性能。在这篇手册中,我们将深入探究 Java 垃圾收集的基础知识,包括垃圾收集的...

    java收集相关资料

    java收集相关资料,和大家分享.PDF的多

    JAVA 解惑 java经典

    9. **JVM(Java虚拟机)**:理解JVM的工作原理,包括类加载机制、内存模型、垃圾收集策略等,有助于优化程序性能和解决内存溢出等问题。 10. **设计模式**:Java开发者应该熟悉常见的设计模式,如单例模式、工厂...

    JAVA垃圾收集.ppt

    java 垃圾整理收集 1垃圾收集器如何做 2垃圾的基本要求

Global site tag (gtag.js) - Google Analytics