[Ava]-Stringクラス


String
別の言語では、文字列も文字型の配列と見なされ、Javaは文字列にクラスを提供します.
String Classです
Stringクラスはよく使われる重要なクラスですが、今回はしっかり整理しておきます.
不変クラス
String hi = "hi";
String there = "there";
hi = hi + there;
演算子「+」を使用して文字列をマージする場合、インスタンスの文字列は変更されません.
すなわち、新しいStringインスタンス、文字列「ore」を作成します.
したがって、演算子「+」を使用して文字列を連結すると、各演算子に新しい文字列が作成されます.
Stringインスタンスを作成するとメモリ容量が消費されるため、マージを最小限に抑えることが望ましい.
文字列の比較
文字列を作成する方法は2つあります.
  • 文字列文字文字指定
  • Stringクラスジェネレータ
  • を使用する.
    String s1 = "hi";   //  문자열 리터럴 "hi"의 주소가 s1에 저장
    String s2 = "hi";   //  문자열 리터럴 "hi"의 주소가 s2에 저장
    String s3 = new String("hi");   //  새로운 String 인스턴스 생성
    String s4 = new String("hi");   //  새로운 String 인스턴스 생성
    2つの方法の違いは、Stringクラスジェネレータを使用すると、常に新しいStringインスタンスが作成されることです.
    文字列文字は既存のものを再使用します.
    s1 == s2    //  true
    s1 == s3    //  false
    s3 == s4    //  false
    equals()を使用して文字列の内容「hi」を比較した結果、それらは同じであることが分かった.
    比較アドレスの演算子で比較した結果,(s 1,s 2)は同じで,(s 1,s 3)/(s 3,s 4)は異なることが分かった.
    文字列
    public static void main(String[] args) {
        String s1 = "hi";
        String s2 = "hi";
        String s3 = "hello";
    }
    上記の文字列文字方式でコードを記述してコンパイルします.
    // parameter  args
    L0
    LINENUMBER 5 L0
    LDC "hi"
    ASTORE 1
    L1
    LINENUMBER 6 L1
    LDC "hi"
    ASTORE 2
    L2
    LINENUMBER 7 L2
    LDC "hello"
    ASTORE 3
    L3
    LINENUMBER 8 L3
    RETURN
    ...
    classファイルを開くと、クラスファイルに文字列接尾辞(「hi」、「hello」)が格納されていることがわかります.
    同様に、String Literalはコンパイル時にクラスファイルに格納される.
    コードを実行すると、hiとhelloを含むStringインスタンスが作成されます.
    参照変数は以下のように、それぞれ参照します.
  • s 1、s 2=>Stringインスタンス(「hi」)
  • 参照
  • s 3=>Stringインスタンス(「hello」)を参照してください.
  • 整理して、上でコンパイルしたクラスファイルがクラスローダによってメモリにロードされたとき、テキストリストの文字
    JVM内の'상수풀(constant pool)'に格納されます.
    「hi」などの文字列文字が自動的に生成され、保存されます.
    空の文字列(空の文字列)
    String s = "";
    上記のコードは、Stringインスタンスに「new char[0]」などの長さ0の文字配列を格納することに相当します.
    Stringクラスの作成者とメソッド
    一般的なStringクラスの作成者と方法について説明します.
    簡単に使い方メインで整理しました.
    String(char[] value)
    char[] c = {'H', 'e', 'l', 'l', 'o'};
    String hello = new String(c);
    c = hello.toCharArray();
  • 文字[]->Stringに変換するには
  • を使用します.
  • の場合、toCharArray()
  • が使用される
    char charAt(int index)
    char c1 = "hello".charAt(1);  //  'e'
    指定された位置(index)の文字
  • を返します.
  • int compareTo(String str)
    int i = "aaa".compareTo("aaa");      //  0
    int i2 = "aaa".compareTo("bbb");     //  -1
    int i3 = "bbb".compareTo("aaa");     //  1
  • 文字列(str)と
  • を辞書順に比較する
  • は0に等しく、前は負、後は正
  • String concat(String str)
    String helloWorld = "Hello".concat(" World");
  • 文字列(str)に続く.
  • boolean contains(CharSequence s)
    boolean result = helloWorld.contains("lo");     //  true
    指定文字列
  • (s)
  • が含まれていることを確認します.
    boolean startsWith(String prefix)
    String file = "Hello.jpg";
    boolean b = file.startsWith("Hello");   //  true
  • 指定文字列(接頭辞)で始まる
  • を確認します.
    boolean endsWith(String suffix)
    String file = "Hello.jpg";
    boolean b = file.endsWith("jpg");   //  true
  • で指定された文字列(接尾辞)で
  • が終了することを確認します.
    boolean equalsIgnoreCase(String str)
    boolean b = "hello".equalsIgnoreCase("HELLO");  //  true
    大文字と小文字を区別しない指定文字列(str)と比較
    int indexOf(int ch)
    int index = hello.indexOf('l');     //  2
    文字列に
  • 文字(ch)が存在するかどうかを確認し、戻り位置(index)
  • を返します.
  • が存在しない場合は-1を返します.
  • int indexOf(int ch, int pos)
    int index = hello.indexOf('e', 0);  //  1
    int index2 = hello.indexOf('e', 2);  //  -1
  • 文字(ch)文字列で指定する位置(pos)からチェックを開始し、戻り位置(index)
  • を返します.
  • が存在しない場合は-1を返します.
  • int indexOf(String str)
    String s = "HI THERE"
    int idx = s.indexOf("THERE");   //  3
  • 文字列(str)が存在するかどうかを確認し、戻り位置(index)
  • を返します.
  • が存在しない場合は-1を返します.
  • int lastIndexOf(int ch)
    String s = "java.lang.String";
    int idx = s.lastIndexOf('.');   //  10
    int idx2 = s.indexOf('.');  //  4
    文字列の右端から
  • 文字(ch)、戻り位置(index)
  • を検索
  • が存在しない場合は-1を返します.
  • int length()
    String s = "Hello".length();    //  5
  • 文字列の長さを返します.
  • String[] split(String regex)
    String books = "JPA, SPRING, JAVA";
    String[] arr = books.split(",");    //  [JPA, SPRING, JAVA];
  • 文字列を指定区切り文字(regex)に分割し、文字列配列に挿入して返します.
  • String substring(int begin)
    String substring(int begin, int end)
    String s = "java.lang.Object";
    String object = s.substring(10);    //  Object
    String lang = s.substring(5, 9));   //  lang
    は、
  • の開始位置から終了位置(end)までの範囲の文字列
  • を返します.
  • には開始位置文字が含まれますが、終了位置文字は含まれません(begin<=x
  • String toLowerCase()
    String lower = "HellO".toLowerCase();   //  hello
  • すべての文字列を小文字に変更
  • String toUpperCase()
    String upper = "heLLo".toLowerCase();   //  HELLO
  • すべての文字列を大文字に変更
  • String trim()
    String trim = "    hi hello  ".trim();      //  hi hello
    結果
  • を返し、文字列の左端と右端のスペースを削除します.
  • 文字列の間のスペースは削除されません
  • String valueOf()
    String b = String.valueOf(true);
    String i = String.valueOf(100);
    String c = String.valueOf('a');
    String l = String.valueOf(100L);
    String d = String.valueOf(100.0);
    指定値
  • を文字列
  • に戻す.
  • 参照変数の場合、toString()を呼び出す結果が返されます.
  • join()/StringJoiner
    join()は、複数の文字列の間に区切り記号を付けることでマージされます.
    文字列をセパレータで切断するsplit()とは逆の操作です.
    String coffees = "latte, americano, mocha";
    String[] arr = coffees.split(",");
    String str = String.join("/", arr);     //  latte/americano/mocha
    StringJoinerクラスを使用して文字列をマージすることもできます.
    StringJoiner sj = new StringJoiner("/", "[", "]");
    for (String s : arr) {
        sj.add(s.toUpperCase());
    }
    
    System.out.println(sj.toString());  //  [LATTE|AMERICANO|MOCHA]
    文字コード変換
    getBytes(String charsetName)を使用して、文字列内の文字コードを別のコードに変更します.
    public static void main(String[] args) {
        String han = "한";
        byte[] bArr = han.getBytes(StandardCharsets.UTF_8);
        byte[] bArr2 = han.getBytes(StandardCharsets.UTF_16);
    
        System.out.println("UTF-8:" + joinByteArr(bArr));
        System.out.println("UTF-16:" + joinByteArr(bArr2));
    
        System.out.println("UTF-8:" + new String(bArr, StandardCharsets.UTF_8));
        System.out.println("UTF-16:" + new String(bArr2, StandardCharsets.UTF_16));
    }
    
    private static String joinByteArr(byte[] bArr) {
        StringJoiner sj = new StringJoiner(":", "[", "]");
    
        for (byte b : bArr) {
            sj.add(String.format("%02X", b));
        }
        return sj.toString();
    }
    UTF-8:[ED:95:9C]
    UTF-16:[FE:FF:D5:5C]
    UTF-8:한
    UTF-16:한
    きほん<>Stringへんかん
    エントリーレベル->String
    int i = 100;
    String str1 = i + "";
    String str2 = String.valueOf(i);
    2つの方法
  • があり、この場合、性能valueOf()がより良い.
  • String->エントリーレベル
    int i = Integer.parseInt("100");
    int i2 = Integer.valueOf("100");
    boolean b = Boolean.parseBoolean("true");
    boolean b2 = Boolean.valueOf("false");
  • valueOf()またはparseXXX()を使用します.
  • valueOf()の戻りタイプはRAPPERクラスであり,自動トレースにより自動変換される.
  • メソッドの名前を統一するためにvalueOf()が追加された.
  • valueOf()はメソッド内部でParseInt()を呼び出すため、戻りタイプは異なるメソッドにすぎない.
  • References
    南宮城
  • ,『ジャワの晶石』,道宇出版(2016)
  • https://docs.oracle.com/javase/8/docs/api/index.html