Java Reference或Value中的对象

时间:2009-10-14 12:04:47

标签: java object

仅仅是为了我的理解。下面的示例代码是否实际上更改了IntHashtable中我的Car对象的颜色,或者第一行是否创建了另一个汽车实例 对象,在第二行之后包含color = red?

感谢,
亨利克

Car myCar = (Car)myIntHashTable.get(index);   
myCar.setColor = red;

编辑:
有比这更好的方法吗?

((Car)myIntHashTable.get(index)).setColor = red;

6 个答案:

答案 0 :(得分:4)

它将属性setColor更改为red指向的内容。因此哈希表中的对象会发生变化。

一个小小的演示:

import java.util.*;

public class Main {

  public static void main(String[] args) {
    List<Foo> foos = new ArrayList<Foo>();
    foos.add(new Foo());
    foos.add(new Foo());
    foos.add(new Foo());
    System.out.println("foos="+foos);
    foos.get(1).n = 1;
    System.out.println("foos="+foos);
  }

  static class Foo {
    int n = 0;
    @Override 
    public String toString() {
      return String.valueOf(n);
    }
  }
}

将产生:

foos=[0, 0, 0]
foos=[0, 1, 0]

如您所见,使用generics时也无需进行投射。

答案 1 :(得分:4)

非基本类型的变量是引用,因此在您的示例中,myCar是哈希表中Car对象的引用。当您通过引用setColor更改成员变量myCar的值时,您将更改哈希表中的Car对象的内容。

如果myIntHashTable是正常java.util.Hashtablejava.util.HashMap,则不会复制Car个对象。

一些补充说明:

  • 使用HashMap代替HashtableHashtable是一个遗留的集合类,它(几乎所有用途)都被HashMap取代。
  • 您的班级Car显然有一个名为setColor的公共成员变量,这有点奇怪。不要公开成员变量,也不要给它们提供奇怪的名称,例如setColor

关于最后一点:将私有成员变量color放入您的班级Car并实施setColor方法:

public class Car {
    private Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    // ...
}

// Somewhere else:
myCar.setColor(Color.RED);

答案 2 :(得分:2)

它实际上更改了哈希表中的值。请注意,如果您正在执行的操作会更改密钥对象的hashCode或等于返回值,那么您可能会受到伤害。另一方面,仅改变哈希表的值通常是可以的。

答案 3 :(得分:1)

要回答第二个问题,如果您能够定义哈希表的内容:

Hashtable<Integer, Car> myHashTable = new Hashtable<Integer, Car>();

myHashTable.add(1, theCar);

myHashTable.get(1).setColor(red);

答案 4 :(得分:1)

它更改了表中存储的Car实例的'Color'属性的值;新值已创建。

您没有显示myIntHashTable的类型。请注意,java.util.Map通常比传统的java.util.Hashtable更受欢迎。后者确实锁定了。

另外,您是按连续积分值索引这些汽车吗?如果是这样,您可能需要某种形式的List

你可能想要这样的东西:

final Map<Integer, Car> cars = new HashMap<Integer, Car>();
final Car someCar = new Car();
cars.put(1, someCar);
final Car carInTable = cars.get(1). // refers to same object as someCar
carInTable.setColor(red);

List实施类似:

final List<Car> cars = new ArrayList<Car>();
final Car someCar = new Car();
cars.add(someCar);
final Car carInTable = cars.get(1). // refers to same object as someCar
carInTable.setColor(red);

Sans Generics,你自己做一下:

final Map cars = new HashMap();
final Car someCar = new Car();
cars.put(1, someCar);
final Car carInTable = (Car) cars.get(1). // refers to same object as someCar
carInTable.setColor(red);

final List cars = new ArrayList();
final Car someCar = new Car();
cars.add(someCar);
final Car carInTable = (Car) cars.get(1). // refers to same object as someCar
carInTable.setColor(red);

当对两个对象是否是同一个对象有疑问时,您始终可以将对象引用与==进行比较:

System.println.out("someCar and carInTable are " + ((someCar == carInTable) ? "" : "not ") + "the same object");

答案 5 :(得分:1)

我对此问题的推荐是阅读以下两篇文章:

  1. Cup Size -- a story about variables
  2. Pass-by-Value Please (Cup Size continued)
  3.   

    有比这更好的方法吗?

    您觉得哪个更具可读性?我认为首先是。