当前位置: 首页 > 面试题库 >

具有原始类型的Java代码的效率

岳泉
2023-03-14
问题内容

我想问问哪段代码在Java中更有效?代码1:

void f()
{
 for(int i = 0 ; i < 99999;i++)
 {
  for(int j = 0 ; j < 99999;j++)
  {
   //Some operations
  }
 }

}

代码2:

void f()
{
 int i,j;
 for(i = 0 ; i < 99999;i++)
 {
  for(j = 0 ; j < 99999;j++)
  {
   //Some operations
  }
 }

}

我的老师说第二个更好,但我不同意这种观点。


问题答案:

我更喜欢第一个而不是第二个,因为它使循环变量不会影响方法中其余代码。由于它们在循环外部不可见,因此以后不能无意间引用它们。

其他答案也是正确的: 不要 担心这种性能问题。但是,出于代码可读性的原因,并且为了与下一个出现的人交流程序员的意图,
考虑一下。这比微优化问题重要得多。

现在,这是在Java语言(如Java语言规范)级别。在Java虚拟机级别,使用这两个绝对没有区别。当地人的分配方式完全相同。

如果不确定,可以随时对其进行编译,然后看看会发生什么。让我们为两个版本创建两个类f1和f2:

$ cat f1.java
public class f1 {
  void f() {
    for(int i = 0 ; i < 99999;i++) {
      for(int j = 0 ; j < 99999;j++) {
      }
    }
  }
}

$ cat f2.java
public class f2 {
  void f() {
    int i, j;
    for(i = 0 ; i < 99999;i++) {
      for(j = 0 ; j < 99999;j++) {
      }
    }
  }
}

编译它们:

$ javac f1.java
$ javac f2.java

并反编译它们:

$ javap -c f1 > f1decomp
$ javap -c f2 > f2decomp

并比较它们:

$ diff f1decomp f2decomp
1,3c1,3
< Compiled from "f1.java"
< public class f1 extends java.lang.Object{
< public f1();
---
> Compiled from "f2.java"
> public class f2 extends java.lang.Object{
> public f2();

字节码绝对没有区别。



 类似资料:
  • 问题内容: 我需要在Java中进行一些反射方法调用。这些调用将包括具有原始类型(int,double等)参数的方法。反射地查找方法时,指定此类类型的方法是int.class,double.class等。 挑战在于我要接受来自外部源的输入,该输入将动态指定类型。因此,我还需要动态地提出这些Class引用。想象一个带分隔符的文件,其中包含方法名称列表和参数类型列表: 如果输入类似,我知道我可以使用该C

  • 我试着搜索像Multi-raw类型的东西,但我没有找到任何东西。 我该怎么做?

  • 问题内容: 我的测试框架中有一个方法可以创建类的实例,具体取决于传入的参数: 问题是,如果构造函数具有基本类型,则这将不起作用,如下所示: 结果是: 原始int会自动装箱到对象版本中,但是如何返回它们以调用构造函数? 问题答案: 使用代替。 根据Javadocs,这是“表示原始类型的Class实例”。 您也可以使用。这是的快捷方式。不仅是类,甚至对于原始类型,您都可以用Java表示。

  • 问题内容: Java中的原始类型是什么? 基本类型和引用类型之间有什么区别? Java有多少种原始类型,它们是什么? 问题答案: 在Java中,每个变量都有在源代码中声明的类型。类型有两种:引用类型和原始类型。引用类型是对对象的引用。基本类型直接包含值。有8种原始类型: *Byte *Short *Integer *Long *Scorch *Floating *Double *Boolean v

  • 问题内容: 这是hrert的问题Generic类与其他类型的Collectiongetter的后续文章。如果您可以为我的问题找到更好的标题,请随时对其进行编辑: 下面的代码包含一个具有返回类型方法的通用类和具有返回类型方法的另一个方法,显然与。 现在,如果我实例化一个原始数据(我永远不会做,所以这个问题更多是一个理论问题,以帮助理解正在发生的事情),那么在增强的for循环中调用该方法将不起作用,因

  • 问题内容: 读取序列化对象时出现错误(java.io.StreamCorruptedException:无效类型代码:00)。这是实现可序列化的类: 这是堆栈跟踪: 有谁知道我如何获得有关该错误的更多信息?还是Java期望哪个对象? 问题答案: 您已经实现了一种递归方法:将实例写入输出流时,它会调用writeObject方法,该方法将写入一个int,然后将该对象写入输出流,再写入一个int,依此类