Quante persone sono state colpite da problemi di memoria della sottostringa Java? [chiuso]

StackOverflow https://stackoverflow.com/questions/1036719

  •  10-07-2019
  •  | 
  •  

Domanda

Di recente ho scoperto che il metodo java.lang.String.substring non restituisce una nuova stringa, ma una vista della stringa originale che era sottostringa. Questo può avere implicazioni di memoria. Ad esempio, se stai leggendo un file ASCII e analizzando i token nel file usando la sottostringa e archiviando il risultato della sottostringa in memoria da qualche parte - quello che stai effettivamente memorizzando in memoria è l'intera stringa prima dell'operazione di sottostringa! Ovviamente puoi risolverlo avvolgendo la sottostringa nella tua versione che restituisce una nuova stringa del risultato di sottrazione.

È stato utile?

Soluzione

Sono stato morso da esso una volta, leggendo un file dizionario riga per riga. Ogni riga era molto corta, ma il buffer creato da BufferedReader indicava che ogni stringa era supportata da un array da 80 caratteri.

Questo è stato quando ho appreso per la prima volta il punto di scrivere:

word = new String(word);

La maggior parte delle volte non è un problema - e ovviamente può essere più efficiente del "prendere una copia completamente separata" approccio.

Altri suggerimenti

Nel 2000 o 2001, uno dei primi parser XML (non ricordo quale) soffriva di questo problema. Ci è voluto un po 'per rintracciare il modo in cui stavamo esaurendo la memoria leggendo circa 3 campi da alcuni dei primi FpML (documenti XML molto grandi che descrivono prodotti finanziari).

Ciò che è veramente fastidioso è che se una scrittura

String copy = new String(s);

IntelliJ IDEA mi avverte che questo è ridondante! IDE stupido.

http: //java.sun .com / J2SE / 1.5.0 / docs / api / java / lang / String.html

Nei documenti java, indica che il metodo di sottostringa restituisce una nuova stringa.

O ho frainteso la domanda?

Inoltre, le stringhe sono immutabili. Ecco un thread SO che spiega perché è così.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top