Efectivamente, no tiene utilidad, de hecho, es menos eficiente.
En ambos casos se crea un objeto String con ese contenido "adfs", las dos formas son totalmente equivalentes y hacen lo mismo.
La única diferencia es que el compilador es listo y si haces esto
Código:
String s = "adfs";
String p = "adfs";
el compilador es capaz de detectar que la cadena es la misma y sólo creará un objeto String con "adfs", de forma que s y p "comparten" el String único. Sin embargo, si haces
Código:
String s = new String ("adfs");
String p = new String ("adfs");
el compilador ya no hace lo de antes, estás creando dos objetos String con el mismo contenido, uno para cada uno. Puesto que un objeto String es inmutable (no puedes cambiarle el contenido), esta forma es menos eficiente por ocupar algo más de memoria y no tiene en principio ninguna ventaja especial.
Se bueno.