Какая польза от deleteCharAt () в Java StringBuffer? - PullRequest
1 голос
/ 26 июля 2011

У нас уже есть delete() в StringBuffer.Зачем нам нужно deleteCharAt()?Разве deleteCharAt(n) и delete(n, n+1) не сделали бы то же самое?

Ответы [ 6 ]

1 голос
/ 26 июля 2011

Одной из возможных причин является простота.Почему для удаления одного символа необходимы два параметра?

Другая возможность состоит в том, что delete() реализован в терминах deleteCharAt(), и, следовательно, deleteCharAt() должен существовать в любом случае и сам по себе полезенбыл просто объявлен публичным.Но можно посмотреть на исходный код и увидеть, что это не тот случай.Но это общий шаблон во многих других классах Java.

Третья возможность состоит в том, что, поскольку метод может предполагать, что он удаляет один символ, deleteCharAt() может быть реализован способом, который болееэффективнее, чем более общий delete().Опять же, однако, исходный код исключает эту опцию.Оба метода разрешают почти идентичные вызовы System.arraycopy().

Так что, учитывая, что у меня есть голос за первый вариант.Это было сделано исключительно для упрощения относительно распространенного варианта использования удаления одного символа за счет уменьшения количества параметров, которые программист должен предоставить, с 2 до 1.

1 голос
/ 26 июля 2011

Поиск в источнике говорит о том, что delete () не использует deleteCharAt () и наоборот для их реализации.Я заметил небольшую разницу: deleteCharAt сгенерирует исключение, если индекс не в границах, в то время как delete будет по умолчанию равным длине строки, когда второй аргумент передает длину строки.

Но влияние на содержимое строкового буфера остается тем же.

0 голосов
/ 26 июля 2011

Есть одно различие *:
если n - длина текста, то есть buffer.length(), тогда deleteCharAt(n) сгенерирует исключение StringIndexOutOfBoundsException, а delete(n, n+1) вообще ничего не будет делать - без исключений, ничего не удаляется.
Для больших значений n оба выбросят исключение.

IMO, лучше использовать deleteCharAt, потому что это именно то, что вы хотите сделать. Использование delete немного сложнее для понимания.

delete больше проверяет дополнительный индекс)

* Java 1.6

0 голосов
/ 26 июля 2011

Вы можете получить те же результаты, но на самом деле здесь есть несколько проблем с эффективностью ...

Для удаления по заданному индексу достаточно одной простой проверки этого индекса, в то время как при удалении диапазона индексов необходимо еще несколько.

Убедитесь сами:

public AbstractStringBuilder delete(int start, int end) 
{
    if (start <  0)
        throw new StringIndexOutOfBoundsException(start);
    if (end  > count)
        end = count;
    if (start  > end)
        throw new StringIndexOutOfBoundsException();
    int len = end - start;
    if (len  > 0) {
        System.arraycopy(value, start+len, value, start, count-end);
        count -= len;
    }
    return this;
}

По сравнению с:

public AbstractStringBuilder deleteCharAt(int index) 
{
    if ((index <  0) || (index  >= count))
        throw new StringIndexOutOfBoundsException(index);
    System.arraycopy(value, index+1, value, index, count-index-1);
    count--;
    return this;
}

Поэтому, если вам нужно удалить только один символ, вам лучше использовать deleteCharAt и сохранить несколько проверок. Тем не менее, если вы хотите удалить более 1 последовательного символа, предпочтите использовать delete, чтобы был выполнен только один вызов arraycopy и проверки не повторялись при каждом вызове deleteCharAt:)

0 голосов
/ 26 июля 2011

Существуют преимущества, которые можно использовать в реализации deleteCharAt, потому что метод знает, что он удаляет ровно один символ.

И наоборот, удаление серий символов в delete(n, m) может потребовать более сложных путей выполнения, которые обязательно будут более дорогостоящими, поскольку они "делают больше".

Хотя delete(n, n+1) имеет тот же эффект, что и deleteCharAt(n), deleteCharAt, вероятно, будет быстрее. (Оптимизатор может конвертировать одно в другое!). Это, конечно, не будет медленнее.

0 голосов
/ 26 июля 2011

Разница заключается в реализации функций DeleteAt представляет собой один оператор, такой как удаление из списка list.remove (index) delete принимает два параметра и запускает цикл с начального индекса и вызывает функцию удаления до второго параметра.

...