public Iterator iterator() {
		// /#ifdef JDK12
		cleanUp();
		// /#endif

		return new Iterator() {
			private int bucket = 0;
			private int known = modCount;
			private Bucket nextBucket;
			private Object nextVal;

			{
				internalNext();
			}

			private void internalNext() {
				while (true) {
					while (nextBucket == null) {
						if (bucket == buckets.length)
							return;
						nextBucket = buckets[bucket++];
					}

					nextVal = nextBucket.get();
					if (nextVal != null)
						return;

					nextBucket = nextBucket.next;
				}
			}

			public boolean hasNext() {
				return nextBucket != null;
			}

			public Object next() {
				if (known != modCount)
					throw new ConcurrentModificationException();
				if (nextBucket == null)
					throw new NoSuchElementException();
				Object result = nextVal;
				nextBucket = nextBucket.next;
				internalNext();
				return result;
			}

			public void remove() {
				throw new UnsupportedOperationException();
			}
		};
	}