style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

crear un new StringBuilder o reusar StringBuilder por performance de muchos datos

Hola gente buen dia, estaba haciendo una prueba con mi codigo y al querer reusar el stringbuilder parece que sobre escribiera todos los stringbuffer del hashmap , aqui les pongo el codigo , que estare haciendo mal, ya que si uso el new Stringbuilder usara mucho memoria y son para pasar muchos datos, les agradezco su apoyo

                HashMap<String, StringBuilder> hmap = new HashMap<String, StringBuilder>();
                StringBuilder workorder = new StringBuilder();
                StringBuilder workordertmp = new StringBuilder();
                final StringBuilder acx = new StringBuilder();
               
            int cont=0,c;
            String [] arr= {"R89123","R89123","R89123","R891245","R89125"};
            int i=0;
           
            for (int j=0;j<arr.length;j++)      
            {
                //key = rs.getString("user_network");
                Object  key = arr[j];
                System.out.println(key);
                 
                if(hmap.containsKey(key.toString())==true){    
                        //cont++;
                        System.out.println("ie");
                       
                        workorder=(StringBuilder)hmap.get(key);
                       
                        System.out.println("t:"+workorder);
                        i= workorder.length();
                       
                        workordertmp.append("ok"+cont);
                        workorder.insert(i-("</Coleccion>".length()),workordertmp );
                                       
                                        hmap.put(key.toString(),workorder);
                                        //workorder.setLength(0);
                                        workordertmp.setLength(0);
//                                      workorder = new StringBuilder();
                                        //workordertmp = new StringBuilder();
                                        cont+=1;
                }
               
                else if(hmap.containsKey(key.toString())==false){      
                        cont=0;
                        System.out.println("nw");
                                        //StringBuffer acx = new StringBuilder();
                        final StringBuilder racx = reuseForBetterPerformance(acx);
                       
                        racx.append("<Coleccion>");
                        racx.append("oka");
                        racx.append("<Coleccion>");

                                        hmap.put(key.toString(),racx);
                                }              
               
                }

            Set set = hmap.entrySet();
            Iterator iterator = set.iterator();
            while(iterator.hasNext()) {
               Map.Entry mentry = (Map.Entry)iterator.next();
               System.out.print("key is: "+ mentry.getKey() + " & Value is: ");
               System.out.println(mentry.getValue());
              // hacer algo con los datos functiondatos( mentry.getKey(),mentry.getValue());
            }

................

public static StringBuilder reuseForBetterPerformance(final StringBuilder sb) {
            sb.delete(0, sb.length());
            return sb;
        }

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.

Efectivamente estás creando

Efectivamente estás creando un solo StringBuilder

final StringBuilder acx = new StringBuilder();
...
final StringBuilder racx = reuseForBetterPerformance(acx);
....
hmap.put(key.toString(),racx);  

Y luego lo pones en todas las llaves:

workorder=(StringBuilder)hmap.get(key);
....
hmap.put(key.toString(),workorder);

Como todas las llaves tienen el mismo valor, al iterar e imprimir pues... ves el mismo valor.

Antes de optimizar haz que tu programa funcione correctamente, luego mide y hasta entonces optimiza.

El StringBuilder es muy útil cuando quieres construir un string muy grande uniendo varios otros string en un loop cerrado en vez de crear instancias de String, unirlas para luego crear un solo string. Ejemplo:

Este código

String result = "";
for( String comment : allCommentsFromDatabase() ) { // 1,000,000 de strings
   result += comment; // crea 1M de string que son desechados inmediatamente
}

Tendría mejor desempeño con algo así:

StringBuilder buffer = new StringBuilder();
for( String comment : allCommentsFromDatabase() ) { // 1,000,000 de strings
   buffer.append(comment);
}
String result = buffer.toString();

Quizá tu programa necesite una optimización distinta. O quizá no necesita ninguna.

Ola gracias por tu comentario

Ola gracias por tu comentario , entonces para instanciar otro o para no crear otro para que no apunte al misma referencia de memoria como se puede hacer?, ya que al crear nuevas instancia es costoso es lo que he leido, o poner dentro del loop asi:

 if(hmap.containsKey(key.toString())==true){    
                        //cont++;
                        System.out.println("ie");
                       
                        workorder=(StringBuilder)hmap.get(key);
                       
                        System.out.println("t:"+workorder);
                        i= workorder.length();
                       
                        workordertmp.append("ok"+cont);
                        workorder.insert(i-("</Coleccion>".length()),workordertmp );
                                       
                                        hmap.put(key.toString(),workorder);
                                       
                                       
                                        workorder = new StringBuilder();
                                       workordertmp = new StringBuilder();
                                        cont+=1;
                }
               
                else if(hmap.containsKey(key.toString())==false){      
                        cont=0;
                        System.out.println("nw");
                        acx = new StringBuilder();
                       
                        acx.append("<Coleccion>");
                        acx.append("oka");
                        acx.append("<Coleccion>");
                                        hmap.put(key.toString(),acx);
                                }              
               

espero puedan orientarme , les agradezco su apoyo

Primero usa Strings

Primero usa Strings directamente. Cuando funcione tu programa mide cuánto se tarda ( 1 segundo, 10, 2 minutos)
Reemplaza por una nueva instancia de StringBuilder por llave y vuelve a medir. Si de 10 segundos pasa a 9 tuviste una ganancia del 10% quizá si vale la pena, si se tarda 9.9s tuviste una ganancia de 1%. Puede haber veces en las que empeores las cosas.

Pero reemplazarlo por una

Pero reemplazarlo por una nueva instancia de StringBuilder seria dentro del loop mismo?,
te agradezco nuevamente

Si. Pero puedes incluso

Si. Pero puedes incluso empezar eliminando el StringBuilder por completo y usar Strings normalitos y concatenarlos con +

Imagen de SuperSerch

Hablando de Strings

En caso de Java 8, el JLS dice sobre concatenar Strings: "To increase the performance of repeated string concatenation, a Java compiler may use the StringBuffer class or a similar technique to reduce the number of intermediate String objects that are created by evaluation of an expression."
De la misma manera el JavaDoc de String en Hotspot JDK8 dice: "String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method" y esto está así al menos desde la versión 5 del JDK, por lo que la diferencia (en velocidad y consumo de memoria) debería ser despreciable usando cualquiera de ambos métodos.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">