JavaRush /Java Blog /Random-TW /喝咖啡休息#93。String 類別在 Java 中的工作原理。了解如何用 Java 實作 Web 介面

喝咖啡休息#93。String 類別在 Java 中的工作原理。了解如何用 Java 實作 Web 介面

在 Random-TW 群組發布

Java 中 String 類別的工作原理

資料來源:DZone 我最近在論壇上遇到了以下問題:「這裡創建了多少個String物件?一個或兩個?」。
String langName = new String("Java");
我很好奇其他人如何回答這個問題,因為我知道這是一個複雜的問題,特別是如果一個人不太了解 String類別Java 中如何運作的話。於是,我就一頭栽進了留言區。 喝咖啡休息#93。 String 類別在 Java 中的工作原理。 了解如何用 Java 實作 Web 介面 - 1令我驚訝的是,評論者中有選擇“一”作為正確答案的人,但更多人選擇了“二”。有那麼一瞬間,我甚至開始懷疑自己對String 的了解。正確的答案是,這一切都取決於具體情況。問題不夠明確,有爭論的空間。我會這樣重新表達:

1.執行該語句時,記憶體中創建了多少個Java String物件?

只有一個答案。

執行此語句後,記憶體中將剩餘多少個 Java String 物件?

答案是兩個。希望當我使用上面範例中的語句檢查程式的記憶體轉儲時,不確定性就消失了。 喝咖啡休息#93。 String 類別在 Java 中的工作原理。 了解如何用 Java 實作 Web 介面 - 2上圖中的程式記憶體轉儲顯示存在兩個具有相同內容的String物件。這證明呼叫String類別建構子並傳遞字串文字作為參數會導致兩個物件被添加到記憶體堆中:一個位於常規(非池)記憶體中,另一個位於字串常數池 (SCP) 中,記憶體中的區域也是堆的一部分。添加後就開始出現困難。呼叫構造函數總是會導致新物件被放置在非池區域中。但建構函數參數是一個字串文字,也是一個對象,它是在類別載入期間創建並儲存在 SCP 中的,前提是字串池不包含相同內容的字串。Java語言規範指出“字串文字——或者更一般地說,作為常量表達式值的字串(第 15.28 節)——被“實習”以使用 String 方法 . intern共享唯一實例。” 由於 Java 中的字串是文字,因此表示常數表達式的值,因此它被池化。為了使這一點更加明顯,讓我們將文章開頭提供的程式碼重寫如下:
String java = "Java";
String langName = new String(java);
現在讓我們回到主要問題。下面的語句會建立一個還是兩個String物件:
String langName = new String("Java");
為了回答這個問題並消除任何懷疑,讓我們看一下 main 方法的字節碼:
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(負載常數)指令。它將字串常數池中的元素載入到堆疊上。這意味著在呼叫建構函式時,Java 文字(也是一個物件)已經被加入到池中。這是在載入類別時發生的。因此,使用字串文字呼叫String類別建構函式只會建立一個物件並將其放置在非池化記憶體位置中。

了解如何用 Java 實作 Web 介面

資料來源:Dev.to JavaScript 世界提供了有用且有趣的 Web 框架,這是毫無疑問的。對於 Java 開發人員來說,有一個有趣的替代方案 -開源Vaadin框架。有了它,您可以僅使用 Java 程式語言而不使用其他語言輕鬆實現Web圖形使用者介面(GUI)。您無需編寫一行 HTML 或 JavaScript。一張圖片勝過千言萬語: 喝咖啡休息#93。 String 類別在 Java 中的工作原理。 了解如何用 Java 實作 Web 介面 - 3

瓦丁是如何運作的?

在螢幕截圖的左側,您可以看到一個 Java 類別。此程式碼在 Apache Tomcat、Eclipse Jetty 或任何其他 servlet 容器等伺服器上運行。您可以使用平台提供的 API 來建立使用者介面 (UI)元件,例如文字欄位、組合方塊、資料網格、日期選擇器、上傳欄位等。您可以組合這些元件來建立視圖(也稱為頁面或 UI),使用佈局垂直、水平或使用 CSS 的任何其他方式排列使用者介面 (UI) 元件。在前面的範例中,我們透過將TextFieldButton新增至VerticalLayout來建立它們。視圖準備就緒後,您可以使用@Route註釋透過 URL 開啟它。在此範例中,我們使用@Route("hello")在 http://localhost:8080/hello 上提供它。Vaadin 應用程式是 Java 中的 Web 應用程式。該框架提供了一個 Servlet 實作 ( VaadinServlet ) 來為您處理 HTTP 請求和回應。此 Servlet 掃描標示為@Route註解的 Java 類,以在瀏覽器中顯示正確的視圖。當首次請求 Vaadin 應用程式時,Vaadin 會使用充當客戶端引擎的輕量級 JavaScript 檔案進行回應。該引擎負責處理瀏覽器中的事件並將它們作為 JSON 訊息發送到伺服器。VaadinServlet物件處理請求並類似地將 JSON 回應傳回給客戶端引擎。然後,引擎使用此訊息來更新頁面上需要更新的元素(如果有)。Vaadin 使用 HTTP 會話來儲存包含使用者介面狀態的元件樹。諸如組件之類的東西形成了表示及其狀態(啟用/禁用、標題、值等)。這一切都提供了值得一提的安全等級。由於使用者介面邏輯位於伺服器上,因此攻擊者無法存取。檢查是在伺服器上執行的。例如,如果使用setEnabled(false)停用按鈕,那麼這不僅僅是瀏覽器中的裝飾功能- 伺服器不會在新增至停用按鈕的點擊偵聽器中執行任何邏輯,從而防止攻擊者利用瀏覽器中的開發人員工具會變更啟用狀態或呼叫VaadinServlet來模擬滑鼠點擊(點擊事件)。

Vaadin 可以免費使用嗎?

是的。Vaadin 是一個在 Apache License 2.0 下發布的開源框架。您無需購買任何東西即可使用它來創建成熟的 Web 應用程式。有一些商業組件可以提高性能,但它們不是必需的。例如,有一個視覺化設計器和一個 CRUD 元件可以幫助您更快地建立視圖。您可以在訂閱之前免費試用這些元件。

Vaadin 是 JSP 和 JSF 的替代品嗎?

是的。它可以用作 JSP、JSF 甚至 Angular 等 JavaScript 框架的替代品。許多 Vaadin 客戶已成功從這些技術遷移到 Vaadin。

Vaadin 支援 Spring 和 Jakarta EE 嗎?

是的。Vaadin 已與 Spring 和 Jakarta EE(以前稱為 Java EE)正式整合。使用 Spring Initializr 建立新的 Spring Boot 專案時,您可以新增 Vaadin 作為依賴項。對於 Jakarta EE,您可以下載使用 Jakarta EE 的簡單 Hello, World 範例。在撰寫本文時,僅支援 Jakarta EE 版本 8。

誰使用 Vaadin?

許多財富 500 強公司以及成功的新創公司和全球超過 20 萬名開發人員都在使用 Vaadin。查看快速入門指南和其他Vaadin 文件。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION