Comprender las clases de referencia de Java: SoftReference, WeakReference y PhantomReference

¿Alguien puede explicar la diferencia entre las tres clases de referencia (o publicar un enlace a una buena explicación)?SoftReference > WeakReference > PhantomReference, pero ¿cuándo usaría cada uno? ¿Por qué hay unWeakHashMap pero noSoftHashMap oPhantomHashMap?

Y si uso el siguiente código ...

WeakReference<String> ref = new WeakReference<String>("Hello!");
if (ref != null) {                 // ref can get collected at any time...
    System.gc();                   // Let's assume ref gets collected here.
    System.out.println(ref.get()); // Now what?!
}

...¿lo que pasa? ¿Tengo que verificar siref es nulo antes de cada declaración (esto está mal, pero quédebería Hago)? Perdón por las preguntas rápidas, pero tengo problemas para entenderlas.Reference clases ... Gracias!

Respuestas a la pregunta(4)

Su respuesta a la pregunta