Потім мене запитали, скільки рядків генерує ця програма, припускаючи, що збирання сміття не відбувається. Мої думки за n = 3 були (7)
Строки 1 ( ""
) та 2 ( "a"
) - константи програми, вони не створюються як частина речей, а є "інтернованими", оскільки вони є константами, про які знає компілятор. Детальніше про це читайте у String interning у Вікіпедії.
Це також видаляє рядки 5 і 7 з рахунку, оскільки вони такі ж, "a"
як і рядки №2. Це залишає рядки №3, №4 та №6. Відповідь "3 рядки створюються для n = 3" за допомогою вашого коду.
Кількість п 2 , очевидно , неправильно , так як при п = 3, то це буде 9 , і навіть вашим гіршому випадку відповідь, який був тільки 7. Якщо не-інтерновані рядки було правильно, то відповідь має бути 2n + 1.
Таким чином, питання про те , як повинні ви зробити це?
Оскільки String є незмінним , ви хочете змінити щось, що можна змінити, не створюючи нових об'єктів. Це StringBuilder .
Перше, на що слід звернути увагу - це конструктори. У цьому випадку ми знаємо, як довга буде строка, і є конструктор, StringBuilder(int capacity)
який означає, що ми виділяємо рівно стільки, скільки нам потрібно.
Далі, "a"
не потрібно бути рядком , а скоріше це може бути персонаж 'a'
. Це має незначне підвищення продуктивності при виклику append(String)
vs append(char)
- з append(String)
методом потрібно з'ясувати, як довго триває String, і виконати певну роботу над цим. З іншого боку, char
завжди рівно один символ.
Різниці в коді можна побачити на StringBuilder.append (String) проти StringBuilder.append (char) . Його не те , щоб бути занадто стурбовані, але якщо ви намагаєтеся справити враження на роботодавця , то краще використовувати кращі практики.
Отже, як це виглядає, коли ви складете його разом?
public String foo(int n) {
StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; i++) {
sb.append('a');
}
return sb.toString();
}
Створено один StringBuilder та один String. Жодних зайвих рядків не потрібно інтернувати.
Напишіть деякі інші прості програми в Eclipse. Встановіть pmd і запустіть його на написаному вами коді. Зауважте, на що він скаржиться, і виправте ці речі. Він знайшов би модифікацію String з + у циклі, і якби ти змінив його на StringBuilder, він, можливо, знайшов би початкову ємність, але це, безумовно, вловить різницю між .append("a")
і.append('a')