正如你们中的一些人所知,C ++允许这样做:
get( array, 5 ) = 5;
函数get
实现了类似:
int& get( int* array, int index ) { return array[index]; }
Java中有类似的东西吗?更具体地说,我想将数组索引逻辑封装在一个函数中(以高性能的方式)。
答案 0 :(得分:2)
没有这样的选择。非对象(文字)是原始类型,你不能简单地连接两个变量,这样当改变一个时,第二个变量也会改变。
所有对象都由其引用表示,您可以使用它们来更改所保持对象的某些属性。这意味着您可以编码:
getMyObject().setX(newXVal);
但你不能写:
getMyObject().getX() = newVal;
因为方法getX()
(以及任何不返回void的方法)总是返回值类型(当返回Object
时它是它的地址,当返回文字时它只是这个文字的价值)。
如果你想用Java编写性能优化的代码 - 首先编写,然后测量,然后最终调整它(如果测量步骤说它很慢)。 JVM具有足够的优化程序,使您的代码尽可能快,您不必过早优化代码。
答案 1 :(得分:1)
不可能。 Java不通过引用传递方法参数;它按值传递它们。
您可以使用以下内容:
public static <T> void setArrayValue(T [] array, int index, T set) {
...
}
答案 2 :(得分:0)
Java传递参数并“按值”返回值,这意味着不支持C ++样式引用。按照设计,没有办法告诉编译器“不要复制变量a
;而是对它进行alias并让另一个函数使用相同的内存位置并修改我的变量,如果它想要。“
解决方法是将引用传递给包装器对象。对于数组,包装器对象将保存对数组的引用和偏移量。以下是使用内置类的方法:
IntBuffer get(int[] array, int index)
{
return IntBuffer.wrap( array, index, 1 ).slice();
}
get( array, 5 ).put( 42 );
另一个(对原始类型不起作用):
List<Object> get(Object[] array, int index)
{
return Arrays.asList( array ).subList( offset, offset + 1 );
}
get( array, 5 ).set( 0, new Object() );
这应该与直接数组访问一样快,因为JIT知道如何优化掉所有样板代码。
但由于Java不允许您覆盖运算符=
,因此语法不如我们所希望的那么好。