Neil,
In order to be evaluated the thing inside needs to be a valid
java identifier (starts with a letter, _ or $ and thereafter can contain numbers).
In your example, 1 is not a valid identifier and so is just treated as a number. Based on the fact you say stuff[0] and stuff[1] work, stuff must be an array of some sort.
If you were to use "1", as in:
stuff["1"]
then the container, being smart, would coerce it to a numeric 1 knowing that stuff is an array and it needs a numeric value to lookup things in arrays. (If stuff were a map, it would simply look up "1" in the map.)
Taking things one stage further - if you were to name it a1, as in:
stuff[a1]
then the container would attempt to find an attribute called "a1" as per Leandro's reply. If "a1" had a value of "0", then this would be substituted and coerced to numeric 0, so the container would look up stuff[0].
Clear as mud?