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 charzawsze 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')