認識Java中的字符串

學習了解

  1. 什么是Java的字符串
  • Java字符串的不變性
  • Java中Stirng類的常用方法1
  • Java中String類的常用方法2
  • 認識Java中的StringBuilder類
  • Java 中的 StringBuilder 類的常用方法

具體內(nèi)容

1、什么是Java的字符串

在程序開發(fā)中字符串無處不在,如用戶登陸時輸入的用戶名、密碼等使用的就是字符串。其實,在前面的章節(jié)中我們就已經(jīng)使用了字符串,例如我們在控制臺中輸出的 "Hello World" 、 "imooc" 等。

在 Java 中,* 字符串被作為 String 類型的對象 * 處理。 String 類位于 java.lang 包中。默認情況下,該包被自動導入所有的程序。

創(chuàng)建String對象的3種方法

  1. 創(chuàng)建一個字符串對象imooc,名為s1
    String s1 = "imooc";
  2. 創(chuàng)建一個空字符串對象,名為s2
    String s2 = new String();
  3. 創(chuàng)建一個字符串對象imooc,名為s3
    String s3 = new String("imooc");

2、Java中字符串的不變性

String 對象創(chuàng)建后則不能被修改,是不可變的,所謂的修改其實是創(chuàng)建了新的對象,所指向的內(nèi)存空間不同。

示例

/**
 * Created by 99479 on 2017/7/1.
 */
public class NeverChangeTest {

    public static void main(String[] args) {
        String s1 = "psj";
        String s2 = "psj";
        String s3 = new String("psj");
        String s4 = new String("psj");

        //多次出現(xiàn)的字符串常量,Java編譯程序只創(chuàng)建一個,所以返回true
        System.out.println(s1==s1);
        //s1和s3是不同的對象,所以返回false
        System.out.println(s1 == s3);
        //s3和s4是不同的對象,所以返回false
        System.out.println(s3 == s4);

        s1 = "歡迎您來:"+ s1;
        System.out.println(s1);
        System.out.println(s1==s2);
    }
}

輸出

true
false
false
歡迎您來:psj
false

** 代碼解釋 **
1、 通過 String s1="psj"; 聲明了一個字符串對象, s1 存放了到字符串對象的引用,在內(nèi)存中的存放引用關系如下圖所示:

image.png

然后通過 s1="歡迎您來:"+s1; 改變了字符串 s1 ,其實質(zhì)是創(chuàng)建了新的字符串對象,變量 s1 指向了新創(chuàng)建的字符串對象,如下圖所示:

image.png

2、 一旦一個字符串在內(nèi)存中創(chuàng)建,則這個字符串將不可改變。如果需要一個可以改變的字符串,我們可以使用StringBuffer或者StringBuilder
3、 每次 new 一個字符串就是產(chǎn)生一個新的對象,即便兩個字符串的內(nèi)容相同,使用 ”==” 比較時也為 ”false” ,如果只需比較內(nèi)容是否相同,應使用 ”equals()” 方法

Java中String類的常用方法 1

String類提供了許多用來處理字符串的方法,例如,獲取字符出啊長度,最字符串進行截取,將字符串轉換為大寫或小寫,字符分割等。
** String類常用方法 **

image.png

** 示例 **

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * Created by 99479 on 2017/7/4.
 */
public class NomalMethedTest {
    public static void main(String[] args) {
        //定義一個字符串“學習JAVA編程”
        String str = "學習了JAVA 編程";
        //打印除字符串長度
        System.out.println("字符串長度:"+str.length());
        //查找字符‘編的位置’
        char c = '編';
        System.out.println("字符‘編’的位置:"+str.indexOf(c));
        //查找字符串‘JAVA’的位置
        System.out.println("字符串'JAVA'的位置:"+str.indexOf("JAVA"));
        //查找字符串‘psj’的位置,找不但返回‘-1’
        System.out.println("字符串‘psj’的位置:"+str.indexOf("psj"));
        //按空格將字符串分為一個數(shù)組,并輸出數(shù)組元素
        String [] arr = str.split(" ");
        System.out.println("按空格拆分成數(shù)組:"+ Arrays.toString(arr));
        System.out.println();
        //獲取索引位置[3,7)之間的字符串
        System.out.println("獲取位置[3,7)之間的字符串:"+str.substring(3,7));
    }
}

** 輸出 **

字符串長度:10
字符‘編’的位置:8
字符串'JAVA'的位置:3
字符串‘psj’的位置:-1
按空格拆分成數(shù)組:[學習了JAVA, 編程]

獲取位置[3,7)之間的字符串:JAVA

Java中的String類常用方法2

** 示例 **

public class NomalMethedTest02 {
    public static void main(String[] args) {
        //定義一個字符串“學習JAVA編程”
        String str = "學習了JAVA 編程";

        //將字符串轉為小寫
        System.out.println("轉換為小寫:"+str.toLowerCase());
        //獲取索引位置為1的字符
        System.out.println("獲取索引位置為1位置的字符:"+str.charAt(1));
        //將字符串轉換為byte[],并打印輸出
        byte[] b = str.getBytes();
        System.out.println("轉換為字節(jié)數(shù)組: ");
        for (byte o:b) {
            System.out.println(""+o);
        }
        System.out.println();
        //和另外一個字符串“學習JAVA 編程”進行比較
        String str2 = new String("學習JAVA 編程");
        System.out.println("str和str2的內(nèi)存地址相同?"+(str==str2));
        System.out.println("str和str2的內(nèi)容相同?"+str.equals(str2));
    }
}

輸出

轉換為小寫:學習了java 編程
獲取索引位置為1位置的字符:習
轉換為字節(jié)數(shù)組: 
-27
-83
-90
-28
-71
-96
-28
-70
-122
74
65
86
65
32
-25
-68
-106
-25
-88
-117

str和str2的內(nèi)存地址相同?false
str和str2的內(nèi)容相同?false

** PS **
字節(jié)是計算機存儲信息的基本單位,1個字節(jié)等于8個位,gbk編碼中1個漢字字符存儲需要2個字節(jié),1個英文字符需要一個1節(jié)。所以我們看到上面的程序運行結果中,每個漢字對應兩個字節(jié)值,如“學”對應“-47 -89”,而因為字符“J”對應“74”。同時,我們還發(fā)現(xiàn)漢字對應的字節(jié)值為負數(shù),原因在于每個每隔字節(jié)是8位,最大值不能超過127,而漢字轉換為字節(jié)后超過127,如果超過就會溢出,以負數(shù)的形式顯示

認識Java 中的StringBuilder類

在Java中,除了可以使用String類來存儲字符串,還可以使用StringBuilder類或StringBuffer類存儲字符串,它們之間的區(qū)別是:

  • String類具有是不可變性
    ** 范例 **
public class BuilderOrBufferTest {
    public static void main(String[] args) {
        String str = "hello";
        System.out.println(str + "world  !");
        System.out.println(str);
    }
}

輸出

helloworld  !
hello

從運行結果中我們可以看到,程序運行時會額外創(chuàng)建一個對象,保存 "helloworld"。當頻繁操作字符串時,就會額外產(chǎn)生很多臨時變量。使用 StringBuilder 或 StringBuffer 就可以避免這個問題。至于 StringBuilder 和StringBuffer ,它們基本相似,不同之處,StringBuffer 是線程安全的,而 StringBuilder 則沒有實現(xiàn)線程安全功能,所以性能略高。因此一般情況下,如果需要創(chuàng)建一個內(nèi)容可變的字符串對象,應優(yōu)先考慮使用 StringBuilder 類。
** 范例 **

/**
 * Created by 99479 on 2017/7/4.
 */
public class BuilderOrBufferTest {
    public static void main(String[] args) {
        
        //創(chuàng)建一個空的StringBuilder對象
        StringBuilder str1 = new StringBuilder();
        //創(chuàng)建一個字符串“psj”
        StringBuilder str2 = new StringBuilder("psj");
        System.out.println(str2);
    }
}

** 輸出 **

psj

Java中的StringBuilder類的常用方法

StringBuilder類提供了很多方法來操作字符串:

image.png

例如:在下面的示例代碼中,創(chuàng)建了StringBuilder對象,來存儲字符串,并對其做了追加和插入操作。這些操作修改了str對象的值 ,而沒有創(chuàng)建新的對象,這就是StringBuilder和String最大的區(qū)別。
** 范例 **

public class BuilderNomalMethed {
    public static void main(String[] args) {
        //創(chuàng)建StringBuilder對象,存儲字符串
        StringBuilder str = new StringBuilder("hello");
        str.append( " psj");//在字符串后面追加字符串
        str.append(520);//在字符串后面追加整數(shù)
        System.out.println("字符串長度:"+str.length());
        System.out.println("插入前:"+str);

        str.insert(12,"!");
        String str2 = str.toString();
        System.out.println("插入后:"+str2);
    }
}

輸出

字符串長度:12
插入前:hello psj520
插入后:hello psj520!
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、什么是 Java 中的字符串 在程序開發(fā)中字符串無處不在,如用戶登陸時輸入的用戶名、密碼等使用的就是字符串。其...
    夏沫xx閱讀 1,333評論 0 2
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評論 18 399
  • 集合框架: 1)特點:存儲對象;長度可變;存儲對象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,386評論 0 4
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,265評論 0 62
  • 從未消失的還有那從未消失的回憶,關于青春的回憶,關于愛情的回憶??稍谶@個窘迫的環(huán)境里,我,還有她,卻都只剩下關于親...
    肖的救贖閱讀 431評論 7 9

友情鏈接更多精彩內(nèi)容