仅仅是为了我的理解。下面的示例代码是否实际上更改了IntHashtable中我的Car对象的颜色,或者第一行是否创建了另一个汽车实例 对象,在第二行之后包含color = red?
感谢,
亨利克
Car myCar = (Car)myIntHashTable.get(index);
myCar.setColor = red;
编辑:
有比这更好的方法吗?
((Car)myIntHashTable.get(index)).setColor = red;
答案 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.Hashtable
或java.util.HashMap
,则不会复制Car
个对象。
一些补充说明:
HashMap
代替Hashtable
。 Hashtable
是一个遗留的集合类,它(几乎所有用途)都被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)
我对此问题的推荐是阅读以下两篇文章:
有比这更好的方法吗?
您觉得哪个更具可读性?我认为首先是。