В чем разница между String.subString() и String.subSequence()

String.subSequence() имеет следующий javadoc:

Возвращает новую последовательность символов, которая является подпоследовательностью этого последовательность.

Вызов этого метода вида

str.subSequence(begin, end)

ведет себя точно так же, как вызов

str.substring(begin, end) 

Этот метод определяется так, что класс String может реализовать Интерфейс CharSequence.

Может ли кто-нибудь объяснить?

Ответ 1

Использование str.subSequence(begin, end) возвращает CharSequence, который является только формой чтения строки, представленной в виде последовательности символов. Например:

String string = "Hello";
CharSequence subSequence = s.subSequence(0, 5);

Его чтение происходит только в том смысле, что вы не можете изменить chars в CharSequence без создания экземпляра CharSequence.

Если вам нужно использовать str.subSequence(begin, end), вы можете применить результат к String:

String string = "Hello";
String subSequence = (String) s.subSequence(0, 5);

и используйте все обычные операторы String, такие как subSequence += " World";

Ответ 2

подпоследовательности

Подпоследовательность - это обобщение подстроки, суффикса и префикса. Поиск самой длинной строки, которая является подпоследовательностью двух или более строк, называется самой длинной общей проблемой подпоследовательности.

Пример: Строка "anna" представляет собой подпоследовательность строки "banana":

banana
 || ||
 an na

подстроку

Подстрока строки является префиксом суффикса строки и эквивалентно суффикс префикса. Если одна строка является подстрокой другой, это также подпоследовательность, которая является более общим понятием.

Пример: строка "ana" является подстрокой (и подпоследовательностью) банана при двух разных смещениях:

banana
 |||||
 ana||
   |||
   ana

Подробнее здесь.

Но что касается Java, нет никакой разницы в их использовании, как четко указано в javadoc. Кроме того, как указано в этом документе, метод subSequence реализован только в классе String, чтобы поддерживать его совместимость с интерфейсом CharSequence. И это имя метода действительно просто неверно.

Ответ 3

Если вы посмотрите на источник String, вы увидите, что подпоследовательность фактически вызывает подстроку. Единственное, что он делает, отличное от подстроки, - это передать строку CharSequence.

Ответ 4

Короче говоря, это не имеет большого значения для объектов String. Они эквивалентны, если вам не нужно передавать результат на то, что принимает только String, и в этом случае вы должны использовать версию subtring(int,int) или использовать версию subsequence(int,int) для String (потому что это то, что она есть, внутри).

String.substring(int,int) существовал первым, потому что String существовал первым. В Java 1.4 добавлен CharSequence, и кто-то, по-видимому, понял, что было бы полезно иметь такую ​​же функциональность, но вернуло CharSequence вместо String (для гибкости). Итак, пришло CharSequence.subSequence(int,int). Однако, поскольку String реализует CharSequence, String унаследовал, казалось бы, избыточный метод.

Ответ 5

В основном это то, что возвращается. Одна строка, а другая - CharSequence (которую вы можете отличить как строку).
Вы должны использовать subSequence, когда вам нужен тип переменной CharSequence.