Reemplazar con una cadena vacía reemplaza newChar alrededor de todos los caracteres en la cadena original

Estaba trabajando en uno de mis códigos java en el que utilizaba el método Java String.replace. Entonces, al probar el método de reemplazo como en una situación, estoy planeando poner valor basura de String.replace("","");

Probando, llegué a la condición de reemplazar el valor en blanco con algún otro valor, es decir, String.replace("","p") que reemplazó "p" todas partes alrededor de todos los caracteres de la cadena original

Ejemplo:

 String strSample = "val"; strSample = strSample.replace("","p"); System.out.println(strSample); 

Salida:

 pvpaplp 

¿Alguien puede explicar por qué funciona así?

replace apariencias para cada lugar donde tenga una cadena que comience con la cadena reemplazada. por ejemplo, si reemplaza “a” en “banana”, se encuentra “a” 3 veces.

Sin embargo, para una cadena vacía, la encuentra en todas partes, incluso antes y después de la última letra.

A continuación se muestra la definición de los documentos de Java para el método de replace sobrecargado de su caso.

String java.lang.String.replace ( objective de CharSequence, reemplazo de CharSequence)

Reemplaza cada subcadena de esta cadena que coincida con la secuencia de destino literal con la secuencia de reemplazo literal especificada. El reemplazo se realiza desde el principio de la cadena hasta el final, por ejemplo, al reemplazar “aa” por “b” en la cadena “aaa” se obtendrá “ba” en lugar de “ab”.

Parámetros:
objective La secuencia de los valores de char para ser reemplazados
reemplazo La secuencia de reemplazo de valores char

Ahora, ya que está definiendo target valor target como "" es decir, vacío, por lo que elegirá cada ubicación en la cadena y la reemplazará con el valor definido en replacement .

Algo bueno es el hecho de que si usas strSample = strSample.replace(" ","p"); lo que significa un carácter de espacio en target como valor target , entonces no se reemplazará nada porque ahora, en este caso, el método de replace intentará buscar un carácter de espacio en blanco.

La implementación java.lang.String nativa de Java (como Ruby y Python) considera que la cadena vacía "" una secuencia de caracteres válida al realizar operaciones de cadena. Por lo tanto, la secuencia de caracteres "" está efectivamente en todas partes entre dos caracteres, incluidos antes y después del último carácter.

Funciona de manera coherente con todas las operaciones java.lang.String . Ver :

 String abc = "abc"; System.out.println(abc.replace("", "a")); // aaabaca instead of "abc" System.out.println(abc.indexOf("", "a")); // 0 instead of -1 System.out.println(abc.contains("", "a")); // true instead of false 

Como nota al margen :

Este comportamiento puede ser engañoso porque muchos otros lenguajes / implementaciones no se comportan de esta manera. Por ejemplo, SQL (MySQL, MSSQL, Oracle y PostgreSQL) y PHP no se consideran "" como una secuencia de caracteres válida para el reemplazo de cadenas. .NET va más allá y lanza la System.ArgumentException: String cannot be of zero length. al llamar, por ejemplo, abc.Replace("", "a") .

Incluso la popular biblioteca Java de Apache Commons Lang funciona de manera diferente:

 org.apache.commons.lang3.StringUtils.replace("abc", "", "a")); /* abc */ 

Echale un vistazo a éste ejemplo:

 "" + "abc" + "" 

¿Cuál es el resultado de este código?
Respuesta: sigue siendo "abc" . Entonces, como pueden ver, podemos decir que todas las cadenas tienen algunas cadenas vacías antes y después.

La misma regla se aplica entre caracteres como

 "a"+""+"b"+""+"c" 

todavía creará "abc"

Así que las cadenas vacías también existen entre los personajes.

En tu codigo

 "val".replace("","p") 

todas estas cadenas vacías se reemplazan con p que resulta en pvpaplp .


En el caso de ""+""+..+""+"" suponga que Java es lo suficientemente inteligente como para verlo como uno "" .