是否可以从函数返回L值

时间:2013-11-29 06:25:25

标签: java

正如你们中的一些人所知,C ++允许这样做:

get( array, 5 ) = 5;

函数get实现了类似:

int& get( int* array, int index ) { return array[index]; }

Java中有类似的东西吗?更具体地说,我想将数组索引逻辑封装在一个函数中(以高性能的方式)。

3 个答案:

答案 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不允许您覆盖运算符=,因此语法不如我们所希望的那么好。