JavaSE - String クラスの共通メソッドの詳細説明 (文字列をいじる)

ced485cbb11e458d81a746890b32cf3f.gif

作者:流川メイプルノックコード

ブログホームページ:流川楓のブログ

コラム:私と一緒にJavaを学ぼう

引用:ハングリーでいて、愚かでいて

良いことをしたいなら、まずツールを研ぎ澄ます必要があります.大手メーカーからのオファーを獲得するための超強力なツールを紹介しましょう-Niuke.com

クリックして無料で登録し、私と一緒に質問をブラッシングしてください  

記事ディレクトリ

1. 文字列の一般的な構造

2. String オブジェクトの比較

1. == は同じオブジェクトを参照しているかどうかを比較します

2. boolean equals(Object anObject) メソッド: 辞書順で比較

3. int compareTo(String s) メソッド: 辞書順で比較する

4. int compareToIgnoreCase(String str) メソッド

3.文字列検索

char charAt(int インデックス)

int indexOf(int ch)

int indexOf(int ch, int fromIndex)

int indexOf(文字列 str)

int indexOf(文字列 str, int fromIndex)

int lastIndexOf(int ch)

int lastIndexOf(int ch, int fromIndex)

int lastIndexOf(文字列 str)

int lastIndexOf(文字列 str, int fromIndex)

4.変換

1.数値と文字列の変換

2. 大文字小文字変換

3.文字列から配列へ 

4.フォーマット

5.弦交換

 1.指定されたすべてのコンテンツを置き換えます

2.最初のコンテンツを置き換える

6. 文字列分割

1.すべての文字列を分割します 

2. 文字列は、指定された形式で制限グループに分割されます

3.「.」分割

7.文字列傍受

1.指定されたインデックスから最後までインターセプト

2. 一部のコンテンツを傍受する

8. 文字列トリム()


1. 文字列の一般的な構造

1.定数構造を使用する

2. newString を使用して構築する

3. 文字配列構造を使用する

public class Test {
    public static void main(String[] args) {
        //1
        String str1 = "hello";
        System.out.println(str1);
        //2
        String str2 = new String("hello");
        System.out.println(str2);
        //3
        char[] chars = {'h','e','l','l','o'};
        System.out.println(chars);
    }
}

 他の方法を使用する場合の参照: string 公式ドキュメント 

文字列は継承できません。以下は String クラスのソース コードです。

 value が char 型の配列であり、文字列が実際には char 型の配列に格納されており、文字列の末尾に /0 がない

  したがって、 String は参照型であり、文字列自体を内部に保存しません。例を参照してください。

public class Test {
    public static void main(String[] args) {

        String str1 = new String("hello");

        String str2 = new String("world");

        String str3 = str1;
        System.out.println(str3);
    }
}

str1 と str2 は異なるオブジェクトを参照します str1 と str3 は同じオブジェクトを参照します 

public class Test {
    public static void main(String[] args) {

        String str1 = new String("hello");

        String str2 = new String("hello");
        
        System.out.println(str1==str2);

        System.out.println(str1.equals(str2));

    }
}

 String クラスは参照型なので、文字列の内容が同じでも等しくないので、等しいかどうかを比較するには、オブジェクトを呼び出してメソッドを比較する必要があります。

Java では、"" も String クラスのオブジェクトです。

public class Test {
    public static void main(String[] args) {
        System.out.println("hello".toString());

    }
}

toString() などのメソッドを呼び出すことができます 

2. String オブジェクトの比較

1. == は同じオブジェクトを参照しているかどうかを比較します

プリミティブ型変数の場合、比較は 2 つの変数に格納されている値が同じかどうかです。

参照型変数の場合、比較は、2 つの参照変数が同じオブジェクトを参照しているかどうかです。

上記のように

2. boolean equals(Object anObject) メソッド: 辞書順で比較

辞書的順序: 文字サイズの順序

 String クラスは、親クラスの Object の equals メソッドをオーバーライドし、Object の equals はデフォルトで == によって比較されます。

書き換え後の比較ロジック:

 public boolean equals(Object anObject) {

        //1. 先检测this和anObject是否为同一个对象比较,如果是返回true

        if (this == anObject) {
            return true;
        }

        //2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回false

        if (anObject instanceof String) {

            //向下转型

            String anotherString = (String)anObject;
            int n = value.length;

        //3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回false

            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;

                //4. 按照字典序,从前往后逐个字符进行比较

                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

3. int compareTo(String s) メソッド: 辞書順で比較する

equals はブール型を返し、compareTo は int 型を返します

比較方法:

1. 最初に辞書の順序に従ってサイズを比較し、等しくない文字がある場合は、2 つの文字のサイズの差を直接返します

2. 最初の k 文字が等しい場合 (k は 2 文字の最小長)、戻り値は 2 つの文字列の長さの差です。

例を参照してください。 

public class Test {
    public static void main(String[] args) {

        String str1 = new String("hello");

        String str2 = new String("hello");

        int ret = str1.compareTo(str2);
        if(ret>0){
            System.out.println("str1>str2");
        } else if (ret==0) {
            System.out.println("str1=str2");
        }
        else {
            System.out.println("str1<str2");
        }

    }

}

 ソースコード:

public int compareTo(String anotherString) {
        int len1 = value.length;
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2);
        char v1[] = value;
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) {
                return c1 - c2;
            }
            k++;
        }
        return len1 - len2;
    }

4. int compareToIgnoreCase(String str) メソッド

compareTo と同じですが、大文字と小文字の比較は無視されます 

public class Test {
    public static void main(String[] args) {

        String s1 = new String("abc");
        String s2 = new String("ac");
        String s3 = new String("ABc");
        String s4 = new String("abcdef");
        System.out.println(s1.compareToIgnoreCase(s2)); //不同输出字符差值-1
        System.out.println(s1.compareToIgnoreCase(s3)); //相同输出0
        System.out.println(s1.compareToIgnoreCase(s4)); //前k个字符完全相同,输出长度差值-3
        
    }
}

3.文字列検索

String クラスが提供する一般的な検索方法:

char charAt(int インデックス)

インデックス位置の文字を返します。インデックスが負の値または範囲外の場合、IndexOutOfBoundsException がスローされます

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdef");
        for (int i= 0;  i< s1.length(); i++) {
            System.out.println(s1.charAt(i));
        }
    }
}

 int indexOf(int ch)

ch が最初に出現した位置を返します。-1 は返しません。

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdef");

        System.out.println(s1.indexOf('c'));
    }
}

int indexOf(int ch, int fromIndex)

fromIndex の位置から始めて ch が最初に現れる位置を探し、-1 を返しません。

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdecf");

        System.out.println(s1.indexOf('c',3));
    }
}

int indexOf(文字列 str)

str が最初に出現した位置を返します。-1 は返しません。

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdecf");

        System.out.println(s1.indexOf("cde"));
    }
}

int indexOf(文字列 str, int fromIndex)

-1 を返さずに、fromIndex の位置から開始して、str が最初に現れる位置を見つけます。

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdecf");

        System.out.println(s1.indexOf("cde",3));
    }
}

int lastIndexOf(int ch)

後ろから前へ検索し、最初にchが現れる位置を返し、-1は返さない

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdecf");

        System.out.println(s1.lastIndexOf("c"));
    }
}

int lastIndexOf(int ch, int fromIndex)

fromIndexの位置から始めて、最初にchが現れる位置を奥から手前に探しても-1は返ってこない

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdecf");

        System.out.println(s1.lastIndexOf("c",4));
    }
}

int lastIndexOf(文字列 str)

後ろから前に検索し、str が最初に出現した位置を返します。-1 は返しません。

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdecf");

        System.out.println(s1.lastIndexOf("abc"));
    }
}

int lastIndexOf(文字列 str, int fromIndex)

fromIndex の位置から開始し、str が最初に現れる位置を後ろから前に探し、-1 を返さない

public class Test {
    public static void main(String[] args) {
        String s1 = new String("abcdecf");

        System.out.println(s1.lastIndexOf("abc",4));
    }
}

4.変換

1.数値と文字列の変換

public class Test {
    public static void main(String[] args) {
        String s1 = String.valueOf(123);

        System.out.println(s1);
    }
}

 

 使用するオーバーロードされたメソッドが多数あることがわかります。これにより、さまざまな種類の値を文字列に変換できます。

2. 大文字小文字変換

toUpperCase()

toLowerCase()

public class Test {
    public static void main(String[] args) {
        String s1 = "hellO嗨";
        String ret = s1.toUpperCase();
        System.out.println(ret);
    }
}

toUpperCase() は小文字のみを大文字に変換し、それ以外は何も変更しません。toLowerCase() も同様です。

3.文字列から配列へ 

toCharArray()

public class Test {
    public static void main(String[] args) {
        String str1 = "abcdef";
        char[] chars = str1.toCharArray();
        System.out.println(Arrays.toString(chars));
    }
}

 配列から文字列

public class Test {
    public static void main(String[] args) {

        char[] chars = {'h','e','l','l','o'};
        String s1 = new String(chars);
        System.out.println(s1);
    }
}

4.フォーマット

文字列.format()

public class Test {
    public static void main(String[] args) {

        String s = String.format("%d-%d-%d",2022,8,14);
        System.out.println(s);
    }
}

5.弦交換

注: 文字列は不変オブジェクトであるため、置換によって現在の文字列が変更されるのではなく、新しい文字列が生成されます。

文字列を使用して、既存の文字列データを置き換えます。メソッド:

1.String replaceAll(文字列正規表現、文字列置換) 

2.String replaceFirst(文字列正規表現、文字列置換)

 1.指定されたすべてのコンテンツを置き換えます

public class Test {
    public static void main(String[] args) {

        String s = "abcadeafagf";
        String ret = s.replaceAll("a","c");
        System.out.println(s);
        System.out.println(ret);
    }
}

 

 元の文字列は置換文字列の後も変更されておらず、置換後に新しい文字列を受け取る必要があることがわかります。

2.最初のコンテンツを置き換える


public class Test {
    public static void main(String[] args) {

        String s = "abcadeafagf";
        String ret = s.replaceFirst("a","c");
        System.out.println(s);
        System.out.println(ret);
    }
}

6. 文字列分割

指定された区切り文字に従って、完全な文字列をいくつかの部分文字列に分割します

String[] split(文字列正規表現)

String[] split(String regex, int limit)

1.すべての文字列を分割します 

public class Test {
    public static void main(String[] args) {

        String s = "hello world hello";
        String[] ret = s.split(" ");
        System.out.println(s);
        System.out.println(Arrays.toString(ret));
    }
}

2. 文字列は、指定された形式で制限グループに分割されます

public class Test {
    public static void main(String[] args) {

        String s = "hello world hello";
        String[] ret = s.split(" ",2);
        System.out.println(s);
        System.out.println(Arrays.toString(ret));
    }
}

3.「.」分割

public class Test {
    public static void main(String[] args) {

        String s = "hello.world.hello";
        String[] ret = s.split(".");
        System.out.println(s);
        System.out.println(Arrays.toString(ret));
    }
}

 通常は split(".") を使用して分割します。出力配列が空であることがわかりました。これは、分割が成功しなかったことを示しています。

理由: "." はエスケープする必要があります。"\\." を追加すると、分割できます。

public class Test {
    public static void main(String[] args) {

        String s = "hello.world.hello";
        String[] ret = s.split("\\.");
        System.out.println(s);
        System.out.println(Arrays.toString(ret));
    }
}

要約:

1. 文字「|」、「*」、「+」は、「\\」を先頭にエスケープする必要があります

2.「\」の場合は「\\\\」と書かなければならない

3. 文字列に複数の区切り文字がある場合は、"|" をハイフンとして使用できます。つまり、s.split("=|&"); は、s 文字列を = と & で分割します。

7.文字列傍受

文字列部分文字列(int beginIndex)

文字列部分文字列(int beginIndex, int endIndex)

1.指定されたインデックスから最後までインターセプト

public class Test {
    public static void main(String[] args) {

        String s = "hello world";
        String ret = s.substring(5);
        System.out.println(s);
        System.out.println(ret);
    }
}

2. 一部のコンテンツを傍受する

public class Test {
    public static void main(String[] args) {

        String s = "hello world";
        String ret = s.substring(0,5);
        System.out.println(s);
        System.out.println(ret);
    }
}

 要約:

1. インデックスは 0 から始まります

2. 前閉じ、後ろ開き区間の書き方に注意、substring(0, 5) は添字 5 を除いた添字 0 の文字を意味します。

8. 文字列トリム()

機能: 文字列の左右のスペースを削除し、中央のスペースを保持します

public class Test {
    public static void main(String[] args) {

        String s = "   hello world    ";
        String ret = s.trim();
        System.out.println(s);
        System.out.println(ret);
    }
}

 要約:

ほとんどの String クラス メソッドは元の文字列を直接操作せず、新しい文字列を返すことに気付きました。

「この問題の共有はこちらです。ブロガーに 3 つのリンクを提供することを忘れないでください。あなたのサポートが私の創造の最大の原動力です!

ced485cbb11e458d81a746890b32cf3f.gif

おすすめ

転載: blog.csdn.net/chenchenchencl/article/details/126330055