Crear objetos de cadena innecesarios

Esto es un poco de Java String 101. Me encontré con esto recientemente en algún código existente. Mi reacción inicial es que esto es redundante

car.setDetails(new String(someStringBufferObj.toString));

En mi opinión, incluso esto sería redundante ...

car.setDetails(new String(someOtherStringObj));

porque String es inmutable, por lo que nunca existe el riesgo de que los detalles del automóvil se cambien accidentalmente (al cambiar someOtherStringObj) en una línea de código posterior

¿Estoy equivocado?

Respuesta 1

El primer fragmento de arriba parece innecesario. Sin embargo, el segundo puede ser necesario. Considera lo siguiente.

El constructor String(String)es útil ya que tomará una copia de la matriz de caracteres subyacente de la cadena original.

¿Por qué es útil esto? Debe comprender que un objeto de cadena tiene una matriz de caracteres subyacente y obtener una substring()de una cadena existente realmente usa esa matriz de caracteres original. Este es un patrón de peso mosca . Considera lo siguiente

String s = longstring.substring(2,4);

La cadena sapunta a la matriz de caracteres subyacente longstring(algo poco intuitivo). Si desea agrupar longstring(mediante la recolección de elementos no utilizados), la matriz de caracteres subyacente no se agrupará, ya que stodavía hace referencia a ella y terminará consumiendo una cantidad de memoria potencialmente enorme para una cadena de 2 caracteres.

El String(String)constructor resuelve esto creando una nueva matriz de caracteres a partir de la referenciada por la cadena que se utiliza para construir. Cuando la cadena original se elimina mediante la recolección de basura, el substring()resultado no hará referencia a su matriz de caracteres y, por lo tanto, también se eliminará.

Tenga en cuenta que este comportamiento ha cambiado muy recientemente en Java (versión 7u4, creo) y las cadenas ya no admiten el modo de operación anterior.

Respuesta: 2

¿Cómo podría comparar la entrada que recibo del usuario con un char? Recibiré una carta del usuario (que podría ser mayúscula o minúscula) y luego la compararé con la letra deseada. ...

No puedo elegir entre node.js y Java (Netty). Deseo hacer una estrategia basada en pasos con el proceso del juego como http://www.magicthegatheringtactics.com/ (los usuarios cooperan en las salas de chat y ...

Tengo una actividad ListView cargada con elementos FirebaseDatabse (usuarios). Una vez que hace clic en un elemento de ListView, pasa la Clave de elemento del usuario relacionado (FirebaseDatabase Hash) a otra Actividad, ...

Tengo una aplicación con una actividad principal, una actividad gráfica y un Bluetooth ConnectListenerImpl. La actividad principal busca un dispositivo Bluetooth y Bluetooth ConnectListenerImpl se conecta con el dispositivo ...