JavaRush /Java блог /Random /Кофе-брейк #93. Как работает класс String в Java. Узнайте...

Кофе-брейк #93. Как работает класс String в Java. Узнайте, как реализовать веб-интерфейс на Java

Статья из группы Random

Как работает класс String в Java

Источник: DZone Недавно на форуме я наткнулся на следующий вопрос: “Сколько здесь создается объектов String? Один или два?”.

String langName = new String("Java");
Мне было любопытно, как на него ответили другие, зная, что это сложный вопрос, особенно если кто-то плохо осведомлен, как работает класс String в Java. И вот, я погрузился в раздел комментариев. Кофе-брейк #93. Как работает класс String в Java. Узнайте, как реализовать веб-интерфейс на Java - 1К моему удивлению, среди комментаторов нашлись люди, которые выбрали “Один” в качестве правильного ответа, но намного больше людей ответили “Два”. На какую-то секунду я даже начал сомневаться в своих знаниях о Strings. Правильный ответ — все зависит от обстоятельств. Вопрос недостаточно ясен и оставляет место для дискуссий. Я бы переформулировал это следующим образом:

1. Сколько объектов Java String создается в памяти при выполнении этого оператора?

Ответ — один.

Сколько объектов Java String останется в памяти после выполнения этого оператора?

Ответ — два. Надеюсь, неопределенность исчезла, как только я проверил дамп памяти программы с оператором, как в приведенном выше примере. Кофе-брейк #93. Как работает класс String в Java. Узнайте, как реализовать веб-интерфейс на Java - 2Дамп памяти программы на представленном выше изображении показывает существование двух объектов String с одинаковым содержимым. Это доказывает, что вызов конструктора класса String и передача в качестве аргумента строкового литерала приводит к добавлению двух объектов в кучу памяти: один — в обычной (не пул) памяти, а другой — в String Constant Pool (SCP) — области в памяти, которая также является частью кучи. Сложности начинаются после добавления. Вызов конструктора всегда приводит к помещению нового объекта в область, не являющуюся пулом. Но аргумент конструктора, который является строковым литералом, также является объектом, и он создается и сохраняется в SCP во время загрузки класса, при условии, что пул строк не содержит строки с таким же содержимым. В Спецификации языка Java указано, что “строковые литералы — или, в более общем смысле, строки (Strings), которые являются значениями константных выражений (§15.28), — “интернируются” для совместного использования уникальных экземпляров (instances) с применением метода String.intern”. Поскольку строка в Java является буквальной и, следовательно, представляет значение константного выражения, она объединяется в пул. Чтобы сделать это еще более очевидным, давайте перепишем код, представленный в начале статьи, следующим образом:

String java = "Java";
String langName = new String(java);
А теперь вернемся к основному вопросу. Будет ли следующий оператор создавать один или два объекта String:

String langName = new String("Java");
Чтобы ответить на этот вопрос и устранить любые подозрения, давайте посмотрим на байт-код основного метода:

public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 11 L0
    NEW java/lang/String
    DUP
    LDC "Java"
    INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V
    ASTORE 1
                    
   L1
    LINENUMBER 14 L1
   FRAME APPEND [java/lang/String]
    GOTO L1
    
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    LOCALVARIABLE langName Ljava/lang/String; L1 L2 1
    MAXSTACK = 3
    MAXLOCALS = 2
В строке 6 вы можете увидеть команду LDC (Load Constant). Она загружает элемент из пула констант строк в стек. Это означает, что на момент вызова конструктора литерал Java, который также является объектом, уже был добавлен в пул. Это произошло во время загрузки класса. Таким образом, вызов конструктора класса String со строковым литералом создает только один объект и помещает его в область памяти, не относящуюся к пулу.

Узнайте, как реализовать веб-интерфейс на Java

Источник: Dev.to Мир JavaScript предлагает полезные и забавные веб-фреймворки, в этом нет никаких сомнений. Для Java-разработчиков есть интересная альтернатива — фреймворк Vaadin с открытым исходным кодом. С его помощью вы можете легко реализовать графический интерфейс пользователя (GUI) для web, используя только язык программирования Java и ничего больше. Не нужно писать ни строчки HTML или JavaScript. Одна картинка стоит тысячи слов: Кофе-брейк #93. Как работает класс String в Java. Узнайте, как реализовать веб-интерфейс на Java - 3

Как работает Vaadin?

Слева на скриншоте вы видите класс Java. Этот код работает на сервере, например, Apache Tomcat, Eclipse Jetty или любом другом контейнере сервлетов. Вы можете использовать API, предоставляемый платформой, для создания компонентов пользовательского интерфейса (UI), таких как текстовые поля, поля со списком (combo boxes), таблиц данных (data grids), средства выбора даты, поля для загрузки и многие другие. Вы можете комбинировать эти компоненты для создания представления (также известного как page или UI), используя макеты для размещения компонентов пользовательского интерфейса (UI) по вертикали, горизонтали или любым другим способом с использованием CSS. В предыдущем примере мы создали TextField и Button, добавив их в VerticalLayout. Когда представление будет готово, вы можете открыть его через URL-адрес, используя аннотацию @Route. В этом примере мы сделали его доступным по адресу http://localhost:8080/hello, используя @Route("hello"). Приложение Vaadin — это веб-приложение на Java. Фреймворк предоставляет Servlet реализацию (VaadinServlet), которая обрабатывает HTTP-запросы и ответы за вас. Этот сервлет сканирует классы Java, отмеченные аннотацией @Route, чтобы отобразить правильное представление в браузере. При первом запросе Vaadin-приложения Vaadin отвечает облегченным файлом JavaScript, который служит клиентским движком. Этот движок заботится об обработке событий в браузере и отправке их на сервер в виде сообщений JSON. Объект VaadinServlet обрабатывает запросы и аналогичным образом возвращает ответы JSON механизму на стороне клиента. Затем движок использует это сообщение для обновления элементов на странице, которые необходимо обновить, если таковые имеются. Vaadin использует HTTP-сессию для хранения дерева компонентов, которое содержит состояние пользовательского интерфейса. Такие вещи, как компоненты, формируют представление и их состояния (enabled/disabled, caption, value и др.). Это все обеспечивает уровень безопасности, о котором стоит упомянуть. Поскольку логика пользовательского интерфейса находится на сервере, злоумышленникам она не доступна. Проверки выполняются на сервере. Например, если Button отключен с помощью setEnabled(false), то это не просто косметическая функция в браузере — сервер не будет запускать какую-либо логику в прослушивателях кликов (click listeners), добавленных к неактивной кнопке, что не позволяет злоумышленникам использовать инструменты разработчика в браузере для изменения включенного состояния или вызова VaadinServlet для имитации нажатия на мышь (click event).

Можно ли использовать Vaadin бесплатно?

Да. Vaadin — это среда с открытым исходным кодом, опубликованная под лицензией Apache License 2.0 . Вам не нужно ничего покупать, чтобы создавать на нем полноценные веб-приложения. Есть коммерческие компоненты, которые повышают производительность, но они не являются обязательными. Например, есть визуальный дизайнер и компонент CRUD, которые помогут вам создавать представления еще быстрее. Вы можете попробовать эти компоненты бесплатно перед оформлением подписки.

Является ли Vaadin заменой JSP и JSF?

Да. Его можно использовать как замену JSP, JSF и даже фреймворкам JavaScript, таким как Angular. Многие клиенты Vaadin успешно перешли с этих технологий на Vaadin.

Имеется ли у Vaadin поддержка Spring и Jakarta EE?

Да. У Vaadin есть официальная интеграция со Spring и Jakarta EE (ранее Java EE). Вы можете добавить Vaadin в качестве зависимости при создании нового проекта Spring Boot с помощью Spring Initializr. Для Jakarta EE вы можете загрузить простой пример Hello, World, в котором используется Jakarta EE. На момент написания этой статьи поддерживается только Jakarta EE версии 8.

Кто использует Vaadin?

Многие компании из списка Fortune 500 используют Vaadin, а также успешные стартапы и более 200 тысяч разработчиков по всему миру. Ознакомьтесь с инструкцией по быстрому запуску и другой документацией по Vaadin.
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ