CharSequence VS String в Java?
программирование в Android, большинство текстовых значений ожидаются в CharSequence.
почему это? В чем польза, и каковы основные последствия использования CharSequence over String?
каковы основные различия и какие проблемы ожидаются при их использовании и преобразовании из одного в другой?
9 ответов:
строки являются CharSequences, Так что вы можете просто использовать строки и не беспокоиться. Android просто пытается быть полезным, позволяя вам также указывать другие объекты CharSequence, такие как StringBuffers.
эта диаграмма классов может помочь вам увидеть общую картину строковых типов в Java 7/8. Я не уверен, что все они присутствуют в Android, но общий контекст все еще может оказаться полезным для вас.
кроме того, обратите внимание на комментарии по принято отвечать. Элемент
CharSequenceинтерфейс был модифицирован на существующие структуры классов, поэтому есть некоторые важные тонкости (equals()&hashCode()). Обратите внимание на различные версии Java (1, 2, 4 и 5), помеченные на классы / интерфейсы-довольно много оттока за эти годы. В идеалеCharSequenceбыло бы с самого начала, но такова жизнь.
Я считаю, что лучше всего использовать CharSequence. Причина в том, что String реализует CharSequence, поэтому вы можете передать строку в CharSequence, однако вы не можете передать CharSequence в строку, так как CharSequence не реализует String. Кроме того, в Android
EditText.getText()метод возвращает редактируемый, который также реализует CharSequence и может быть легко передан в один, а не легко в строку. CharSequence обрабатывает все!
в целом использование интерфейса позволяет варьировать реализацию с минимальным сопутствующим ущербом. Хотя Ява.ленг.String очень популярны возможно, что в определенных контекстах может потребоваться использовать другую реализацию. Создавая API вокруг CharSequences, а не строк, код дает возможность сделать это.
Это почти наверняка из соображений производительности. Например, представьте себе парсер, который проходит через 500k ByteBuffer, содержащий строки.
есть 3 подхода к возвращению содержимого строки:
создать строку[] во время разбора, по одному символу за раз. Это займет заметное количество времени. Мы можем использовать == вместо .равно для сравнения кэшированных ссылок.
построить int[] со смещениями во время разбора, затем динамически построить строку, когда get() происходит. Каждая строка будет новым объектом, поэтому нет кэширования возвращаемых значений и использования ==
построить CharSequence[] во время разбора. Поскольку новые данные не хранятся (кроме смещений в байтовый буфер), синтаксический анализ намного ниже, чем #1. В get time нам не нужно создавать строку, поэтому get performance равна #1 (намного лучше, чем #2), так как мы возвращаем только ссылку на существующий объект.
In в дополнение к преимуществам обработки, которые вы получаете с помощью CharSequence, вы также уменьшаете объем памяти, не дублируя данные. Например, если у вас есть буфер, содержащий 3 абзаца текста, и вы хотите вернуть либо все 3, либо один абзац, вам нужно 4 строки для представления этого. Используя CharSequence вам нужен только 1 буфер с данными и 4 экземпляра реализации CharSequence, которая отслеживает начало и длину.
проблема, которая возникает в практическом коде Android, заключается в сравнении их с CharSequence.equals действителен, но не обязательно работает по назначению.
EditText t = (EditText )getView(R.id.myEditText); // Contains "OK" Boolean isFalse = t.getText().equals("OK"); // will always return false.сравнение должно быть сделано
("OK").contentEquals(t.GetText());
CharSequence
A
CharSequence- это интерфейс, а не класс. Интерфейс-это просто набор правил (методов), которые класс должен содержать, если он реализует интерфейс. В Android aCharSequenceявляется общим для различных типов текстовых строк. Вот некоторые из наиболее распространенных:
String(неизменяемый текст без стилизации пролетов)StringBuilder(изменяемый текст без стилизации пролеты)SpannableString(неизменяемый текст с диапазонами стилей)SpannableStringBuilder(изменяемый текст с диапазонами стилей)(вы можете узнать больше о различиях между этими здесь.)
если у вас
CharSequence"объект", то это на самом деле объект одного из классов, реализующихCharSequence. Например:CharSequence myString = "hello"; CharSequence mySpannableStringBuilder = new SpannableStringBuilder();преимущество иметь общие зонтик типа как
CharSequenceэто то, что вы можете обрабатывать несколько типов с помощью одного метода. Например, если у меня есть метод, который принимаетCharSequenceв качестве параметра, я мог бы передать вStringилиSpannableStringBuilderи он будет обрабатывать любой из них.public int getLength(CharSequence text) { return text.length(); }строка
можно сказать, что a
Stringэто всего лишь один видCharSequence. Однако, в отличие отCharSequence, это фактический класс, так что вы можете сделать объекты из него. Так что вы могли бы сделать это:String myString = new String();но вы не можете этого сделать:
CharSequence myCharSequence = new CharSequence(); // error: 'CharSequence is abstract; cannot be instantiatedС
CharSequenceэто просто список правил, которыеStringсоответствует, вы могли бы сделать это:CharSequence myString = new String();это означает, что каждый раз, когда метод запрашивает
CharSequence, это нормально, чтобы дать емуString.String myString = "hello"; getLength(myString); // OK // ... public int getLength(CharSequence text) { return text.length(); }однако обратное неверно. Если метод принимает
Stringпараметр, вы не можете передать ему то, что обычно известно только какCharSequence, потому что он может на самом деле будьSpannableStringиCharSequence.CharSequence myString = "hello"; getLength(myString); // error // ... public int getLength(String text) { return text.length(); }
CharSequence- это интерфейс иStringреализует его. Вы можете создать экземплярStringно вы не могли сделать это дляCharSequenceТак это интерфейс. Вы можете найти другие реализации вCharSequenceна официальном сайте Java.
CharSequence-это читаемая последовательность значений char, которая реализует строку. он имеет 4 метода
- charAt (int index)
- длина()
- подпоследовательность (int start, int end)
- toString ()
пожалуйста, обратитесь к документации CharSequence documentation

Comments