Attemped Sieve of Eratosthenes
Boolean expressions evaluate to boolean. That means that can be used interchangeably with true and false.

if (numbers.get(index) == true)


is the same as

if (numbers.get(index))




if (i &lt; 2) numbers.add(false); else numbers.add(true);


is the same as 

numbers.add(i&gt;=2);


It is also much easier to read and edit. Collapsing an if/else into one line is bad form. It forces the reader to look carefully at what is actually happening. Where as separate it across multiple lines, as you do with your other if statements allows each part to stand on its own. Additionally, dropping the curly braces means you will need to do extra work if you want to add another statement. Or, if you forget, the second line will execute unconditionally.



Why are you using a while loop for the main body? It does exactly what a for loop is designed to do and your code shows that you understand how to use them.



You should extract 2000000 into a constant. The name will make it clearer what the meaning of the number is. The constant will mean that the value clearly means the same thing in both places.



Comments are best used for describing why something is happening. Code is best for stating what is happening. If you feel that the code is complicated enough that you need to explicitly say  what is happening, that is an indication that extracting that piece of code into a function with a descriptive name would be helpful.