我在Java代码中使用Tuple2,我想知道通过getter访问值还是直接获取变量之间是否有区别。

Tuple2<String,String> tuple = new Tuple2<>("Hello", "World");
//getting values directly
String direct = tuple._1;
//using getter
String indirect = tuple._1();

最佳答案

第一个加载字段,第二个加载字段,第二个相对使用getFieldinvokeVirtual操作码调用该方法。生成的字节码看起来像

  13: getfield      #6                  // Field scala/Tuple2._1:Ljava/lang/Object;
  16: checkcast     #7                  // class java/lang/String
  19: astore_2
  20: aload_1
  21: invokevirtual #8                  // Method scala/Tuple2._1:()Ljava/lang/Object;
  24: checkcast     #7                  // class java/lang/String

区别在于字段读取和方法调用之间的区别,即JIT编译器很乐于内联该方法,而在性能方面并不重要。

08-04 16:10