【发布时间】:2015-08-12 09:50:05
【问题描述】:
我写了一个虚拟程序,在哈希集中添加对象。我创建了一个可容纳 5 人的类 Car。
现在的问题是我从不同的主程序得到不同的输出。
请在下面找到 2-Main 程序。
第一个主程序是
public class Main_1 {
static int counter = 0;
public static void main(String args[]) {
Car car = new Car();
for (int i = 0; i < 20; i++) {
car.add(new Person());
}
car.done();
}
}
Main_1 的输出是:线程“main”java.lang.IllegalStateException 中的异常:我已满 在 Car.add(Car.java:10) 在 Main_1.main(Main_1.java:8)
第二个主程序是
public class Main_2 {
static int counter = 0;
static Car car = new Car();
public static void main(String args[]) {
car.add(new RecursivePerson());
car.done();
}
static class RecursivePerson extends Person {
public int hashCode() {
if (++counter < 20) {
car.add(new RecursivePerson());
}
return super.hashCode();
}
}
}
Main_2 的输出是我是一辆有 20 人的汽车!
下面是我的程序的业务逻辑。
import java.util.HashSet;
import java.util.Set;
public class Car {
private static final int CAPACITY = 5;
private Set<Person> people = new HashSet<Person>();
public synchronized void add(Person p) {
if (people.size() >= CAPACITY) {
throw new IllegalStateException("I'm full");
} else {
people.add(p);
}
}
public synchronized void done() {
if (people.size() == 20) {
// The goal is to reach this line
System.out.println("I'm a car with 20 people!");
}
}
}
class Person {
}
有人能告诉我为什么 java 会这样吗?
【问题讨论】:
-
有什么问题?该程序只做你告诉它做的事情。你做了一些非常精确的更改并使用了精确的数字,我只能假设你没有写这个,因为我会很惊讶你可以编写代码来做到这一点,但不知道它在做什么。
-
你在哪里设置人的大小值?
-
是的,我正在读java,这个例子是,我不明白,所以我与你们分享,以检查为什么在我递归添加它的工作正常时会发生这种情况,但在通过for循环添加时却没有.
-
@PiyushMittal- 问题不是我为什么要设置值问题为什么我在递归添加时得到输出并在我通过 for 循环添加时得到异常。