2014-11-27 4 views
3

1. Я смущен между этими двумя, есть ли у них разная функциональность, если так, то как?Разница между StringBuffer (String str) и StringBuffer (CharSequence chars)

StringBuffer(CharSequence chars) 

и

StringBuffer(String str) 

2. Что такое основное различие между струнами и CharSequence (функциональность) Специально?

+0

Хорошо, я думал, что все такие вещи были удалены - 'String' заменен на' CharSequences' ... – Betlista

+0

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk /6-b14/java/lang/StringBuffer.java#StringBuffer.%3Cinit%3E%28java.lang.String%29 – Maksym

+0

@Maksym: он не описывает, почему существует этот избыточный конструктор, тот, у кого 'String', нет должен быть там ... – Betlista

ответ

4

CharSequence представляет собой интерфейс; бывает, что String реализует его.

Это означает, что, например, при вызове .charAt() на String, что на самом деле называется это реализация String для этого метода CharSequence.

Как вы можете видеть из javadoc CharSequence, не многие классы в JDK фактически реализуют этот интерфейс.

Что касается причин, почему два конструктора, StringBuffer относятся к Java 1.0 и CharSequence, отображаются только в 1.4; однако, это также тот случай, что StringBuilder (который вы должны использовать, действительно, вместо StringBuffer) имеет два конструктора (один с CharSequence как аргумент, другой с String в качестве аргумента), поэтому, вероятно, есть оптимизация, если String передается в качестве аргумента. Что касается таких оптимизаций, то это случай «Использовать источник, Люк» (tm).

В качестве примера реализации CharSequence, которая не находится в JDK, вы можете, например, увидеть один из моих проектов: largetext. Обратите внимание, что, помимо прочего, генерирование Matcher от Patternuses a CharSequence and not a String as an argument; и с String реализует CharSequence, ну, передавая String в качестве аргумента.

+1

Ваше сообщение Снял сценарий немного, Но зачем нам нужны charsequence и строковый аргумент? Не один из них достаточно, чтобы продемонстрировать поведение StringBuffer Constructor. – Avin

+1

Конечно, просто конструктор 'CharSequence' был бы достаточным, но оптимизация - совершенно хорошая причина для обоих. –

+0

Какой пример вы ищете? Я не могу сказать, о чем вы смущены. –

5

CharSequence - это интерфейс, поэтому вы не можете напрямую его создать. String - это конкретный класс, который реализует интерфейс CharSequence. StringBuffer также реализует интерфейс CharSequence.

А почему StringBuffer имеет два конструктора один, который принимает String и тот, который принимает CharSequence, это почти наверняка потому, что (согласно Since линии в Javadoc) CharSequence не добавляли до тех пор, пока Java v1.4 StringBufferString) были в Java 1.0

0

public StringBuffer (String str): Создает строковый буфер, инициализированный содержимым указанной строки. Начальная емкость строкового буфера равна 16 плюс длина аргумента строки.

public StringBuffer (CharSequence seq): Создает строковый буфер, содержащий те же символы, что и указанная CharSequence. Начальная емкость строкового буфера равна 16 плюс длина аргумента CharSequence. Если длина указанной CharSequence меньше или равна нулю, возвращается пустой буфер емкости 16.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/StringBuffer.java#StringBuffer.%3Cinit%3E%28java.lang.String%29

+0

Мне все еще интересно, как длина может быть <0 ... – Betlista

+0

Я не уверен, но это то, что говорит исходный код. – Kartic

+0

Вот почему я не люблю OpenJDK, кто знает, кто добавил этот комментарий, это не в Oracle JDK ... – Betlista

Смежные вопросы