Экспериментирую со связными списками. Насколько я понимаю, идентификаторы объектов в Java являются ссылками, и поэтому список сконструировать можно.
Программа получает простые числа от 1 до N и использует связный список для хранения ранее вычисленных значений. Код такой:
public class simpleNumber {
private static SimpleNumber s = null, e = null;
private static boolean checkSimpleNumber(int x) {
int r = (int)Math.sqrt(x);
boolean f = true;
SimpleNumber p = s;
while(p != null && p.number <= r && f) {
if(x % p.number == 0)
f = false;
p = p.next;
}
if(f && x > 1) {
p = new SimpleNumber();
p.number = x;
p.next = null;
if(e != null)
e.next = p;
e = p;
if(s == null)
s = p;
}
return f;
}
public static void main(String[] args) {
for(int i = 1; i <= 100000000; i += i > 2 ? 2 : 1)
if(checkSimpleNumber(i))
System.out.println(i);
}
}
class SimpleNumber {
public int number;
public SimpleNumber next;
}
Исполняю на Java 6 SE под Linux.
Она бодро работает примерно до 70 млн (и примерно 70 Мб расходуемой памяти), затем на 71-м миллионе она начинает жутко тормозить и потом молча дохнет. Подозреваю, что у сборщика мусора сносит крышу от необходимости проверять ссылки на объекты до конца такого большого списка.
Кто может компетентно объяснить, что происходит?
P.S. Не надо советовать переписать или оптимизировать программу. Меня интересует не это, а именно возможность работы с длинными связными списками.