Программирование в Android, большинство текстовых значений ожидается в CharSequence
.
Это почему? В чем выгода, и каковы основные последствия использования CharSequence
более String
?
Каковы основные различия и какие проблемы ожидаются при их использовании и преобразовании из одного в другое?
java
string
charsequence
е-удовлетворяться
источник
источник
Ответы:
Строки - это CharSequence , поэтому вы можете просто использовать Strings и не беспокоиться. Android просто пытается быть полезным, позволяя вам также указывать другие объекты CharSequence, например StringBuffers.
источник
CharSequence
Javadoc: Этот интерфейс не уточняют общие договоровequals
иhashCode
методов. Поэтому результат сравнения двух реализуемых объектов,CharSequence
как правило, не определен . Каждый объект может быть реализован отдельным классом, и нет никакой гарантии, что каждый класс будет способен проверять свои экземпляры на равенство с другими. Поэтому нецелесообразно использовать произвольныеCharSequence
экземпляры в качестве элементов в наборе или в качестве ключей на карте.CharSequence
был модифицирован в JDK 1.4 для введения общего интерфейса с ограниченными целями для объектов, содержащих последовательности символов. Некоторые из этих объектов содержат другое состояние, поэтому может не иметь смысла определятьObject.equals
как «содержит ту же последовательность символов».CharBuffer
Например, NIO предоставляет только символы между своимиposition
иlimit
какCharSequence
, несмотря на то , что потенциально может содержать много других символов.equals
/hashCode
наObject
в первую очередь ....Object
илиCharSequence
, интерфейс не требуется для обеспечения равенства здравомыслия между реализациями. Нет двухCollection
обязательных для обеспечения равенства междуCollection
интерфейсом, но они могут, если захотят. ИМХОCharSequence
должно быть ограничено входами и меньше использоваться для типов возврата.CharSequence
= интерфейсString
= конкретная реализацияCharSequence
это интерфейс .String
один из таких классов, конкретная реализацияCharSequence
.Вы сказали:
Там нет конвертации из
String
.String
объект являетсяCharSequence
.CharSequence
может изготовитьString
. ВызовCharSequence::toString
. ЕслиCharSequence
случаем является aString
, то метод возвращает ссылку на свой собственный объект.Другими словами, каждый
String
являетсяCharSequence
, но не каждыйCharSequence
являетсяString
.Программирование на интерфейс
Как правило, программирование для интерфейса лучше, чем программирование для конкретных классов. Это обеспечивает гибкость, поэтому мы можем переключаться между конкретными реализациями определенного интерфейса, не нарушая другой код.
При разработке API который будет использоваться различными программистами в различных ситуациях, напишите свой код, чтобы предоставить и использовать самые общие возможные интерфейсы. Это дает вызывающему программисту свободу использовать различные реализации этого интерфейса, независимо от того, какая реализация лучше всего подходит для их конкретного контекста.
Например, посмотрите на Java Collections Framework . Если API дает или принимает упорядоченную коллекцию объектов, объявлять методы, используя
List
вместоArrayList
,LinkedList
или любой другой реализации третьей стороной вList
.При написании быстрого и грязного метода, который будет использоваться только вашим кодом в одном конкретном месте, в отличие от написания API, который будет использоваться в нескольких местах, вам не нужно беспокоиться об использовании более общего интерфейса, а не конкретного конкретного учебный класс. Но даже тогда было бы больно использовать самый общий интерфейс, какой только можно.
String
вы знаете, что у вас есть один фрагмент текста, полностью в памяти, и является неизменным.CharSequence
вы не знаете, какими могут быть конкретные особенности конкретной реализации.CharSequence
Объект может представлять собой огромный кусок текста, и , следовательно , имеет значение памяти. Или может быть много фрагментов текста, отслеживаемых отдельно, которые нужно будет сшивать вместе, когда вы звонитеtoString
, и поэтому возникают проблемы с производительностью. Реализация может даже извлекать текст из удаленной службы, и, следовательно, имеет значение задержки.Как правило, вы не будете конвертировать туда и обратно.
String
ЯвляетсяCharSequence
. Если ваш метод объявляет, что он принимает aCharSequence
, вызывающий программист может передатьString
объект или передать что-то еще, например,StringBuffer
илиStringBuilder
. Код вашего метода будет просто использовать все, что передано, вызывая любой изCharSequence
методов.Самое близкое, что вы получили бы к конвертации, это если ваш код получит,
CharSequence
и вы знаете, что вам нужноString
. Возможно, вы взаимодействуете со старым кодом, написанным дляString
класса, а не дляCharSequence
интерфейса. Или, возможно, ваш код будет интенсивно работать с текстом, например, многократно повторять циклы или иным образом анализировать. В этом случае вы хотите получить любой возможный удар по производительности только один раз, так что вы звонитеtoString
прямо. Затем приступайте к работе, используя то, что, как вы знаете, представляет собой один фрагмент текста полностью в памяти.Искаженная история
Обратите внимание на комментарии к принятому ответу .
CharSequence
Интерфейс был переоборудован на существующих структуры класса, так что есть некоторые важные тонкости (equals()
&hashCode()
). Обратите внимание на различные версии Java (1, 2, 4 и 5), помеченные на классах / интерфейсах - с течением времени они немного изменились. В идеалеCharSequence
было бы на месте с самого начала, но такова жизнь.Моя диаграмма классов ниже может помочь вам увидеть общую картину типов строк в Java 7/8. Я не уверен, что все это присутствует в Android, но общий контекст может оказаться полезным для вас.
источник
Я считаю, что лучше всего использовать CharSequence. Причина в том, что String реализует CharSequence, поэтому вы можете передать String в CharSequence, ОДНАКО вы не можете передать CharSequence в String, так как CharSequence не реализует String. Кроме того, в Android
EditText.getText()
метод возвращает Editable, который также реализует CharSequence и может быть легко передан в один, а не просто в String. CharSequence обрабатывает все!источник
charSequence.toString()
В целом использование интерфейса позволяет варьировать реализацию с минимальным побочным ущербом. Несмотря на то, что java.lang.String очень популярны, возможно, что в определенных контекстах вы захотите использовать другую реализацию. Путем построения API вокруг CharSequence, а не Strings, код дает возможность сделать это.
источник
Это почти наверняка из соображений производительности. Например, представьте анализатор, который проходит через 500k ByteBuffer, содержащий строки.
Есть 3 подхода к возвращению содержимого строки:
Создайте строку [] во время разбора, по одному символу за раз. Это займет заметное количество времени. Мы можем использовать == вместо .equals для сравнения кэшированных ссылок.
Создайте int [] со смещениями во время разбора, затем динамически создайте String, когда произойдет get (). Каждая строка будет новым объектом, поэтому нет кэширования возвращаемых значений и использования ==
Создайте CharSequence [] во время разбора. Поскольку никакие новые данные не сохраняются (кроме смещений в байтовом буфере), синтаксический анализ намного ниже, чем # 1. Во время получения нам не нужно создавать String, поэтому производительность get равна # 1 (намного лучше, чем # 2), поскольку мы только возвращаем ссылку на существующий объект.
В дополнение к преимуществам обработки, которые вы получаете с помощью CharSequence, вы также уменьшаете объем памяти, не дублируя данные. Например, если у вас есть буфер, содержащий 3 абзаца текста, и вы хотите вернуть все 3 или один абзац, вам нужно 4 строки для представления этого. При использовании CharSequence вам нужен только 1 буфер с данными и 4 экземпляра реализации CharSequence, которая отслеживает начало и длину.
источник
CharSequence
реализацию.CharSequence
- это интерфейс - по определению он не имеет ни одной детали реализации, которую вы обсуждаете, потому что у него нет собственной реализации.String
- это один из нескольких конкретных классов, который реализуетCharSequence
интерфейс. Таким образом,String
этоCharSequence
. Вы можете сравнить детали производительностиString
противStringBuffer
противStringBuilder
, но неCharSequence
. Писать «выгоды обработки, которые вы получаете с помощью CharSequence» бессмысленно.Проблема, которая возникает в практическом коде Android, состоит в том, что сравнение их с CharSequence.equals допустимо, но не обязательно работает так, как задумано.
Сравнение должно быть сделано
источник
CharSequence
A
CharSequence
- это интерфейс, а не реальный класс. Интерфейс - это просто набор правил (методов), которые должен содержать класс, если он реализует интерфейс. В AndroidCharSequence
есть зонтик для различных типов текстовых строк. Вот некоторые из распространенных:String
(неизменный текст без разметки)StringBuilder
(изменяемый текст без интервалов стиля)SpannableString
(неизменный текст с пролетами стиля)SpannableStringBuilder
(изменяемый текст со стилями)(Вы можете прочитать больше о различиях между этими здесь .)
Если у вас есть
CharSequence
объект, то это фактически объект одного из реализующих классовCharSequence
. Например:Преимущество использования общего типа зонтика в
CharSequence
том, что вы можете обрабатывать несколько типов одним методом. Например, если у меня есть метод, который принимает aCharSequence
в качестве параметра, я мог бы передать aString
или a,SpannableStringBuilder
и он обработал бы любой из них.строка
Можно сказать, что это
String
всего лишь один из видовCharSequence
. Однако, в отличие от этогоCharSequence
, это фактический класс, поэтому вы можете создавать объекты из него. Так что вы можете сделать это:но вы не можете сделать это:
Так как
CharSequence
это просто список правилString
, которые можно выполнить, вы можете сделать это:Это означает, что всякий раз, когда метод запрашивает a
CharSequence
, можно дать ему aString
.Однако обратное неверно. Если метод принимает
String
параметр, вы не можете передать ему что-то, что обычно известно как aCharSequence
, потому что это может быть aSpannableString
или какой-либо другой видCharSequence
.источник
CharSequence
это интерфейс иString
реализует его. Вы можете создать экземпляр,String
но вы не могли этого сделать,CharSequence
поскольку это интерфейс. Вы можете найти другие реализацииCharSequence
на официальном веб-сайте Java.источник
CharSequence - читаемая последовательность значений char, которая реализует String. у него 4 метода
Пожалуйста, обратитесь к документации CharSequence документации
источник
CharSequence
не реализуетString
. Обратное, правда, правда.