String類基礎的那些事!

第三階段 JAVA常見對象的學習

第一章 常見對象——String類

(一) String 類的概述及其構造方法

(1) 概述

多個字符組成的一串數據,例如 「abc」 也能夠當作是一個字符數組。java

而經過 API咱們又能夠知道數組

A:字符串字面值「abc」也能夠當作是一個字符串對象學習

B:字符串是常量,一旦被賦值,就不能改變ui

(2) 構造方法

//空構造
public String() //把字節數組轉換成字符串 public String(byte[] bytes) //把字節數組的一部分轉換成字符串 public String(byte[] bytes,int offset,int length) //把字符數組轉換成字符串 public String(char[] value) //把字符數組的一部分轉換成字符串 public String(char[] value,int offset,int count) //把字符串常量值轉換成字符串  public String(String original) //下面的這一個雖然不是構造方法,可是結果也是一個字符串對象 String s = "hello";
複製代碼

簡單總結:String類的構造方法能夠將 字節、字符數組、字符串常量(所有或者部分)轉換爲字符串類型spa

(3) 字符串方法

//返回此字符串的長度
public int length ();
複製代碼

(4)構造方法和lenght方法的小案例

//之前三個爲例
public class StringDemo {
    public static void main(String[] args) {
        //public String():空構造
        String s1 = new String();
        System.out.println("s1:" + s1);
        System.out.println("s1.length:" + s1.length());
        System.out.println("-------------------------");

        //把字節數組轉換成字符串:public String(byte[] bytes)
        byte[] bys = {97,98,99,100,101}; //abcde
        String s2 = new String(bys);
        System.out.println("s2:" + s2);
        System.out.println("s2.length:" + s2.length());
        System.out.println("-------------------------");

        //把字節數組的一部分轉換成字符串:
        //public String(byte[] bytes,int offset,int length)
        String s3 = new String(bys,1,3);
        System.out.println("s3:" + s3);
        System.out.println("s3.length:" + s3.length());
    }
}
//運行結果:
s1:
s1.length:0
-------------------------
s2:abcde
s2.length:5
-------------------------
s3:bcd
s3.length:3
複製代碼

注:97,98,99,100,101 在ASCII碼中表明abcde,不熟悉的朋友請自行查閱code

(5) 經典例題(必看)

例題一:cdn

/* * 字符串特色:一旦被賦值,就不能改變 */
public class StringDemo {
    public static void main(String[] args) {
        String s = "Hello";
        s += "World";
        System.out.println("s:" + s);
    }
}

//運行結果:
s:HelloWorld
複製代碼

**解釋:**不能改變是指字符串對象自己不能改變,而不是指對象的引用不能改變,上述過程當中,字符串自己的內容是沒有任何變化的,而是分別建立了三塊內存空間,(Hello) (World) (HelloWorld) s → Hello + World → HelloWorld 。String內容的改變其實是經過字符串之間的拼接、斷開進行的,如上例中拼接後s的引用也就指向了 拼接後的HelloWorld對象

總結:開發中,儘可能少使用 + 進行字符串的拼接,尤爲是循環內,咱們更加推薦使用StringBuild、StringBuffer,此內容下一篇詳細講解。索引

例題二:內存

//二者的區別
String s = new String("hello");
String s = "hello";
複製代碼

前者建立了2個 (1個) 對象,後者建立了1個 (0個) 對象

下面解釋中若存在狀況知足則,分別爲建立1個和0個對象

解釋:

String s = new String("hello"); 建立實例過程

  1. 在堆中建立一個對象 「hello」 (new出來的),讓 s 引用這個對象

  2. 在字符串常量池中查找是否存在內容爲 「hello」的字符串對象

​ A:若存在,將new出的對象與字符串常量池中已存在的相聯繫

​ B:若不存在,則在字符串常量池中建立一個內容爲 "abc" 的字符串對象,並與堆中 的對相聯繫

String s = "hello"; 建立實例過程

  1. 在字符串常量中查找是否存在內容爲"hello"的字符串對象

    ​ A:若存在,讓s直接引用該對象

    ​ B:若不存在,則直接讓s引用該對象

總結:前者new一個對象,「hello」隱式建立一個對象,後者只有「hello」建立一個對象,在開發中,儘可能使用 String s = "hello" 的方式,效率比另外一種高。

例題三:

public class StringDemo {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1 == s2);//false
        System.out.println(s1.equals(s2));//true

        String s3 = new String("hello");
        String s4 = "hello";
        System.out.println(s3 == s4);//false
        System.out.println(s3.equals(s4));//true

        String s5 = "hello";
        String s6 = "hello";
        System.out.println(s5 == s6);//true
        System.out.println(s5.equals(s6));//true
    }
}
//運行結果
false
true
false
true
true
true
複製代碼

解釋: == 比較地址值是否相同、String中的equals()比較字符串內容是否一致

例題四:

public class StringDemo2 {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "World";
        String s3 = "HelloWorld";

        System.out.println(s3 == s1 + s2);
        System.out.println(s3.equals(s1 + s2));
        System.out.println(s3 == "Hello" + "World"); //重點
        System.out.println(s3.equals("Hello" + "World"));
    }
}
//運行結果
false
true
true
true
複製代碼

總結:

  1. 字符串中若是是變量相加,先開空間,再拼接
  2. 字符串中若是是字符串相加,是先加,而後在常量池中找,若是有就直接返回不然就建立

(二) String類的功能

(1) 判斷功能

//比較字符串的內容是否相同,區分大小寫
boolean equals(Object obj) //比較字符串的內容是否相同,不區分大小寫 boolean equalsIgnoreCase(String str) //判斷大字符串中是否包含小字符串 boolean contains(String str) //判斷某個字符串是否以某個指定的字符串開頭 boolean startsWith(String str) //判斷某個字符串是否以某個指定的字符串結尾 boolean endsWith(String str) //判斷字符串是否爲空 boolean isEmpty() 注意: String s = 「 」;   // 字符串內容爲空
String s = null;  // 字符串對象爲空
複製代碼

簡單模擬登陸案例 (String版)

import java.util.Scanner;

/* * 模擬登錄案例,給三次機會,而且提示剩餘次數 * A:定義用戶名和密碼(已經存在的) * B:鍵盤錄入用戶名和密碼 * C:比較用戶名和密碼 * D:給三次機會,用循環改進 */

public class StringDemo {
    public static void main(String[] args) {
        for (int x = 0; x < 3; x++) {
            String username = "admin";
            String password = "admin888";

            Scanner sc = new Scanner(System.in);
            System.out.println("請輸入用戶名");
            String name = sc.nextLine();
            System.out.println("請輸入密碼");
            String psw = sc.nextLine();
            if (name.equals(username) && psw.equals(password)) {
                System.out.println("登陸成功");
            } else {
                if ((2 - x) == 0) {
                    System.out.println("你的帳號已經被鎖定,請與管理員聯繫");
                } else {
                    System.out.println("登陸失敗,你還有" + (2 - x) + "次機會");
                }
            }
        }
    }
}
複製代碼

(2) 獲取功能

//獲取字符串的長度
int length() //獲取指定索引的字符 char charAt(int index) //返回指定字符在此字符串中第一次出現的索引 int indexOf(int ch) //爲何這裏是int而不是char? //緣由是:‘a’和‘97’其實都能表明‘a’ int方便 //返回指定字符串在此字符串中第一次出現的索引 int indexOf(String str) //返回指定字符在此字符串中從指定位置後第一次出現的索引 int indexOf(int ch,int fromIndex) //返回指定字符串在此字符串中從指定位置後第一次出現的索引 int indexOf(String str,int fromIndex) //從指定位置開始截取字符串,默認到末尾 String substring(int start) //從指定位置開始指定位置結束截取字符串 String substring(int start,int end) 複製代碼

字符串中數據統計案例

import java.util.Scanner;

/* * 案例:統計一個字符串中大寫字母字符,小寫字母字符,數字字符出現 * 的次數 */
 
public class StringDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入須要統計的數據");
        String s = sc.nextLine();

        int numberCount = 0;
        int smallCout = 0;
        int bigCout = 0;

        for (int x = 0; x < s.length(); x++) {
            char ch = s.charAt(x);
            if (ch >= 'a' && ch <= 'z') {
                smallCout++;
            } else if (ch >= 'A' && ch <= 'a') {
                bigCout++;
            } else if (ch >= '0' && ch <= '9') {
                numberCount++;
            }
        }
        
        System.out.println("大寫字母:" + bigCout + "個");
        System.out.println("小寫字母:" + smallCout + "個");
        System.out.println("數字:" + numberCount + "個");
    }
}
//運行結果
請輸入須要統計的數據
HelloWorld520
大寫字母:2個
小寫字母:8個
數字:3複製代碼

(3) 轉換功能

//把字符串轉換爲字節數組
byte[] getBytes()

//把字符串轉換成字符數組
char[] toCharArray()

//把字符數組轉換成字符串
static String valueOf(char[] chs) //把int類型的數據轉換成字符串 static String valueOf(int i) //注意:String類的valueOf方法能夠把任何類型的數據轉換成字符串! //把字符串轉換成小寫  String toLowerCase() //把字符串轉換成大寫 String toUpperCase() //把字符串拼接 String concat(String str) 複製代碼

(4) 其餘功能

//替換功能 
String replace(char old,char new) String replace(String old,String new) //去除字符串兩端空格 String trim() //按字典比較功能 int compareTo(String str) int compareToIgnoreCase(String str) 複製代碼

逆序輸出字符串案例

/* * 鍵盤輸入 "abc" * 輸出結果 "cba" */

import java.util.Scanner;

public class StringDemo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入:");
        String line = sc.nextLine();

        char[] chs = line.toCharArray();

        String result = "";

        for (int x = chs.length - 1; x >= 0; x--) {
            result += chs[x];
        }      
        System.out.println("reusult:" + result);
    }
}
//運行結果
請輸入:
abc
reusult:cba
複製代碼

大串中查詢小串案例

import java.util.Scanner;

public class StringDemo {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入被統計的數據");
        String maxString = sc.nextLine();
        System.out.println("請輸入統計關鍵詞");
        String minString = sc.nextLine();
        int count = getCount(maxString, minString);
        System.out.println("count:" + count);
    }

    public static int getCount(String maxString, String minString) {
        //定義一個統計變量,初始化爲0
        int count = 0;

        //先在大串中查找小串第一次出現的位置
        int index = maxString.indexOf(minString);

        //索引不是-1,說明存在,統計變量++
        while (index != -1) {
            count++;
            //把剛纔的索引 + 小串的長度做爲開始位置截取上一次的大串
            //返回一個新的字符串,並把該字符串的值從新賦給大串
            int startIndex = index + minString.length();
            maxString = maxString.substring(startIndex);
            index = maxString.indexOf(minString);
        }
        return count;
    }
}

//運行結果
請輸入被統計的數據
Hello520World520
請輸入統計關鍵詞
520
count:2
複製代碼

結尾:

若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^

若是能幫到你的話,那就來關注我吧!(系列文章均會在公衆號第一時間更新)

在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤

一個堅持推送原創Java技術的公衆號:理想二旬不止

img
相關文章
相關標籤/搜索