Charsequence android что такое

Charsequence android что такое

This interface does not refine the general contracts of the equals and hashCode methods. The result of comparing two objects that implement CharSequence is therefore, in general, undefined. Each object may be implemented by a different class, and there is no guarantee that each class will be capable of testing its instances for equality with those of the other. It is therefore inappropriate to use arbitrary CharSequence instances as elements in a set or as keys in a map.

Method Summary

All Methods Instance Methods Abstract Methods Default Methods
Modifier and Type Method and Description
char charAt (int index)

Method Detail

length

charAt

If the char value specified by the index is a surrogate, the surrogate value is returned.

subSequence

toString

chars

If the sequence is mutated while the stream is being read, the result is undefined.

codePoints

If the sequence is mutated while the stream is being read, the result is undefined.

  • Summary:
  • Nested |
  • Field |
  • Constr |
  • Method
  • Detail:
  • Field |
  • Constr |
  • Method

Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2021, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.

Источник

CharSequence против Строка в Java

Изучите различия между CharSequence и String.

Автор: baeldung
Дата записи

1. введение

Проще говоря, CharSequence и String – это две разные фундаментальные концепции в Java.

В этой краткой статье мы рассмотрим различия между этими типами и то, когда следует использовать каждый из них.

2. Последовательность

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

Конечно, интерфейс не может быть создан непосредственно; ему нужна реализация для создания экземпляра переменной:

Здесь CharSequence создается с помощью строки . Создание экземпляров других реализаций:

3. Строка

Строка – это последовательность символов в Java. Это неизменяемый класс и один из наиболее часто используемых типов в Java. Этот класс реализует интерфейсы CharSequence , Serializable и Comparable .

Ниже оба экземпляра создают Строки с одинаковым содержимым. Однако они не равны друг другу:

4. CharSequence против Строка

Давайте сравним различия и общности CharSequence и String . Они оба находятся в одном пакете с именем java.lang. , но первый-это интерфейс, а второй-конкретный класс. Кроме того, класс String является неизменяемым.

В следующем примере каждая операция sum создает другой экземпляр, увеличивает объем хранимых данных и возвращает самую последнюю созданную строку :

С другой стороны, StringBuilder обновляет уже созданную строку , чтобы сохранить новое значение:

Другое отличие заключается в том, что интерфейс не подразумевает встроенную стратегию сравнения, в то время как класс String реализует интерфейс Comparable .

Чтобы сравнить два CharSequence s, мы можем привести их к String s, а затем сравнить их:

5. Заключение

Мы обычно используем String в тех местах, где мы не уверены, что использовать для последовательностей символов. Однако в некоторых случаях StringBuilder и StringBuffer могут быть более подходящими.

Вы можете найти дополнительную информацию в JavaDocs о CharSequence и String .

И, как всегда, реализацию всех этих примеров и фрагментов кода можно найти на Github .

Источник

Charsequence android что такое

This interface does not refine the general contracts of the equals and hashCode methods. The result of testing two objects that implement CharSequence for equality is therefore, in general, undefined. Each object may be implemented by a different class, and there is no guarantee that each class will be capable of testing its instances for equality with those of the other. It is therefore inappropriate to use arbitrary CharSequence instances as elements in a set or as keys in a map.

Method Summary

All Methods Static Methods Instance Methods Abstract Methods Default Methods

Method Detail

length

charAt

If the char value specified by the index is a surrogate, the surrogate value is returned.

subSequence

toString

chars

The stream binds to this sequence when the terminal stream operation commences (specifically, for mutable sequences the spliterator for the stream is late-binding). If the sequence is modified during that operation then the result is undefined.

codePoints

The stream binds to this sequence when the terminal stream operation commences (specifically, for mutable sequences the spliterator for the stream is late-binding). If the sequence is modified during that operation then the result is undefined.

compare

The lexicographical ordering of CharSequence is defined as follows. Consider a CharSequence cs of length len to be a sequence of char values, cs[0] to cs[len-1]. Suppose k is the lowest index at which the corresponding char values from each sequence differ. The lexicographic ordering of the sequences is determined by a numeric comparison of the char values cs1[k] with cs2[k]. If there is no such index k, the shorter sequence is considered lexicographically less than the other. If the sequences have the same length, the sequences are considered lexicographically equal.

Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2021, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.

Источник

Магия CharSequence

java.lang.CharSequence только на первый взгляд кажется незатейливым интерфейсом из трех методов, но при детальном рассмотрении открывает нам несколько интересных нюансов.
Интерфейс реализуют такие java-классы как String, StringBuffer, StringBuilder, GString (groovy) и не только.

TL;DR если добавить этот интерфейс в класс, он получит часть свойств строки и появится ряд возможностей — сравнения со строками (например, String.contentEquals), использования различных строковых API (например, Pattern.matcher), а также в местах автоматического определения поведения в зависимости от типа (например, биндинг параметров запроса в jdbc).

Кроме того, этот подход упростит проведение ряда рефакторингов по усилению системы типов в приложении — в первую очередь замены объектов типа String на специализированные обертки или enum-константы.

Строковые скаляры

Для добавления ограничений на формат значения, а также усиления type safety, вместо строк могут использоваться специальные скалярные обертки. Для понимания рассмотрим пример — пусть ID клиента является строкой, соответствующей регулярному выражению. Его класс-обертка будет выглядеть примерно так:

Такой объект теряет свойства строки и, чтобы их вернуть, нужно делать вызов getValue() или toString(). Но можно поступить иначе — подмешать в наш класс CharSequence.

Рассмотрим интерфейс (java 8):

Если добавить его в наш класс, т.е.

то появится ряд возможностей.

Например, теперь можно будет писать так:

Сравнение строк

Сравнение строк — одна из наиболее часто используемых операций работы со строками. Наиболее стандартный вариант — вызов String.equals(otherString). Первая проблема, с которой мы можем столкнуться — это null-safety, традиционно она решается flip-ом объекта с аргументом, если один из них-константа: STRING_CONSTANT.equals(value). Если любой из аргументов может быть null, на помощь придет java.util.Objects.equals(o1, o2).

В реалиях сложных и больших проектов нас поджидает еще одна проблема equals — слабый typesafety аргумента (любой Object). На практике это означает, что в качестве аргумента equals можно передать любой объект (например, Integer или Enum), компилятор на это даже не даст warning, вызов просто вернет false. Резонно заметить, что такую ошибку легко выявить на этапе разработки — тут и IDE подскажет и на первых тестах это будет выявлено. Но когда проект вырастает в размерах, превращается в legacy и при этом продолжает развиваться, рано или поздно может возникнуть ситуация, когда STRING_CONSTANT превратится из String в Enum или Integer. Если покрытие тестами недостаточно высокое, equals начнет давать ложный false.

, но хорошие практики — они про предотвращение, а не про борьбу с последствиями.

Для усиления проверки типов на этапе компиляции вызов equals можно заменить на String.contentEquals(CharSequence), либо на org.apache.commons.lang3.StringUtils.equals(CharSequence, CharSequence)
Оба эти варианта хороши тем, что теперь мы можем сравнивать String с нашим ClientId без дополнительных преобразований, в случае последнего — в т.ч. еще и null-safe.

Рефакторинги

Описанная выше ситуация может показаться несколько надуманной, но это решение пришло в результате различных рефакторингов legacy-кода. Типовая правка, о которой в данном случае идет речь — замена объектов типа String на классы-обертки или enum-константы. Классы-обертки могут использоваться для целого ряда типовых immutable-строк — номера договоров, карт, телефонов, пароли, хеш-суммы, названия конкретных типов элементов и пр. Класс-обертка помимо проверки формата значения может добавлять специфичные методы работы с ним. Если подходить к такому рефакторингу не очень осторожно, можно наткнуться на ряд проблем — первая из которых — небезопасный equals.

Ограничение есть для классов-оберток, которые оборачивают не String, а например, числовые значения. В таком случае, вызов toString может быть относительно дорогим (для того же последовательного вызова charAt для всей строки) — здесь потенциально можно использовать ленивое закешированное String-представление.

Биндинг аргументов в запросы jdbc

Сразу уточню, что речь в данном случае идет о spring-jdbc, биндинг через JdbcTemplate/NamedParameterJdbcTemplate
Мы можем передать объект класса ClientId в биндинге значения параметра, т.к. он реализует CharSequence:

Если рассматривать данный код как переделанный из изначальной декларации getClient(String clientId), то, что касается использования переданного значения, то здесь все останется без изменений.

Заключение

Я использую этот метод в своих проектах уже несколько месяцев и пока не столкнулся с какими-либо проблемами.

API, которое использует CharSequence вместо String достаточно богато — достаточно сделать find usages для CharSequence. Особое внимание можно уделить библиотеке Android — там его особенно много, но здесь я боюсь что-либо советовать, т.к. на нем данный метод еще не проверял.

Буду рад получить фидбек по вопросу — что вы думаете по этому поводу, какой профит/грабли здесь есть и есть ли вообще смысл использовать подобные практики.

Источник

CharSequence против строки в Java?

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

почему это? В чем преимущество, и каковы основные последствия использования CharSequence над String ?

каковы основные различия и какие проблемы ожидаются при их использовании и преобразовании из одного в другой?

9 ответов

строки являются CharSequences, Так что вы можете просто использовать строки и не беспокоиться. Android просто пытается быть полезным, позволяя вам также указывать другие объекты CharSequence, такие как StringBuffers.

эта диаграмма классов может помочь вам увидеть общую картину строковых типов в Java 7/8. Я не уверен, что все они присутствуют в Android, но общий контекст все еще может оказаться полезным для вас.

кроме того, обратите внимание на комментарии по принято отвечать. The CharSequence интерфейс был модифицирован на существующие структуры классов, поэтому есть некоторые важные тонкости ( equals() & hashCode() ). Обратите внимание на различные версии Java (1, 2, 4 & 5) с метками на классы / интерфейсы-довольно много оттока на протяжении многих лет. В идеале CharSequence было бы с самого начала, но такова жизнь.

Я считаю, что лучше всего использовать CharSequence. Причина в том, что String реализует CharSequence, поэтому вы можете передать строку в CharSequence, однако вы не можете передать CharSequence в строку, поскольку CharSequence не реализует String. Кроме того, в Android EditText.getText() метод возвращает редактируемый, который также реализует CharSequence и может быть легко передан в один, а не в строку. CharSequence обрабатывает все!

в целом использование интерфейса позволяет варьировать реализацию с минимальным сопутствующим ущербом. Хотя java.ленг.Строка очень популярна возможно, что в определенных контекстах может потребоваться использовать другую реализацию. Создавая API вокруг CharSequences, а не строк, код дает возможность сделать это.

Это почти наверняка из соображений производительности. Например, представьте себе парсер, который проходит через 500k ByteBuffer, содержащий строки.

существует 3 подхода к возвращению содержимого строки:

создайте строку[] во время синтаксического анализа, по одному символу за раз. Это займет заметное количество времени. Мы можем использовать == вместо .равно для сравнения кэшированных ссылок.

создайте int[] с смещениями во время синтаксического анализа, затем динамически строить строку, когда get() происходит. Каждая строка будет новым объектом, поэтому нет кэширования возвращаемых значений и использования ==

построить CharSequence[] во время разбора. Поскольку новые данные не сохраняются (кроме смещений в байтовый буфер), синтаксический анализ намного ниже, чем #1. В get time нам не нужно создавать строку, поэтому производительность get равна #1 (намного лучше, чем #2), так как мы возвращаем только ссылку на существующий объект.

In в дополнение к преимуществам обработки, которые вы получаете с помощью CharSequence, вы также уменьшаете объем памяти, не дублируя данные. Например, если у вас есть буфер, содержащий 3 абзаца текста, и вы хотите вернуть все 3 или один абзац, вам нужно 4 строки, чтобы представить это. При использовании CharSequence требуется только 1 буфер с данными и 4 экземпляра реализации CharSequence, отслеживающей начало и длину.

Источник

Читайте также:  Steam клиент для андроид
Оцените статью
Modifier and Type Method Description
char charAt ​(int index)