CharSequence= интерфейс
String= конкретная реализация
Вы сказали:
преобразование из одного в другое
Там нет конвертации из String.
- Каждый
Stringобъект являетсяCharSequence .
- Каждый
CharSequenceможет изготовить String. Вызов CharSequence::toString. Если CharSequenceслучаем является a String, то метод возвращает ссылку на свой собственный объект.
Другими словами, каждый Stringявляется CharSequence, но не каждый CharSequenceявляется String.
Программирование на интерфейс
При программировании на Android большинство текстовых значений ожидаются в CharSequence.
Это почему? В чем выгода и каковы основные последствия использования CharSequence вместо String?
Как правило, программирование для интерфейса лучше, чем программирование для конкретных классов. Это обеспечивает гибкость, поэтому мы можем переключаться между конкретными реализациями определенного интерфейса, не нарушая другой код.
При разработке API который будет использоваться различными программистами в различных ситуациях, напишите свой код, чтобы предоставить и использовать самые общие возможные интерфейсы. Это дает вызывающему программисту свободу использовать различные реализации этого интерфейса, независимо от того, какая реализация лучше всего подходит для их конкретного контекста.
Например, посмотрите на Java Collections Framework . Если API дает или принимает упорядоченную коллекцию объектов, объявлять методы, используя Listвместо ArrayList, LinkedListили любой другой реализации третьей стороной в List.
При написании быстрого и грязного метода, который будет использоваться только вашим кодом в одном конкретном месте, в отличие от написания API, который будет использоваться в нескольких местах, вам не нужно беспокоиться об использовании более общего интерфейса, а не конкретного конкретного учебный класс. Но даже тогда было бы больно использовать самый общий интерфейс, какой только можно.
Каковы основные различия и какие проблемы ожидаются при их использовании,
- С помощью
Stringвы знаете, что у вас есть один фрагмент текста, полностью в памяти, и является неизменным.
- С a
CharSequenceвы не знаете, какими могут быть конкретные особенности конкретной реализации.
CharSequenceОбъект может представлять собой огромный кусок текста, и , следовательно , имеет значение памяти. Или может быть много фрагментов текста, отслеживаемых отдельно, которые нужно будет сшивать вместе, когда вы звоните toString, и поэтому возникают проблемы с производительностью. Реализация может даже извлекать текст из удаленной службы, и, следовательно, имеет значение задержки.
и конвертировать из одного в другой?
Как правило, вы не будете конвертировать туда и обратно. String ЯвляетсяCharSequence . Если ваш метод объявляет, что он принимает a CharSequence, вызывающий программист может передать Stringобъект или передать что-то еще, например, StringBufferили StringBuilder. Код вашего метода будет просто использовать все, что передано, вызывая любой из CharSequenceметодов.
Самое близкое, что вы получили бы к конвертации, это если ваш код получит, CharSequenceи вы знаете, что вам нужно String. Возможно, вы взаимодействуете со старым кодом, написанным для Stringкласса, а не для CharSequenceинтерфейса. Или, возможно, ваш код будет интенсивно работать с текстом, например, многократно повторять циклы или иным образом анализировать. В этом случае вы хотите получить любой возможный удар по производительности только один раз, так что вы звоните toStringпрямо. Затем приступайте к работе, используя то, что, как вы знаете, представляет собой один фрагмент текста полностью в памяти.
Искаженная история
Обратите внимание на комментарии к принятому ответу . CharSequenceИнтерфейс был переоборудован на существующих структуры класса, так что есть некоторые важные тонкости ( equals()& hashCode()). Обратите внимание на различные версии Java (1, 2, 4 и 5), помеченные на классах / интерфейсах - с течением времени они немного изменились. В идеале CharSequenceбыло бы на месте с самого начала, но такова жизнь.
Моя диаграмма классов ниже может помочь вам увидеть общую картину типов строк в Java 7/8. Я не уверен, что все это присутствует в Android, но общий контекст может оказаться полезным для вас.
