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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...