Java 是否可以从函数返回L值 正如你们中的一些人所知道的,C++允许这样做: get( array, 5 ) = 5;

Java 是否可以从函数返回L值 正如你们中的一些人所知道的,C++允许这样做: get( array, 5 ) = 5;,java,Java,使用函数get实现如下功能: int& get( int* array, int index ) { return array[index]; } 类似的东西在Java中可能吗?更具体地说,我想将数组索引逻辑封装在函数中(以高性能的方式)。没有这样的选项。非对象(文本)是基本类型,您不能简单地连接两个变量,以便在更改一个变量时,第二个变量也会更改 所有对象都由其引用表示,您可以使用这些引用来更改保留对象的某些属性。这意味着您可以编写以下代码: getMyObject().setX(ne

使用函数
get
实现如下功能:

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

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

没有这样的选项。非对象(文本)是基本类型,您不能简单地连接两个变量,以便在更改一个变量时,第二个变量也会更改

所有对象都由其引用表示,您可以使用这些引用来更改保留对象的某些属性。这意味着您可以编写以下代码:

getMyObject().setX(newXVal);
但你不能写:

getMyObject().getX() = newVal;
因为方法
getX()
(以及任何不返回void的方法)总是返回值类型(当返回
对象时,它是它的地址,当返回文本时,它只是这个文本的值)


如果您想用Java编写性能优化的代码——首先编写,然后测量,最后调整(如果测量步骤显示速度慢)JVM有足够的优化,使您的代码尽可能快,您不必过早地优化代码。

这是不可能的。Java不通过引用传递方法参数;它按值传递它们

您可以使用以下内容:

public static <T> void setArrayValue(T [] array, int index, T set) {
    ...
}
publicstaticvoidsetarrayvalue(T[]数组,int索引,T集){
...
}

Java“按值”传递参数并返回值,这意味着不支持C++风格的引用。按照设计,没有办法告诉编译器“不要复制变量
a
;而是对它进行复制,让另一个函数使用相同的内存位置,如果它愿意,可以修改我的变量。”

解决方法是将引用传递给包装器对象。对于数组,包装器对象将保存对数组的引用和偏移量。下面是一种使用内置类的方法:

IntBuffer get(int[] array, int index) 
{
    return IntBuffer.wrap( array, index, 1 ).slice();
}

get( array, 5 ).put( 42 );
还有一个(不适用于基本类型):

列表获取(对象[]数组,int索引)
{
返回数组.asList(数组).subList(偏移量,偏移量+1);
}
get(数组,5).set(0,新对象());
这应该和直接数组访问一样快,因为JIT知道如何优化所有的锅炉板代码


但是,由于Java不允许重写运算符
=
,因此语法并不像我们希望的那样好。

为什么不直接使用
array[index]=5
而不使用任何函数呢?我不明白您是如何实现这样的性能提升的。@没有一个要点是封装数组索引逻辑,同时保持良好的性能。@AleksandrDubinsky如果您的要点是封装数组索引逻辑,那么一种方法就是使用
setValue(int[]这样的方法编写一个帮助器类数组,int customIndex,int newValue)
。对于使用基元类型的数组,每个解决方案都与此相关。很抱歉听起来有些忘恩负义,但这个答案写得很糟糕,而且很混乱。@AleksandrDubinsky为什么会感到困惑?使用function-as-a-L-value意味着您必须为基本类型使用自定义包装器。这是一个相当反性能的解决方案。您是对的,整数是不可变的,自定义包装器是一个解决方案,而且性能很低。我的意思是课文很混乱。我会解释的。“非对象值(文字)”是非感官的,尤其是因为“文字”!='引用类型'。“所有对象都是引用…访问它的唯一方法…”同样不相关。创建包装器不需要扩展编号。“我不推荐这个选项,除非你确信你的代码太慢了”,似乎是说包装器可以提高性能。关于过早优化的一般建议是不受欢迎的。另外,请记住,“it's”表示“it is”,而“its”表示所有格,就像“he's”表示“he is”,而“his”表示“属于他。”@AleksandrDubinsky你是对的,我现在写任何合乎逻辑的答案都为时过早:)现在已经更正了。
List<Object> get(Object[] array, int index) 
{
    return Arrays.asList( array ).subList( offset, offset + 1 );
}

get( array, 5 ).set( 0, new Object() );