java筆記(2):String(1)

来源:https://www.cnblogs.com/chenxina/archive/2018/04/06/8698370.html
-Advertisement-
Play Games

參考資料:網易雲網課地址 http://study.163.com/course/courseMain.htm?courseId=1455026 一、String類的兩種實例化方法 (1)直接賦值 以上代碼可以輸出str的值,說明str 已被實例化(未實例化會為null)。我們知道String類並不 ...


參考資料:網易雲網課地址 

http://study.163.com/course/courseMain.htm?courseId=1455026

 

一、String類的兩種實例化方法

(1)直接賦值 

public class Test {
    public static void main(String arg[]) {
        String str = "hello world";
        System.out.println(str);
    }
}

以上代碼可以輸出str的值,說明str 已被實例化(未實例化會為null)。我們知道String類並不是基本數據類型,然而以上代碼並沒有用new關鍵字開闢記憶體空間。

(2)利用構造方法實例化:

其實在String類裡面含有一個構造方法: public String(String str) 在構造裡面依然要接收一個本類對象。

public class Test {
    public static void main(String args[]) {
        String str = new String("Hello World");
        System.out.println(str);
    }
}

說明String類有兩種形式,大家主觀上應該會認為第二種更加的符合規範,因為一般認為類都需使用new關鍵字來實例化。但實際來說並不是這樣的,具體得往下看。

二、字元串的比較

基本數值都可用“==”判斷是否相等,String也可以用“==”進行比較

public class B {    
    public static void main(String[] args) {
        String stra = "Hello";
        String strb = new String("Hello");
        String strc = strb;//引用傳遞
        System.out.println(stra == strb);
        System.out.println(stra == strc);
        System.out.println(strb == strc);
    }
}

輸出結果為:

false
false
true

記憶體圖分析如下:

“==”符號比較的時數據的地址數值,由圖可知,雖然三個變數內容相同,但是地址值並不相同。

如果真要比較地址所指向的內容,可以使用String類裡面提供的方法 public boolean equals;

 

public class B {    
    public static void main(String[] args) {
        String stra = "Hello";
        String strb = new String("Hello");
        String strc = strb;//引用傳遞
        System.out.println(stra.equals(strb));
        System.out.println(stra.equals(strc));
        System.out.println(strb.equals(strc));
    }
}

結果為

true
true
true

 

以上通過equals方法實現了內容的比較,故應當註意在比較字元串時應當使用此方法

一道題目:

請解釋在字元串相等的判斷中“==”與“equals”的區別?

(1)“==”時Java提供的關係運算符,主要功能是進行數值相等判斷,如果用在String對象上,表示的是地址數值的比較;

(2)“equals()”是有String提供的一個方法,此方法專門負責進行字元串內容的比較;

三、字元串常量就是String的匿名對象

實際上任何語言都沒有提供字元串這一概念,很多語言使用字元數組來描述。Java里也沒有字元串這一基本數據類型,而是通過String類的匿名對象來實現。

例:觀察字元串是匿名對象

public class B {    
    public static void main(String[] args) {
        String stra = "Hello";
        System.out.println("Hello".equals(stra));
    }
}

匿名對象能夠調用方法,故說明字元串為一個匿名對象

 

  所謂的直接賦值相當於 將一個對象設置了一個名字,但唯一的區別是,String類的匿名對象是由系統自動生成的,並不是由用戶直接定義。

開發小技巧:

為了避免出現空指向異常,可將字元串寫在前面調用方法

String  input = //由用戶輸入
input。equals("hello")

以上代碼input由用戶輸入賦值,如果用戶沒有輸入則為空,那麼就會出現空指向異常。

為了儘量避免這一情況發生,可將其倒置

String  input = //由用戶輸入
“hello”.equals(input)

 

四、兩種實例化方式的區別

下麵探討String類兩種實例化方式的區別

1.直接賦值

直接賦值就是將一個字元串的匿名對象設置一個名字

String str = "Hello";

此時在記憶體中會開闢一塊堆記憶體,並且由一塊棧記憶體指向該堆記憶體

           

 我們接著分析以下代碼:

 

public class Test {
    public static void main(String args[] ) {
        String stra = "hello" ;
        String strb = "hello" ;
        String strc = "hello" ;
        System.out.println(stra == strb) ;
        System.out.println(stra == strc) ;
        System.out.println(strb == strc) ;
    }
}

結果為:

true
true
true

此時我們發現,三個比較值都為真,也就是說三個String對象地址值相等(即三個變數名stra,strb,strc指向同一堆記憶體,為同一個對象)。

要想解釋以上結果,需引入共用模式的概念:

在JVM的底層存在有一個對象池(不一定只保存String對象),如果用直接賦值的方式進行String對象的實例化,會將該實例化對象(字元串)入池保存,如果下次繼續使用直接複製方式聲明String對象,並且設置了同樣的內容(字元串值),那麼將直接進行引用,不會開闢新的堆記憶體空間。(所謂的對象池就是一個對象數組)。

2.構造方法

構造方法即使用new關鍵字

String str = new String("hello");

記憶體圖分析

   可以發現,如果使用構造方法將會開闢兩塊堆記憶體空間,並且其中一塊堆記憶體空間將變成垃圾空間。另外還會對字元串共用產生問題。

 

public class Test {
    public static void main(String args[] ) {
        String stra = new String("hello") ;
        String strb = "hello" ;
        System.out.println(stra == strb) ;
       
    }
}

結果為

false

如果使用了構造方法其內容並不會保存在記憶體池之中。

如果希望存入記憶體池,需手工使用intern()方法

public class Test {
    public static void main(String args[] ) {
        String stra = new String("hello") .intern();
        String strb = "hello" ;
        System.out.println(stra == strb) ;
       
    }
}

結果為

true

 

 

五、總結

String類對象兩種實例化方式的區別:

(1)直接賦值:只會開闢一塊堆記憶體空間,並且會自動保存在對象池中供下次使用;

(2)構造方法: 會開闢兩塊堆記憶體空間,一塊將稱為垃圾,並且將不會自動保存在對象池中,可以使用intern()方法手工入池。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原生JavaScript實現頁面回到頂部的功能,如果想實現點擊一個按鈕讓滾動條回到最頂部的功能,首先可能就會想到它是從底部位置移動到頂部的位置 它是一個運動的過程,只要知道當前位置(current Position)和想要到達的位置(target Position)不就可以啦 只不過以前用的都是元素... ...
  • 迭代器在STL運用廣泛,類似容器的迭代已經成為其重要特性,而迭代器模式則是利用迭代器概念進行的抽象運用,迭代器模式運用廣泛和有用,因為其能夠不考慮數據的存儲方式,而是直接面對數據進行迭代,也就是說我們不用考慮集合是數組(或vector)、鏈表、棧還是隊列,而是通過統一的介面進行順序的訪問。 作用 迭 ...
  • 我有點像瘋子,一個人開了一天酒店,來寫這個。我發現我寫這個系列,閱讀的人很少。也許是程式員不重視思想的東西,也許是感覺我寫的很Low,無所謂,我只想告訴同行,程式員重在編程思想,有了編程思想技術的路才能走的更長更遠。我很孤獨,在自己的小世界里存活著。但是我也要耐著孤獨,向更好的方向發展需要孤獨,孤獨 ...
  • 進程的三態模型 細分進程狀態圖 進程的通信 互斥:一次只能供一個進程使用的資源。 同步:多個進程併發進行,可能需要等待。 生產者與消費者 PV操作 PV操作是實現進程同步與互斥的常用方法,在執行期間不可分割。P代表申請一個資源,V代表釋放一個資源。 P操作定義 :S1:=S1-1,若S>=0,則P操... ...
  • 觀察者模式通常的叫法叫做訂閱 發佈模式,類似於報刊雜誌的訂閱,觀察者和被觀察者就是讀者和郵局的關係,讀者先要在郵局訂閱想要的報刊,當報刊發行時,郵局會將報刊郵寄到讀者家裡。觀察者(Observer)和被觀察者(Listener)也是這種關係,Observer將自己attach到Listener中,當 ...
  • 服務拆分具體拆分到多細,業內沒有一個統一的標準。當然也不能為了拆分而拆分,還要依據具體的業務場景應用情況而定,讀過《淘寶技術這十年》的朋友,相信對淘寶的技術演進有一個很直觀的感受。雖然當時微服務的概念並不今天這般火熱,但實際已經在生產環境中運行。 simplemall項目的業務背景基於簡單的購物場景 ...
  • 編譯過程 詞法分析:對源程式從前到後(從左至右)逐個字元地掃描,從而識別出一個個"單詞"符號。 語法分析:判斷語法是否出錯,如表達式、迴圈語句、程式等。 語義分析:檢查如賦值語句左右是否匹配,是否有零除數等。 文法 G={Vt*Vn*S*P} Vt是一個非空有限的符號集合,它的每個元素稱為終結符。 ... ...
  • 題目鏈接 "簡單的數學題" 題目描述 輸入一個整數n和一個整數p,你需要求出 $$\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p$$ 其中$gcd(a,b)$表示$a$與$b$的最大公約數 輸入 一行兩個整數$p,n$ 輸出 一行一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...