java之字元串,java的字元串

本文目錄一覽:

java中字元串的是什麼?

java中的字元串是由多個字元組成的一串數據,字元串是常量,一旦被創建就不能改變,這是因為字元串的值是存放在方法區的常量池裡面,但是引用可以改變。字元串字面值”ab”也可以看成是一個字元串對象。

java中的字元串代表什麼意思

字元串顧名思義就是一些字元組合在一起組成的一串數據,稱作字元串,在Java中字元串用雙引號包圍起來,格式為String string = 「hello world」; 這裡的hello world就是一個字元串,字元串裡面可以包含任何的字元內容;

在Java中String是一個類,所以除了上面直接讓String對象等於一個字元串之外,我們可以向普通的類一樣,使用new創建一個String對象;

當我們使用第一種方法也就是String string = 」hello」;的時候,程序會在特定的內存中(專門保存字元串的內存)查找是否有」hello」這個字元串,如果沒有則在這個內存區域創建一個」hello」字元串,當我們再次創建另一個字元串String string2 = 「hello」;的時候,由於這個時候,這個內存區域已經有了」hello」這個字元串,所以我們string2就直接指向了」hello」這個地址;這個時候我們使用string == string2的時候,得到的結果是true;也就是說兩個指向值是相等的;

當我們使用new 的方式創建一個字元串對象的時候,我們查看String源碼,可以發現String類中是使用private final char value[];的變數來存放字元串的內容;當我們創建兩個字元串String string2 = new String(「hello」); String string3 = new String(「hello」);這個時候,我們使用string2 == string3的時候,得到的結果是false;這是由於new創建的對象會分別在內存中創建兩個地址,所以string2和string3不相等;但是我們使用string2.value == string3.value的時候,得到的結果是true;因為這兩個地址的字元串在內存中是指向的同一個地址的」hello」,並且和我們剛才創建的string所指向的」hello」地址一樣;所以我們一般比較字元串的時候,使用string2.equal(string3);的方式進行比較;

我們可以從下圖中看出來,雖然有四個String對象,但是他們的value值的地址都是一樣的;

Java中String類的構造方法非常的多,我們根據需求,將不同類型的數組轉換成我們想要的字元串;並且String中有我們用的比較多的一些方法,比如public boolean equalsIgnoreCase( String anotherString )表示忽略兩個字元串中字元的大小寫,比較兩個字元串是否相等;public boolean startsWith(String prefix, int toffset)表示從字元串第toffset的位置是否是由prefix開始的;public boolean endsWith(String suffix)判斷字元串是否是以suffix結束的,我們可以從源碼中看到,這個方法使用了startsWith(suffix, value.length – suffix.value.length)的方法;public String substring(int beginIndex)表示截取字元串從beginIndex開始以後的內容;public String substring(int beginIndex, int endIndex)表示截取字元串從beginIndex到endIndex位置的內容;

Java對字元串的封裝非常的強大,除了上述的常用方法之外,還有很多非常方便的方法;能夠熟練掌握String對我們的開發有非常大的幫助;

更多java學習方面的問題可以訪問這個網頁,網頁鏈接,希望我的回答能幫到你。

什麼是 Java 中的字元串

字元串就和羊肉串是一個道理

字元串是由一個個字元組成的串

羊肉串是由一塊塊羊肉串成的串

java8中的字元串的用法

1.

首先String不屬於8種基本數據類型,String是一個對象。

因為對象的默認值是null,所以String的默認值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性。

2.

new String()和new String(「」)都是申明一個新的空字元串,是空串不是null;

3.

String str=」kvill」;

String

str=new String (「kvill」);的區別:

在這裡,我們不談堆,也不談棧,只先簡單引入常量池這個簡單的概念。

常量池(constant

pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。它包括了關於類、方法、介面等中的常量,也包括字元串常量。

看例1:

String

s0=」kvill」;

String

s1=」kvill」;

String

s2=」kv」 + 「ill」;

System.out.println(

s0==s1 );

System.out.println(

s0==s2 );

結果為:

true

true

首先,我們要知道Java會確保一個字元串常量只有一個拷貝。

因為例子中的s0和s1中的」kvill」都是字元串常量,它們在編譯期就被確定了,所以s0==s1為true;而」kv」和」ill」也都是字元串常量,當一個字元串由多個字元串常量連接而成時,它自己肯定也是字元串常量,所以s2也同樣在編譯期就被解析為一個字元串常量,所以s2也是常量池中

」kvill」的一個引用。

所以我們得出s0==s1==s2;

用new

String() 創建的字元串不是常量,不能在編譯期就確定,所以new String() 創建的字元串不放入常量池中,它們有自己的地址空間。

看例2:

String

s0=」kvill」;

String

s1=new String(」kvill」);

String

s2=」kv」 + new String(「ill」);

System.out.println(

s0==s1 );

System.out.println(

s0==s2 );

System.out.println(

s1==s2 );

結果為:

false

false

false

例2中s0還是常量池中」kvill」的應用,s1因為無法在編譯期確定,所以是運行時創建的新對象」kvill」的引用,s2因為有後半部分new

String(「ill」)所以也無法在編譯期確定,所以也是一個新創建對象」kvill」的應用;明白了這些也就知道為何得出此結果了。

4.

String.intern():

再補充介紹一點:存在於.class文件中的常量池,在運行期被JVM裝載,並且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字元串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等於str的字元串並返回它的引用;看例3就清楚了

例3:

String

s0= 「kvill」;

String

s1=new String(」kvill」);

String

s2=new String(「kvill」);

System.out.println(

s0==s1 );

System.out.println(

「**********」 );

s1.intern();

s2=s2.intern();

//把常量池中「kvill」的引用賦給s2

System.out.println(

s0==s1);

System.out.println(

s0==s1.intern() );

System.out.println(

s0==s2 );

結果為:

false

**********

false

//雖然執行了s1.intern(),但它的返回值沒有賦給s1

true

//說明s1.intern()返回的是常量池中」kvill」的引用

true

最後我再破除一個錯誤的理解:

有人說,「使用String.intern()方法則可以將一個String類的保存到一個全局String表中,如果具有相同值的Unicode字元串已經在這個表中,那麼該方法返回表中已有字元串的地址,如果在表中沒有相同值的字元串,則將自己的地址註冊到表中「如果我把他說的這個全局的

String表理解為常量池的話,他的最後一句話,「如果在表中沒有相同值的字元串,則將自己的地址註冊到表中」是錯的:

看例4:

String

s1=new String(“kvill”);

String

s2=s1.intern();

System.out.println(

s1==s1.intern() );

System.out.println(

s1+” “+s2 );

System.out.println(

s2==s1.intern() );

結果:

false

kvill

kvill

true

在這個類中我們沒有聲名一個」kvill」常量,所以常量池中一開始是沒有」kvill」的,當我們調用s1.intern()後就在常量池中新添加了一個」kvill」常量,原來的不在常量池中的」kvill」仍然存在,也就不是「將自己的地址註冊到常量池中」了。

s1==s1.intern()為false說明原來的「kvill」仍然存在;

s2現在為常量池中「kvill」的地址,所以有s2==s1.intern()為true。

5.

關於equals()和==:

這個對於String簡單來說就是比較兩字元串的Unicode序列是否相當,如果相等返回true;而==是比較兩字元串的地址是否相同,也就是是否是同一個字元串的引用。

6.

關於String是不可變的

這一說又要說很多,大家只要知道String的實例一旦生成就不會再改變了,比如說:String

str=」kv」+」ill」+」 「+」ans」;

就是有4個字元串常量,首先」kv」和」ill」生成了」kvill」存在內存中,然後」kvill」又和」

「 生成 」kvill 「存在內存中,最後又和生成了」kvill

ans」;並把這個字元串的地址賦給了str,就是因為String的「不可變」產生了很多臨時變數,這也就是為什麼建議用StringBuffer的原因了,因為StringBuffer是可改變的。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/219716.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 11:00
下一篇 2024-12-09 11:00

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中將字元串轉化為浮點數

    本文將介紹在Python中將字元串轉化為浮點數的常用方法。在介紹方法之前,我們先來思考一下這個問題應該如何解決。 一、eval函數 在Python中,最簡單、最常用的將字元串轉化為…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29

發表回復

登錄後才能評論