我正在尝试为类中的每个对象生成一个新的唯一标识符,而不使用static nextID
字段来增加。使用它会在卸载和卸载程序时产生复杂性。
我想出了一个解决方法,用静态方法遍历对象,然后检查它们,但由于某些未知原因,它不会退出while循环。
我一直在ideone.com here中测试它,试图创建5个对象,但它甚至不会创建一个。
无需转到链接查看整个测试代码,下面是我正在使用的方法。
public static int newRandomID() {
int randomID = 0;
boolean notUnique = true;
while (notUnique) {
randomID = (int) (Math.random() * 999999 + 1);
for (Example e : examples) {
if (e.ID == randomID) {
notUnique = true;
break;
}
notUnique = false;
}
}
return randomID;
}
我是否犯了一个愚蠢的错误,我太盲目无法看到,或者有没有理由不这样做?
答案 0 :(得分:4)
如果你需要的只是一个唯一的标识符(不需要是顺序的)并且它必须是一个整数,那么看一下java.util.UUID
答案 1 :(得分:0)
你的notUnique
有点混乱,我认为你在这里做错了
if (e.ID == randomID) {
notUnique = true;
break;
}
如果id
存在,你不需要破坏语句。我改变了你的代码可能会有所帮助。
int randomID = 0;
boolean ContinueLoop = true;
while (ContinueLoop) {
randomID = (int) (Math.random() * 999999 + 1);
boolean exist = false;
for (Example e : examples) {
if (e.ID == randomID) {
exist = true;
}else{
exist = false;
break;
}
}
if(exist==false){
ContinueLoop = false;
}else{
ContinueLoop = true;
}
}
return randomID;
答案 2 :(得分:0)
尝试执行您的代码(来自您发送的链接): 在您创建并打印了50个新ID之后,我尝试再生成150,000个:
for (int i = 0; i < 150000; i++)
new Example();
并且...它的工作非常好!花了一分钟左右(这很有意义)。 如果我尝试只创建15,000条记录,它可以在不到一秒的时间内完成。
这使我得出结论,错过率是指数级高,并且一旦达到ids容量的15%就开始难以忍受。
不要继续这个解决方案。 使用不同的方法,例如存储的序号(如果存储记录)。如果你不存储记录,我就不会看到为什么不使用静态int变量。