Cita: ArrayList<String> a=null;
a.add(null)
System.out.println("\n tamano test 1"+ a.size());
En este caso el valor con el que se inicializa (null) es sustituido por el primer valor que le añades. Y a.size()=1 en vez de 2.
En este caso lo que tienes es un NullPointerException.
Del resto, creo que te montas una caco importante con las inicializaciones
Cita: Int valor;
valor=0;
Es distinto a:
int valor=0;
Y la diferencia es que en un caso la variable ha sido inicializada y en el otro caso no.
No hay ninguna diferencia.
Sobre la pregunta que abre el hilo,
un ArrayList es un array dinámico, y cuando se crea se le da un "tamaño" que irá variando según el array se va llenando, por lo que siempre hay posiciones vacías en un ArrayList.
Lo que te extraña del comportamiento, es que tienes que diferenciar entre capacidad y tamaño de un ArrayList, la capacidad es ese "tamaño" con el que se crea y que va aumentando, el tamaño es el número de elementos que contiene.
¿Cómo sabe su tamaño? Empieza en 0 y cada vez que haces un add suma uno y con un remove resta uno, por lo que cuanto haces add(null) estás sumando uno, ya que no diferencia si el elemento es null o no.
Hay que tener en cuenta que un List es dinámico, por lo que su prioridad no es acceder a una posición en concreto, tanto con add(indice,elemento) y con remove(indice) todos los índices posteriores se modifican.