Without an external library, you can do the following. It will consume significantly less memory for big ranges than the current accepted answer, as there is no array created.
Have a class like this:
class Range implements Iterable<Integer> {
    private int limit;
    public Range(int limit) {
        this.limit = limit;
    }
    @Override
    public Iterator<Integer> iterator() {
        final int max = limit;
        return new Iterator<Integer>() {
            private int current = 0;
            @Override
            public boolean hasNext() {
                return current < max;
            }
            @Override
            public Integer next() {
                if (hasNext()) {
                    return current++;   
                } else {
                    throw new NoSuchElementException("Range reached the end");
                }
            }
            @Override
            public void remove() {
                throw new UnsupportedOperationException("Can't remove values from a Range");
            }
        };
    }
}
and you can simply use it like this:
    for (int i : new Range(5)) {
        System.out.println(i);
    }
you can even reuse it:
    Range range5 = new Range(5);
    for (int i : range5) {
        System.out.println(i);
    }
    for (int i : range5) {
        System.out.println(i);
    }
As Henry Keiter pointed out in the comment below, we could add following method to the Range class (or anywhere else):
public static Range range(int max) {
    return new Range(max);
}
and then, in the other classes we can 
import static package.name.Range.range;
and simply call
for (int i : range(5)) {
    System.out.println(i);
}