Есть ли способ получить размер java.util.Queue, размер которого превышает max int, без необходимости создавать вокруг него обертку? Другие библиотеки могут быть?
Я думаю, это должно сработать
long size = 0;
for(Iterator i = queue.iterator(); i.hasNext(); i.next()) {
size++;
}
return size > Integer.MAX_VALUE;
Теоретически да. Вы можете использовать неприятное отражение, чтобы сломать абстракцию и копаться в структурах данных реализации очереди. Но это действительно плохая идея.
Если вам действительно нужны очереди такого размера, вам почти наверняка понадобится отдельный класс очереди 1. В этот момент вы можете легко включить пользовательский getter в ваш API, чтобы получить размер очереди в 64 бит.
1 - Очередь, поддерживаемая простым массивом, не сможет поддерживать больше 2 ^ 31 - 1 элементов, а связанная очередь с таким количеством элементов будет тратить много гигабайт памяти... не говоря уже о том, что основные расстройство желудка для ГК.
С технической точки зрения, я не думаю, что вы можете, по крайней мере, не модифицировать очередь.
Метод size
унаследованный от коллекций, вернет maxint, если есть больше элементов, чем это, но он также вернет, что если есть точно столько элементов.
Таким образом, кроме выделения элемента и просмотра изменений размера, нет другого пути.
Это не мешает вам создать свою собственную очередь (с long
размером), если это действительно важно.
Тем не менее, я видел очень мало случаев в моей долгой карьере, когда очереди становятся такими большими - вы можете переосмыслить, что вы делаете, они могут быть лучшим способом.
java.util.Queue
?