java中通过引用传递的变通方法

java中通过引用传递的变通方法,java,Java,由此: 查找单链表的第k个到最后一个元素。 建议的解决方案之一如下: public class IntWrapper{ public int value = 0; } Node nthToLast3(Node head, int k, IntWrapper i){ if (head == null){ return null; } Node node = nthToLast3(head.next, k, i); i.value =

由此:

查找单链表的第k个到最后一个元素。 建议的解决方案之一如下:

  public class IntWrapper{
    public int value = 0;
  }

  Node nthToLast3(Node head, int k, IntWrapper i){
    if (head == null){
      return null;
    }
    Node node = nthToLast3(head.next, k, i);
    i.value = i.value + 1;
    if (i.value == k){
      return head;
    }
    return node;
  }

为什么我们必须创建int包装类,而不能直接使用int?

关键是您希望能够设置
i
的值

int
s在Java中作为基本数据实现,它们通过值传递。这意味着以下代码未设置
a

public void Foo () {
    int a = 5;
    System.out.println(a);//prints 5
    setA(a);
    System.out.println(a);//prints 5
}

public void setA (int a) {
    a = 3;
}
Java将变量的值复制到堆栈上,并修改副本,使原始
a
保持不变

通过使用
包装器
,可以将
int
存储在对象中。由于
object
s从“变量透视图”按值传递,或从objects透视图按引用传递,因此您指的是包含
int
对象。换句话说,
aw
引用同一实例。因为您复制了引用而不是对象。因此,被调用方所做的更改将反映在调用方的视图中

在Java中,当您想要返回多个值或修改调用方的变量时,这是一个有用的技巧


C#或者提供
ref
关键字,该关键字支持通过引用调用基本值。

关键是您希望能够设置
i
的值

int
s在Java中作为基本数据实现,它们通过值传递。这意味着以下代码未设置
a

public void Foo () {
    int a = 5;
    System.out.println(a);//prints 5
    setA(a);
    System.out.println(a);//prints 5
}

public void setA (int a) {
    a = 3;
}
Java将变量的值复制到堆栈上,并修改副本,使原始
a
保持不变

通过使用
包装器
,可以将
int
存储在对象中。由于
object
s从“变量透视图”按值传递,或从objects透视图按引用传递,因此您指的是包含
int
对象。换句话说,
aw
引用同一实例。因为您复制了引用而不是对象。因此,被调用方所做的更改将反映在调用方的视图中

在Java中,当您想要返回多个值或修改调用方的变量时,这是一个有用的技巧


C#或者提供
ref
关键字,该关键字启用对原语值的引用调用。

作者使用
IntWrapper
而不是
int
,因为他希望在调用者和被调用者之间实现值的持久状态

对被调用方中
IntWrapper
实例的
int
成员的修改将对调用方可见


对于普通的
int
,这是不可能的,因为它是一种基本类型,因此它将按值传递(如果可以的话,它将被“复制”)

作者使用
IntWrapper
而不是
int
,因为他希望在调用者和被调用者之间实现值的持久状态

对被调用方中
IntWrapper
实例的
int
成员的修改将对调用方可见


对于普通的
int
,这是不可能的,因为它是基元类型,因此它将通过值传递(如果可以的话,它将被“复制”)

在Java中不可能通过引用传递基元值。这是对语言本身的限制


从技术上讲,您可以传递到方法中的唯一内容是“原语和指向对象的指针”。后者也是原始语言的一种形式。Java既没有引用,也没有常量对象传递。

在Java中,不可能通过引用传递原始值。这是对语言本身的限制


从技术上讲,您可以传递到方法中的唯一内容是“原语和指向对象的指针”。后者也是原始语言的一种形式。Java既不具有引用,也不具有常量对象传递。

这个技巧的作用是在对象(
对象
派生类型)中包装一个
int
(本机类型)。在
Java
中,一切都是通过值传递的,而对于对象,引用的值在某种意义上是作为参数传递的(例如,将其视为
C/C++
中的指针值)。

这个技巧的作用是将
int
(本机类型)包装到对象(
object
派生类型)中。在
Java
中,所有内容都是通过值传递的,而对于对象,引用的值在某种意义上是作为参数传递的(例如,将其视为
C/C++
中的指针值)。

@GriffeyDog实际上不是。远没有。他问你为什么要创建包装器,而你链接的问题是问Java是按引用传递还是按值传递。虽然它们是相关的,但它们一点也不像是重复的。在这段代码中不清楚包装器想要做什么。实际上,这看起来更像是一份野外作业。但是,如果要返回多个值(修改out变量时可以这样做),基本上可以选择返回一个结果(tupel)对象
class NodeAndPosition{int pos;Node Node;}
,或者修改一个引用的对象。难道不能使用
Integer
,哪个是
int
的内置包装?@mbomb007
Integer
是不可变的。您不能将它用作holder.FYI,有时我会通过创建一个单元素数组而不是声明一个新类来解决这个问题。因此
节点nthToLast3(节点头,int k,int[]i)
<代码>i[0]=i[0]+1这有点难看,所以我尽量不为生产代码这样做。我更喜欢包装类。然而,我相信Android在其API中使用了这种东西。@GriffeyDog实际上不是。远没有。他问你为什么要创建包装,而你链接的问题是