Zapytano mnie wtedy, ile ciągów wygenerowałby ten program, zakładając, że nie nastąpi wyrzucanie elementów bezużytecznych. Moje myśli dla n = 3 były (7)
Ciągi 1 ( ""
) i 2 ( "a"
) są stałymi w programie, nie są one tworzone jako część rzeczy, ale są „internowane”, ponieważ są stałymi, o których kompilator wie. Przeczytaj więcej na ten temat na stronie interning String na Wikipedii
To również usuwa ciągi 5 i 7 z liczby, ponieważ są one takie same "a"
jak Ciąg # 2. To pozostawia ciągi # 3, # 4 i # 6. Odpowiedź brzmi: „Tworzone są 3 ciągi dla n = 3” przy użyciu kodu.
Liczba n 2 jest oczywiście niepoprawna, ponieważ przy n = 3 byłoby to 9, a nawet w najgorszym przypadku odpowiedź to tylko 7. Jeśli twoje nie internowane łańcuchy były poprawne, odpowiedź powinna wynosić 2n + 1.
Więc pytanie, w jaki sposób należy to zrobić?
Ponieważ String jest niezmienny , potrzebujesz mutowalnej rzeczy - czegoś, co możesz zmienić bez tworzenia nowych obiektów. To jest StringBuilder .
Pierwszą rzeczą do obejrzenia są konstruktory. W tym przypadku wiemy, jak długi będzie łańcuch, i istnieje konstruktor, StringBuilder(int capacity)
co oznacza, że przydzielamy dokładnie tyle, ile potrzebujemy.
Następnie "a"
nie musi to być ciąg znaków, ale raczej postać 'a'
. Ma to niewielki wzrost wydajności podczas wywoływania append(String)
vs append(char)
- dzięki append(String)
metodzie metoda musi dowiedzieć się, jak długi jest ciąg znaków i trochę nad tym popracować. Z drugiej strony char
zawsze ma dokładnie jedną postać.
Różnice w kodzie można zobaczyć w StringBuilder.append (String) vs StringBuilder.append (char) . Nie należy się tym zbytnio przejmować, ale jeśli próbujesz wywrzeć wrażenie na pracodawcy, najlepiej zastosować najlepsze możliwe praktyki.
Więc jak to wygląda, kiedy go poskładasz?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
Utworzono jeden StringBuilder i jeden String. Nie trzeba było internować żadnych dodatkowych łańcuchów.
Napisz inne proste programy w Eclipse. Zainstaluj pmd i uruchom go na pisanym kodzie. Zwróć uwagę na to, na co narzeka i napraw te rzeczy. Znalazłby modyfikację ciągu za pomocą + w pętli, a gdybyś zmienił ją na StringBuilder, może znalazłby początkową pojemność, ale z pewnością dostrzegłby różnicę między .append("a")
i.append('a')