2010-01-13 12 views
6

Ilekroć próbuję dodać numery w ciąg tak:łącze problem podczas dołączania ciągi

String s=new String(); 

for(int j=0;j<=1000000;j++) 

    s+=String.valueOf(j); 

Mój program jest dodanie numerów, ale bardzo powoli. Ale kiedy zmieniany mój program i uczynił to lubią:

StringBuffer sb=new StringBuffer(); 

for(int j=0;j<=1000000;j++) 

sb.append(String.valueOf(j)); 

mam wynik bardzo szybko. Dlaczego to jest takie?

+0

http://www.joelonsoftware.com/ articles/fog0000000319.html – moonshadow

+0

Może proponuję przeczytać Effective Java http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683 Ta książka dotyczy podstawowej znajomości programowania w języku Java. Jeśli masz dalsze pytania, nadal możesz wrócić tutaj, oczywiście – nanda

+0

To będzie jeszcze szybciej, jeśli wstępnie zmieścisz StringBuffer: 'StringBuffer sb = new StringBuffer (5888896);' Wtedy może pojawić się * nieznacznie * szybciej, jeśli zmienisz na 'StringBuilder'. Nawiasem mówiąc, możesz po prostu użyć 'sb.append (j);' do dołączenia numeru. –

Odpowiedz

6

s+=String.valueOf(j); musi przydzielić nowy obiekt String za każdym razem, gdy zostanie wywołany, a to jest kosztowne. Model StringBuffer musi tylko rozwinąć wewnętrzną reprezentację, gdy zawarty łańcuch jest zbyt duży, co dzieje się znacznie rzadziej.

Prawdopodobnie byłoby jeszcze szybciej, gdybyś użył StringBuilder, która jest niezsynchronizowaną wersją StringBuffera.

Warto zauważyć, że podczas gdy ten ma zastosowanie do pętli i wielu innych przypadkach, to nie musi stosować się do wszystkich przypadków, w których Struny są łączone za pomocą +:

String helloWorld = getGreeting() + ", " + getUsername() + "!"; 

Tutaj kompilator będzie prawdopodobnie zoptymalizować kod w sposób, który uważa za odpowiedni, który może, ale nie musi, tworzyć StringBuilder, ponieważ jest to również droga operacja.

+0

+1 dla StringBuilder. Można również wstępnie przydzielić pamięć dla niego (parametr do konstruktora). – Thilo

1

Ponieważ s + = "ciąg" tworzy nową instancję. Ciąg jest niezmienny. StringBuffer lub StringBuilder dodaje ciąg bez tworzenia nowej instancji.

1

W języku Java jak w .NET Ciągi są niezmienne. Nie można ich zmienić po stworzeniu. W rezultacie użycie operatora + stworzy nowy łańcuch i skopiuje do niego zawartość obu łańcuchów.

StringBuffer podwoi przydzieloną przestrzeń za każdym razem, gdy zabraknie miejsca na dodanie znaków. W ten sposób zmniejszając ilość przydziałów pamięci.

Powiązane problemy