12. august 2002 - 16:09Der er
9 kommentarer og 1 løsning
String størrelse
Jeg har en servlet, som gerne skulle danne en html-tabel med 31 rækker og 96 kolonner, hvilket giver 2976 celler. Problemet er at få udskrevet denne tabel i browseren. Jeg har følgende kode i min servlet:
// c[] er et int array med 0 eller et, som er fyldt i tidligere. String cal = ""; for(int i=0; i<2976; i++) { if(i%95 == 0) { if(i == 0) cal += "<tr>"; else if(i == 2975) cal += "</tr>"; else cal += "</tr><tr>"; } if(c[i] == 0) // Ledig cal += "<td>0</td>"; else // Optaget cal += "<td>1</td>"; } out.println(cal);
Når jeg kører servletten med denne kodestump i dør min servletengine (JRUN) fuldstændigt og jeg får ikke noget skrevet ud i browseren. Er det fordi en string ikke kan være ca. 30.000 karaktere lang, eller hvad kan det være?
hver gang du sådan sige strengvariabel += "stump" skal java allokere nyt memoryareal til strengen der nu er blevet længere og frigive og garbage collecte den plads der blev brugt før. Det tager en hulens tid med alle de += operationer
Så det er meget muligt at det er alt hvad der er galt. prøv at lave kaffe neæste gang den 'dør' og se om ikke den er blevet færdig når du kommer tilbage 10 minutter efter.
Og skriv så koden om så du ikke bruger så uhyggeligt meget tid.
Du kan forbedre koden med et char array. Sæt størrelsen til et par tusinde, og gør det dobbelt så stor når du når sidste tegn. Char arrayet kan til sidst forvandles til en JAVA streng.
Problemet er at den helle tiden skal allokere et nyt RAM område til den nye streng, som bare er et par tegn større..
Det nemmeste er at benytte StringBuffer klassen, der effektivt sørger for at afsætte den nødvendige plads. StringBuffer buffer = new StringBuffer(); for (....) { buffer.append("klfjjfldkj"); } String s = buffer.toString();
Nu kiggede jeg også lige på koden.. Når du bruger out.println(cal) så skrive du jo til buffer, hvilket du bare hele tiden kan gøre. Altså i stedet for at samle det i en streng, så udskriv med det samme:
// c[] er et int array med 0 eller et, som er fyldt i tidligere. int i,j; for ( i=0; i<2976; i+96) { // NB: 96 går op i 2976. out.println( "<tr> ); for ( j=i; j<i+96; j++ ) { out.println( (c[j]==0) ? "<td>0</td>" : "<td>1</td>" ); } out.println( "</tr>" ); }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.