Array64.java 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package util;
  2. import java.io.Serializable;
  3. public class Array64<T> implements Serializable {
  4. /**
  5. *
  6. */
  7. private static final long serialVersionUID = 1L;
  8. private final int CHUNK_SIZE = 1024 * 1024 * 1024;
  9. private long size;
  10. private T[][] data;
  11. @SuppressWarnings("unchecked")
  12. public Array64(long s) {
  13. size = (s > 0) ? s : 0;
  14. int chunks = (int) (size / CHUNK_SIZE);
  15. int remainder = (int) (size % CHUNK_SIZE);
  16. data = (T[][]) new Object[chunks + (remainder == 0 ? 0 : 1)][];
  17. for (int i = 0; i < chunks; i++)
  18. data[i] = (T[]) new Object[CHUNK_SIZE];
  19. if (remainder != 0)
  20. data[chunks] = (T[]) new Object[remainder];
  21. }
  22. public long size() {
  23. return size;
  24. }
  25. public T get(long index) {
  26. if (index < 0 || index >= size)
  27. throw new ArrayIndexOutOfBoundsException("" + index);
  28. int chunk = (int) (index / CHUNK_SIZE);
  29. int offset = (int) (index % CHUNK_SIZE);
  30. return data[chunk][offset];
  31. }
  32. public void set(long index, T item) {
  33. if (index < 0 || index >= size)
  34. throw new ArrayIndexOutOfBoundsException("" + index);
  35. int chunk = (int) (index / CHUNK_SIZE);
  36. int offset = (int) (index % CHUNK_SIZE);
  37. data[chunk][offset] = item;
  38. }
  39. }