Reference is simply a number which JVM uses to identify and locate objects. When you do
Emp e = new Emp();
new Emp(); creates instance of Emp class and returns reference to that instance - lets say it is 123. Then via Emp e = that identifier is assigned to reference variable e, so it holds that 123.
Later at
lst[0] = e;
123 (reference) will be copied to from e to lst[0].
BUT e and lst[0] are separate variables even if they are holding same values. Changing value at one of them (to hold null reference), doesn't mean automatically changing value of another.
In other words, when you do lst[0] = e; it doesn't mean that lst[0] is told to always use value held by e, but that it should take a look at current value held by e and copy that value (once). So when you later change value held by e (even to null) it will not change what lst[0] holds.