Nano Hash - криптовалюты, майнинг, программирование

эквивалентность Ruby: символ в Java?

заметил изящные особенности рубиновые символы здесь

Есть ли в java что-то подобное? как бы это называлось?

D не думаю, что окончательная строка будет выполнять все функции. особенно то, как он хранится, и для сравнения ему все равно понадобится toString.

11.10.2013

  • Просто для уточнения: строки Ruby ведут себя как изменяемые, но на самом деле неизменные, как символы. Он внутренне создает новые строки и заменяет ссылку, указывающую на новую. 09.04.2015
  • Чтобы конкретно адресовать хранение и сравнение, interned String будет обеспечивать аналогичное поведение (каким обычно будут строковые литералы). 22.01.2017

Ответы:


1

Символ в ruby ​​— это просто неизменяемая строка. Эквивалент Java будет просто обычным String. Я действительно не вижу там слишком много специфических для ruby ​​функций, за исключением, может быть, этой утечки памяти...

13.10.2013

2

Символы на самом деле являются неизменяемыми идентификаторами. Они не могут быть изменены, не удаляются сборщиком мусора и имеют преимущества в производительности по сравнению со строками. Я предполагаю, что вы уже знаете, что такое String. Таким образом, ответ будет таким: в Java нет ничего похожего на символы.

Как сказал @Idan (и это довольно умно), перечисления можно использовать как символы, за исключением того, что у них нет методов, которые вы можете вызывать. И символы в Ruby не являются неизменяемыми строками.

См. этот пост, если вы хотите знать их основные различия.

19.03.2014
  • Утверждение, что перечисления не имеют методов, вводит в заблуждение или дезинформирует. 22.01.2017
  • @MattWhipple Когда я писал этот ответ, я действительно был дезинформирован. Ответ отредактирован. 23.01.2017

  • 3

    Общий ответ на вопрос "Есть ли в Java эта функция?" вопрос "нет!". Однако перечисления обычно могут решить те же проблемы, что и символы.

    11.10.2013
  • +1, чтобы стереть минус, который мы оба получили. Всегда думал, что отрицательные голоса без комментариев были довольно незрелыми. 11.10.2013
  • Удивительно, спасибо, хотел переписать старый код Java, чтобы использовать его, и я думаю, что перечисления сделают свое дело. 11.10.2013

  • 4

    Символ Ruby — это неизменяемый строковый объект, который индексируется в таблице символов для повторного использования по одной ссылке (отсюда очень изобретательная номенклатура!).

    В Java все String объекты являются неизменяемыми, и все из них индексируются в таблице символов (с изобретательским названием) для повторного использования JVM (при условии, что они упоминается и живет).

    Итак, в Java String ("my_symbol") эквивалентен символу Ruby (:my_symbol).

    Чтобы получить что-то эквивалентное Ruby 'my string' (неизменяемое), вам придется перейти к более сложным классам Java (new StringBuilder("my string") и т. д.). Или, если Groovy загрузил JVM, он накладывает аналогичную изменяемую концепцию с GString.

    08.04.2015
  • Примечание о повторном использовании вводит в заблуждение. Литералы интернируются и используются повторно, а строки, созданные во время выполнения, как правило, нет (о чем свидетельствует большинство дампов кучи). 22.01.2017
  • GString также являются другим животным и не предназначены для общего поведения типа привязки, связанного с изменяемыми объектами. Я думаю, что если ваш дизайн требует такого псевдонима, его лучше всего выразить с помощью базового изменяемого компонента со строковым свойством и описательным именем... Или даже AtomicReference<String> 22.01.2017
  • Или вырежьте оболочку String и просто используйте массив или список символов. 22.01.2017

  • 5

    Самое близкое, что вы можете получить к символу Ruby в Java, это вызвать intern() для строки. В то время как в Java у вас может быть много объектов String с одинаковым содержимым, intern гарантирует, что он возвращает один и тот же объект для одного и того же содержимого (последовательности символов), поэтому он возвращает каноническое/различное значение. Таким образом, в то время как для общих строк Java вам нужно вызвать метод equals для проверки на равенство содержимого, для интернированных строк вы можете просто использовать оператор ==.

    Дополнительные сведения см. на странице https://en.wikipedia.org/wiki/String_interning.

    13.07.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..