1. 程式人生 > >String類基礎的那些事!

String類基礎的那些事!

第三階段 JAVA常見物件的學習

第一章 常見物件——String類

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

(1) 概述

多個字元組成的一串資料,例如 “abc” 也可以看成是一個字元陣列。

而通過 API我們又可以知道

A:字串字面值“abc”也可以看成是一個字串物件

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

(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類的構造方法可以將 位元組、字元陣列、字串常量(全部或者部分)轉換為字串型別

(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,不熟悉的朋友請自行查閱

(5) 經典例題(必看)

例題一:

/*
 *  字串特點:一旦被賦值,就不能改變
 */
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技術的公眾號:理想二旬不止

相關推薦

String基礎那些

第三階段 JAVA常見物件的學習 第一章 常見物件——String類 (一) String 類的概述及其構造方法 (1) 概述 多

c++ string的完整實現

class sun double ref basic 更新 方便 iterator locate 本文實現了c++ STL中的basic_string模板類,當然。通過typedef也就實現了string類和wstring類。限於篇幅,實現代碼中用到了標準庫的char_

前端開發和其他類別工程師配合的那些

png 工程 圖標 開發 nmp nodejs 利用 父類 轉換 實際開發項目中,前端工程師需要和美工、後端、產品經理配合來完成一個產品,今天就簡單說說前端工程師和這些類別工程師配合的那些事。 一、前端攻城獅和美工配合的那些事 懂得圖片理論基礎   常見的圖片格式包含以

JS 函數作用域及變量提升那些

向上 沒有 asc 程序 ole 理解 繼續 不知道 階段 一直以來小編對js函數作用域及變量提升的理論知識,雖然看了多次,但也是一知半解~ 這幾天做了幾道js小題,對這部分進行了從新的理解,還是有所收獲的~ 主要參考書籍: 《你不知道的JavaScript(上卷)》第

分享一下身邊朋友自學android開發及找工作的那些【不足勿噴】

自己的 tis 快速 就是 和我 and 好處 adapt 分享 寫在前面 前不久身邊一個朋友突然告訴我他把原來的工作辭掉了,我問他最近在幹嘛,他說他最近兩個月學了java及android然後花了1周時間找工作,我問他現在怎麽樣了。他說比不上我們身邊這些10K-20K的現在

一文歸納總結分散式架構中的那些

進入十一月,最火熱的話題與期待的日子自然是雙十一狂歡購物節了,作為程式設計師的你除了要清空自己的購物車之外,最關心的是不是雙十一架構技術是如何承受億級使用者流量的衝擊,又是如何在分散式架構中實現單點登陸,形成支援高併發,高可用的分散式架構技術呢?下面小編就來幫你總結如何從0到1學習分散式架構技術

盤點趙麗穎和馮紹峰官宣引爆微博,你不知道的那些

10月16日是趙麗穎的31歲生日,上午10時許,趙麗穎和馮紹峰一同在微博晒出了二人的結婚照,官宣正式結婚。致使微博幾度陷入癱瘓,其公佈訊息的“官宣體”更是引發了眾多媒體和個人的模仿。范冰冰的“我們體”,鹿晗的“大家好,給大家介紹一下,這是我的女朋友@”,我們不難發現,明星們簡單的一句話公開戀情方式總是會頻頻引

一文歸納總結分散式架構的那些

雙十一購物狂歡節已經過去了,作為程式設計師的你,除了在關心自己的快遞的運送情況之外,最關心的是不是雙十一架構技術是如何承受億級使用者流量的衝擊,又是如何在分散式架構中實現單點登陸,形成支援高併發,高可用的分散式架構技術呢?下面小編就來幫你總結如何從0到1學習分散式架構技術,如何實現從小白到架構師的蛻變!!

一文歸納分散式架構的那些

進入十一月,最火熱的話題與期待的日子自然是雙十一狂歡購物節了,作為程式設計師的你除了要清空自己的購物車之外,最關心的是不是雙十一架構技術是如何承受億級使用者流量的衝擊,又是如何在分散式架構中實現單點登陸,形成支援高併發,高可用的分散式架構技術呢?下面小編就來幫你總結如何從0到1學習分散式架構技術,如

應屆生校園招聘——程式設計師求職的那些

2012年9月,本人加入到大學生求職大軍的行列中。今年的經濟環境不是很好,大家都找到工作了嗎?不管怎麼樣,只要我們堅持下去,一定能夠找到屬於自己的工作。 首先,自己介紹下,本人為東北一所不知名的211工程大學的小碩。每一年到我們學校的招聘會其實是很多的,有國企,私企等等。本

HttpServlet背後的那些

閱讀本篇文章大約花費您4分鐘!   我們自己新建一個Servlet類的時候,我們通常會繼承自HttpServlet類,並且編譯器也是預設幫我們繼承了HttpServlet類,為什麼我們要繼承HttpSerlvet類呢?初學Web的同學一定知道Servlet類,並且熟知裡面的五個方法

說說溢算那些~你的計算方式溢算了嗎?

遊戲快正式上線了,今天發現一個bug,讓人哭笑不得。資料計算溢位了;玩家充值的元寶變為了0;這個可是一件大事,畢竟誰都擔不起這個責任啊; 來說說原因吧。開發語言是 java 工具是 netbeans ide 8.0.2 玩家物件有一個屬性是 gold 是int型別的; 玩家充值的時候計算方式如下.

PHP中echo、print、print_r、printf、sprintf和var_dump的區別比較那些

1、echoecho()輸出一個或多個字串。不是一個函式,而是php語句,因此您無需對其使用括號。不過,如果您希望向 echo() 傳遞一個以上的引數,那麼使用括號會發生解析錯誤。而且echo是返回void的,並不返回值,所以不能使用它來賦值。例子: <?php  

JAVA#String基礎'札記

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

MVC框架中Controller層經常做的那些

1.請求Controller後直接轉發到別的介面中 1.第一種寫法 @RequestMapping("user/toLogin") public ModelAndView toLogin(){

Android中BuildConfig那些

宣告 本文章都只是在AndroidStudio基於Gradle構建專案開發的驗證,所以不保證其它開發環境與構建專案方式也是這樣 BuildConfig身在何處 瞭解一個東西前,至少先要知道這東西在哪裡吧!而我們今天要了解的這個類又在哪裡了,我相信應該還

MySQL中關於JSON你不得不知道的那些

MySQL新增的JSON資料型別讓關係資料庫用起來更簡單,並且模糊了SQL和NoSQL資料庫的界限。 從前有了一臺電腦,然後有人built了第二臺電腦,並且想要一些第一臺電腦上的程式碼。這就意味著我們需要一種不借助底層硬體的方式來移動資訊。

數位電路基礎那些1——組合邏輯:從譯碼器到編碼器

宣告:本文部分內容選自《數位電子技術基礎系統方法》與 華中科技大學的《電子技術基礎 數字部分》,筆者將其兩者精華加上自身的理解整理成一篇文章,使知識點易於理解!            如有疏漏歡迎指出! 譯碼器 1. 譯碼器定義 譯碼器是一種用以檢測

聊聊WindowServer那些

### 前言說明 + 使用工具:VS2019 + 思考為什麼要使用WindowServer,它能做什麼了?(後面解答) ### 一:什麼是WindowServer?(我們做的是一個什麼東西?)         Microsoft

Java基礎7:關於Java和包的那些

mod 重名 引入 java源代碼 第一個 lan 函數 org object Java基礎7:關於Java類和包的那些事 *.Java文件 問題:一個”.java”源文件中是否可以包括多個類(不是內部類)?有什麽限制?   答案:可以有多個類,但只能有一個public的