Duda con ArrayList y el metodo toArray()

Que tal tengo una duda con este metodo
toArray()

por ejemplo si tengo lo siguiente

ArrayList lista = new ArrayList();

y le agrego 10 elementos

para luego retornar esos elemento en un array de String
una forma seria digamos asi

String[] elementos = new String[lista.size()];

for(int i=0;lista.size();i++)
{
elementos[i] = lista.get(i)
}

o podria hacerlo de esta forma

String[] elementos = lista.toArray(new String[lista.size()]);

hasta ahi todo bien, pero el metodo toArray como bien puede recibir un String[]

entonces podria hacer esto:
String[] tmp = new String[10];
tmp[0] = "uno";
elementos = lista.toArray(tmp);
System.out.println(tmp[0])
practicamente tmp es una copia exacta de la variable elementos, y ya no imprime "uno" si no lo que tendria elementos[0] y lista.get(0)

pero si hago esto:
String[] tmp = new String[5];
tmp[0] = "uno";
elementos = lista.toArray(tmp);
System.out.println(tmp[0])

se imprime "uno" pero elementos[0] y lista.get(0) tienen el mismo valor y no es uno obviamente..
segun la la documentacion si tmp es menor al tamaño del ArrayList se expandira hasta ese tamaño osea 10, pues bien ahi mi duda
supongo que cuando dice se expande (o yo supuse asi ) quiere decir que pasa como cuando se concatena un String este crea un nuevo String con copia + lo que se le ponga (lo de expande), pero parece que no sucede asi, lo que veo es que el tmp original sigue ahi y el expandido se expande pero se pierde en algun punto ya que no es posible acceder a los valores "nuevos" solo los que tenia previamente..
por ejemplo si quiero imprimir el valor de tmp[9], si no le di un valor antes no imprime nada y de echo creo que se lanza alguna excepsion que no logro detectar...

ahora si hago esto:

String[] tmp = new String[20];
tmp[0] = "uno";
elementos = lista.toArray(tmp);
System.out.println(tmp[0])

los valores tmp[0], elementos[0], lista.get(0), son los mismos y la documentacion dice que, si es mas grande el valor de tmp los valores restantes se ponen a null, hasta ahi todo bien ya que si imprimo tmp[11] este es null,,,

la cuestion es lo que dije que pasa cuando el valor del vector que se la pasa al constructor es mas chico, sera que es un bug o que sucede?

saludos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Array.toArray()

Como bien lo dice la documentación del método, si le pasas a ese método un arreglo del tipo correcto con la suficiente capacidad para albergar todos los elementos del arreglo entonces los mete en ese arreglo y ese mismo es el que te devuelve; es decir, no crea un arreglo nuevo.

Si le pasas null o un arreglo que no tiene la capacidad suficiente para todos los elementos de la lista, entonces crea un nuevo arreglo del tamaño necesario, mete ahí los elementos y es el que te devuelve.

Imagen de genitalico

mmm entonces supongo que si

mmm entonces supongo que si es mas chico se pierde esos datos o la referencia solo la sabe la JVM por que ya no es posible acceder a ellos..

por otro lado hablando del lado de la velocidad y optimizacion de memoria que es mas optimo y rapido para convertir una lista en un array de String la primero forma que puse o utilizando el toArrayList ?

saludos

Imagen de ezamudio

toArray()

el ciclo que pones como primer ejemplo definitivamente no es lo óptimo.

Imagen de genitalico

oks bien entonces usare el

oks bien entonces usare el método toArray()..

saludos y gracias..