中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java數據結構之字符串怎么用

發布時間:2022-05-16 13:38:36 來源:億速云 閱讀:140 作者:iii 欄目:編程語言

這篇文章主要介紹“Java數據結構之字符串怎么用”,在日常操作中,相信很多人在Java數據結構之字符串怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java數據結構之字符串怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Java數據結構之字符串怎么用

1.字符串基礎知識

串(string)是由零個或多個字符組成的有限序列,又名字符串。

我們可以從這段段基本概念中知道:

  • 零個或多個字符組成:說明字符串的內部元素類型為字符。

  • 有限:說明字符串的內容長度是有一定限制的,小于一個最大范圍,但是在該范圍內,實際的長度是不確定的。

  • 序列:說明字符串中的相鄰字符存在前驅和后繼的關系。

在Java中沒有內置的字符串類型,每個用雙引號括起來的字符串都是Java中String類的一個實例。

也就是說Java中String并不是數據類型,在Java中所有的字符串都是String的實例化對象。

Java中的String

Java中的String類代表字符串,Java 程序中的所有字符串文字(例如“abc”)都為此類的實例。

也就是說,Java程序中所有的雙引號字符串,都是 String 類的對象。String 類在 java.lang 包下,所以使用的時候不需要導包!

在Java中String最重要的特點就是:

String 類是不可改變的,所以你一旦創建了 String 對象,那它的值就無法改變了。我們將這種特性稱為String的不可變性。

字符串的不可變性

不可變性:當你給一個字符串重新賦值之后,老值并沒有在內存中銷毀,而是重新開辟一塊空間存儲新值。

也就是說一旦一個String對象在內存中創建,它將是不可改變的,所有的String類中方法并不是改變String對象自己,而是重新創建一個新的String對象

例如:

String s="dcm";String s="ddccmm"

當s的值發生改變之后,ddccmm這個值并沒有覆蓋dcm,只是重新開發了一個新的空間去儲存ddccmm然后將s指向它。

如果我們在實際開發中對很含有大量字符的字符串進行遍歷賦值修改,會對內存中產生很多無法釋放的字符串對象,造成內存垃圾。

正因為String對象的不可變性,如果需要對字符串進行大量的修改、添加字符、刪除字符等操作盡量不要使用String對象,因為這樣會頻繁的創建新的對象導致程序的執行效率下降。

這時我們可以使用Java中另外一個字符串類StringBuilder。

我們在做題的時候關于字符串一般用的都是String類,但是考慮到我們有時候也會用到StringBuilder類這里我就對StringBuilder類進行稍微細致一點的講解。

2.StringBuilder類

StringBuilder 是一個可變的字符串類,我們可以把它看成是一個容器,這里的可變指StringBuilder對象中的內容是可變的。

2.1 StringBuilder類常用的方法
Java數據結構之字符串怎么用
可以看出來,構建一個StringBuilder的對象只能使用它的構造方法來構造,不像String一樣可以直接String s= "123"來創建

因為StringBuilder類對象是可變的,所以當我們對一個字符串需要進行改變比較多的時候一般定義為StringBuilder類。

2.2 String和StringBuilder的區別

String 對象是不可改變的。每次使用String 類中的方法之一時,都要在內存中創建一個新的字符串對象,這就需要為該新對象分配新的空間。

StringBuilder對象是動態對象,允許擴充它所封裝的字符串中字符的數量,但是您可以為它可容納的最大字符數指定一個值,當修改 StringBuilder 時,在達到容量之前,它不會為其自己重新分配空間。當達到容量時,將自動分配新的空間且容量翻倍。也就是說當對字符串進行改變時,都是對當前對象的狀態進行更新的。

可以使用重載的構造函數之一來指定 StringBuilder 類的容量。

2.3 String類與StringBuilder類的相互轉換

String類轉換為StringBuilder類

public class String{
    public static void main(String[] args){
        String s = "baibai";
        StringBuilder s1 = new StringBuilder(s);
        System.out.println(s1);
    }}

StringBuilder類轉換為String類

public class String {
    public static void main(String[] args){
        StringBuilder s1 = new StringBuilder();
        //連續連接
        s1.append("abc").append("efg");
        String s = s1.toString();
        System.out.println(s);
    }}

3.初始化String類

3.1初始化String對象的兩種方法:

//方法一:直接創建
String s1= "大聰明 超牛的";
//方法二:對象創建
String s2 = new String("大聰明 超牛的"); 
String s3 = new String();//也可以創建一個空串

雖然兩種方法看起來是一樣的但是本質上是不一樣的。
String 創建的字符串存儲在公共池中,而 new 創建的字符串對象在堆上。那存放在公共池(常量池)與堆中有什么不一樣嗎?

我們來舉個例子:

String s1 = "大聰明 超牛的";              // String 直接創建
String s2 = "大聰明 超牛的";              // String 直接創建
String s3 = s1;                    // 相同引用
String s4 = new String("大聰明 超牛的");   // String 對象創建
String s5 = new String("大聰明 超牛的");   // String 對象創建
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));
System.out.println(System.identityHashCode(s4));
System.out.println(System.identityHashCode(s5));

輸出:
Java數據結構之字符串怎么用
可見前三個字符串的地址相同,后兩個各不相同!

這是因為直接創建的字符串時,會先在公共池中找有沒有這樣的字符串,如果有那就將引用直接指向它,而不去開發新的空間。在這里s1,s2,s3這三個引用指向了公共池中的同一塊內存。

對象創建時,每次都會在堆上開新的空間來存放字符串,也就是說s4,s5分別指向在堆上的兩塊不同的內存,只不過這兩塊內存里面都儲存著相同的東西。

4.String類常用API

這里再次強調一下,我們在做題的時候遇到關于字符串相關題目我們幾乎都是使用String類來解決問題,除了在字符串進行大量更改時我們可能會暫時用到StringBuilder類。

這里的暫時就是我們在對字符串更改等操作之后一般還是要把字符串轉換為String類的。

所以我們要學習的API主要還是String類的API。對應刷題我StringBuilder的API我們只需要學習上面提到的兩個就夠了。

String 類在 java.lang 包下,所以使用的時候不需要導包!

4.1 基本數據類型轉換成字符串

有三種辦法:

(1)基本類型數據的值+“” (最常用,最簡單);
(2)使用包裝類中的靜態方法 static String toString(int i)返回一個表示指定整數的String 對象。如:在Integer中:Integer.toString(6)
(3)使用String類中的靜態方法 static String valueOf(int i) 返回int 參數的字符串表示形式。如:String.valueOf(6)

String 類別中已經提供了將基本數據型態轉換成String 的 static 方法也就是 String.valueOf() 這個參數多載的方法 :

String.valueOf(boolean b) 
//將 boolean 變量 b 轉換成字符串 
String.valueOf(char c) 
//將 char 變量 c 轉換成字符串 
String.valueOf(char[] data)
//將 char 數組 data 轉換成字符串 
String.valueOf(char[] data, int offset, int count)
//將char數組data中由data[offset]開始取 count個元素轉換成字符串 
String.valueOf(double d)
//將 double 變量 d 轉換成字符串 
String.valueOf(float f)
//將 float 變量 f 轉換成字符串 
String.valueOf(int i)
//將 int 變量 i 轉換成字符串 
String.valueOf(long l)
//將 long 變量 l 轉換成字符串 
String.valueOf(Object obj)
//將 obj 對象轉換成 字符串, 等于 obj.toString()

因為是靜態方法所以不需要實例化。

4.2 字符串轉換為基本數據類型

一般使用包裝類的靜態方法parseXX("字符串")

要將 String 轉換成基本數據類型大多需要使用基本數據型態的包裝類別,如:String 轉換成 byte可以使用 Byte.parseByte(String s)

Byte.parseByte(String s)
//將 s 轉換成 byte 
Byte.parseByte(String s, int radix)
//以 radix 為基底 將 s 轉換為 byte
Double.parseDouble(String s)
//將 s 轉換成 double 
Float.parseFloat(String s)
//將 s 轉換成 float  
Integer.parseInt(String s)
//將 s 轉換成 int 
Long.parseLong(String s)
//將 s 轉換成 long

注意這里也是靜態方法,只不過都是對應包裝類的靜態方法

4.3 使用length()得到一個字符串的字符個數

int len = String.length();

4.4 使用toCharArray() 將一個字符串轉換成字符數組

Char[] arr = String.toCharArray();

4.5 判斷兩個字符串的內容是否相等返回true/false

String1.equals(String2);//區分大小寫
String1.equalsIgnoreCase(String2);//不區分大小寫

4.6 與位置相關的字符串

charAt(int)//得到指定下標位置對應的字符
indexOf(String)//得到指定內容第一次出現的下標
lastIndexOf(String)//得到指定內容最后一次出現的下標

4.7 將一個字符串按照指定內容劈開split(String) ,返回字符串數組。

String s = "wa,dcm,nb!";
String[] str = s.split(",");//返回結果中str[1]=dcm

4.8 contains(String) 判斷一個字符串里面是否包含指定的內容,返回true/false

Boolean a = String1.contains(String2)

4.9 使用substring()截取字符串,返回子串

String.substring(int)//從指定下標開始一直截取到字符串的最后
String.substring(int,int)//從下標x截取到下標y-1對應的元素

4.10 字符串大小寫轉換

String.toUpperCase()
//將一個字符串全部轉換成大寫
String.toLowerCase()//將一個字符串全部轉換成小寫

4.11 使用replace()進行字符串內容替換

String.replace(String,String)
//將某個內容全部替換成指定內容
String.replaceAll(String,String)
//將某個內容全部替換成指定內容,支持正則
String.repalceFirst(String,String)
//將第一次出現的某個內容替換成指定的內容

5.字符串進階練習

387. 字符串中的第一個唯一字符
Java數據結構之字符串怎么用
題解:

把字符串的單個字符轉化為對應數組下標,遍歷一遍字符串獲得26個字母分別出現幾次。然后在遍歷一遍字符串看哪個字符先出現次數為1,就輸出對應下標。

class Solution {        
    public int firstUniqChar(String s) {
        int len = s.length();
        int[] vis = new int[26];
        int temp = -1;
        for(int i = 0; i < len; i ++) {
            vis[s.charAt(i) - 'a'] ++;
        }
        for(int i = 0; i < len; i ++) {
            if(vis[s.charAt(i) - 'a'] == 1) {
                return i;
            }
        }
        return -1;
    }}

或者我們也可以把字符串先轉換為字符數組來解題,原理都是一樣的!

class Solution {
    public int firstUniqChar(String s) {
        int[] arr = new int[26];
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            arr[chars[i] - 'a']++;
        }
        for (int i = 0; i < chars.length; i++) {
            if (arr[chars[i] - 'a'] == 1) {
                return i;
            }
        }
        return -1;
    }}

到此,關于“Java數據結構之字符串怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中牟县| 晋中市| 遂宁市| 景泰县| 中方县| 济阳县| 三明市| 视频| 乌兰县| 钟山县| 蚌埠市| 股票| 西丰县| 兴文县| 敖汉旗| 大余县| 永年县| 四平市| 秭归县| 绵竹市| 奎屯市| 大名县| 林甸县| 岳阳县| 佛冈县| 织金县| 府谷县| 江口县| 玉林市| 洞头县| 休宁县| 河东区| 图木舒克市| 清苑县| 东方市| 桂阳县| 平乡县| 文山县| 岱山县| 积石山| 白山市|