@Override
    public Iterator<T> iterator() {
        return new Iterator<T>() {

            boolean hasNext;
            T next;
            final Iterator<? extends T> i1 = s1.iterator();
            Iterator<? extends T> i2;

            @Override
            public boolean hasNext() {
                if (i1.hasNext()) {
                    next = i1.next();
                    hasNext = true;
                    return true;
                }
                hasNext = false;
                if (i2 == null) {
                    i2 = s2.iterator();
                }
                while (i2.hasNext()) {
                    final T n = i2.next();
                    if (!s1.contains(n)) {
                        hasNext = true;
                        next = n;
                    }
                }
                return hasNext;
            }

            @Override
            public T next() {
                if (!hasNext) {
                    throw new NoSuchElementException();
                }
                return next;
            }

        };
    }