Technologieaustausch

Java – String-Klasse

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Was ist die String-Klasse?

Ich glaube, ihr seid beim Erlernen der C-Sprache mit Strings in Kontakt gekommen, aber in der C-Sprache kann man sie nur verwenden
Zeichenarray char[10] str = „hello“; oder Zeichenzeiger char *str = „hello“;Es wird keine dedizierte String-Klasse bereitgestellt . In objektorientiertem Java werden die String-Klasse und ihre Operationen speziell bereitgestellt, was für unsere Programmierer bequemer zu verwenden ist.

String-Unveränderlichkeit

Der Inhalt der Zeichenfolge kann nicht geändert werden.
Fügen Sie hier eine Bildbeschreibung ein

  • Die Zeichen in der String-Klasse verwalten tatsächlich ein Zeichenarray namens Wert.
  • Die String-Klasse wird durch final geändert, was bedeutet, dass final nicht vererbt werden kann.
  • Final ändert den Wert, was bedeutet, dass der Wert nicht auf andere Arrays verweisen kann, aber der Inhalt des Arrays kann trotzdem geändert werden!

In String erzeugen alle Vorgänge, die die Möglichkeit beinhalten, den Inhalt der Zeichenfolge zu ändern, ein neues Objekt, und was geändert wird, ist das neue Objekt.
Wenn Sie beispielsweise nach Teilzeichenfolgen suchen:
Fügen Sie hier eine Bildbeschreibung ein
Manche Leute sagen: Strings sind unveränderlich, weil das Array, in dem die darin enthaltenen Zeichen gespeichert sind, von final geändert wird und daher nicht geändert werden kann.

  • Diese Aussage ist falsch Erstens zeigt die endgültige Änderung von String an, dass die String-Klasse die endgültige Klasse ist und nicht geändert oder vererbt werden kann. Der endgültig geänderte Referenztyp gibt an, dass die Referenzvariable nicht auf andere Objekte verweisen kann, der Inhalt des referenzierten Objekts jedoch weiterhin geändert werden kann.
  public static void main(String[] args) {
        final char[] arr = {'h','e','l','l','o'};
        arr[0] = 'H';
        System.out.println(String.valueOf(arr));//Hello
        // arr = new char[]{'h','o'};Error

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. Grundlegende Verwendung der String-Klasse

1 Saitenkonstruktion

String ist ein Referenzdatentyp und speichert nicht den String selbst.

public class Test {
    public static void main(String[] args) {
        //1.直接赋值
        String s1 = "first";
        //2.new 对象
        String s2 = new String("second");
        //3. 创建字符数组
        char[] arr = {'t','h','i','r','d'};
        String s3 = new String(arr);
        
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Fügen Sie hier eine Bildbeschreibung ein

Beachten:
Zeichenfolge s1 = „erste“;
Die Java Virtual Machine (JVM) prüft zunächst, ob die Zeichenfolge „first“ bereits im String-Konstantenpool vorhanden ist. Wenn sie vorhanden ist, wird die Referenz der Zeichenfolge im Konstantenpool direkt zurückgegeben. Wenn sie nicht vorhanden ist, wird die Zeichenfolge zum Konstantenpool hinzugefügt und ihre Referenz im Konstantenpool zurückgegeben.

2 Vergleich von String-Objekten

  1. == Vergleicht, ob es sich um dieselbe Referenz handelt
     //s1 s2 分别是new 一个新的字符串"hello"
    String s1 = new String("hello");
	String s2 = new String("hello");
	String s3 = "Hello";
	String s4 = s1;

	System.out.println(s1 == s2);//false
 	System.out.println(s1 == s4);//true
	System.out.println(s1 == s3);//false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. equal() verwendet und, um zu bestimmen, ob zwei Zeichenfolgen gleich sind, und gibt „true“ zurück, wenn sie gleich sind, andernfalls „false“.
      
        //因为Object类中的equals()方法是==实现的,完成不了String类的需求,
        //所以String对equals()实现了重写

        String s1 = new String("hello");
        String s2 = new String("hello");
        String s3 = "Hello";
        String s4 = s1;

        System.out.println(s1.equals(s2));//true
       	System.out.println(s1.equals(s4));//true
        System.out.println(s1.equals(s3));//false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Fügen Sie hier eine Bildbeschreibung ein
3. CompareTo() vergleicht in lexikografischer Reihenfolge, der Rückgabewert ist int

        /*
        * 比较的方式有一下两种:
        * 1.先一个一个字符相比较,如果出现不同的字符,则返回差值
        * 2.如果前x个字符相等,则返回两个字符串的长度差值
        * */

        String s1 = new String("abc");
        String s2 = new String("abcdef");
        String s3 = new String("abd");
        String s4 = new String("abc");
        
        System.out.println(s1.compareTo(s2));//-3 (3-6)
        System.out.println(s1.compareTo(s3));//-1
        System.out.println(s1.compareTo(s4));//0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  1. CompareToIgnoreCase() Identisch mit der CompareTo-Methode, ignoriert jedoch die Groß-/Kleinschreibung

        String s1 = new String("Abc");
        String s2 = new String("aBcdef");
        String s3 = new String("aBd");
        String s4 = new String("ABc");

        System.out.println(s1.compareToIgnoreCase(s2));//-3 (3-6)
        System.out.println(s1.compareToIgnoreCase(s3));//-1
        System.out.println(s1.compareToIgnoreCase(s4));//0

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3. String-Suche

MethodeFunktion
char charAt(int index)Gibt das Zeichen an der Indexposition zurück. Wenn der Index negativ ist oder außerhalb der Grenzen liegt, wird eine IndexOutOfBoundsException-Ausnahme ausgelöst.
int indexOf(int ch)Gibt die Position zurück, an der ch zum ersten Mal erscheint, ohne -1 zurückzugeben
int indexOf(int ch, intfromIndex)Beginnen Sie an der fromIndex-Position, um die Position zu finden, an der ch zum ersten Mal erscheint, und geben Sie -1 zurück
int indexOf(String str)Gibt die Position zurück, an der str zum ersten Mal erscheint, ohne -1 zurückzugeben
int indexOf(String str, intfromIndex)Suchen Sie das erste Vorkommen von str ausgehend von der fromIndex-Position, ohne -1 zurückzugeben
int letzterIndexVon(int ch)Suchen Sie von hinten nach vorne und kehren Sie zu der Position zurück, an der ch zuerst erscheint. Wenn nicht, geben Sie -1 zurück
int letzterIndexVon(int ch, intvonIndex)Beginnen Sie mit der Suche ab der fromIndex-Position und suchen Sie von hinten nach vorne nach der Position, an der ch zum ersten Mal erscheint. -1 wird nicht zurückgegeben.
int letzterIndexVon(String str)Suchen Sie von hinten nach vorne und geben Sie die Position zurück, an der str zuerst erscheint. -1 wird nicht zurückgegeben.
int letzterIndexVon(String str, intfromIndex)Beginnen Sie mit der Suche an der fromIndex-Position und suchen Sie von hinten nach vorne nach der Position, an der str Nr. -1 zurückgegeben wird.

 public static void main(String[] args) {
 
        String s = "Hello, how are you today?";
        System.out.println(s.charAt(2)); //l
        System.out.println(s.indexOf('H')); //0
        System.out.println(s.indexOf('l',2)); //从第二个开始找 2
        System.out.println(s.indexOf("are")); //11
        System.out.println(s.indexOf("are",12)); // 未找到-1
        System.out.println(s.lastIndexOf('l')); //从后往前数 3
        System.out.println(s.lastIndexOf('l',3));// 从第三个往后数 3
        System.out.println(s.lastIndexOf("how"));// 7
        System.out.println(s.lastIndexOf("how",6));// 未找到 -1

    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4.Konvertierung

1. Konvertierung von Zahlen und Zeichenfolgen

		String s1 = String.valueOf(1234);
        String s2 = String.valueOf(12.34);
        String s3 = String.valueOf(true);
        String s4 = String.valueOf(new Student("Hanmeimei", 18));
        System.out.println(s1);//1234 String
        System.out.println(s2);//12.34 String
        System.out.println(s3);//true String
        System.out.println(s4);//Student@1b6d3586
        System.out.println("=================================");
        int data1 = Integer.parseInt("1234");
        double data2 = Double.parseDouble("12.34");
        System.out.println(data1);//1234
        System.out.println(data2);//12.34
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2. Fallkonvertierung

 		String s1 = "hello";
        String s2 = "HELLO";
        System.out.println(s1.toUpperCase());//HELLO
        System.out.println(s1.toLowerCase());//hello
  • 1
  • 2
  • 3
  • 4

3. String in Zeichen-Array und Zeichen-Array in String

 		//字符串转字符数组
        String s = "What can I say!";
        char[] arr = s.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }
        System.out.println();
        //字符数组转字符串
        String s1 = new String(arr);
        System.out.println(s1);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4.Formatierung

		//格式化
        String s = String.format("%d/%02d/%d",2024,07,10);
        System.out.println(s);//2024/07/10
  • 1
  • 2
  • 3

5. Saitenaustausch

MethodeFunktion
String replaceAll(String regulärer Ausdruck, String-Ersetzung)Ersetzen Sie alle angegebenen Inhalte
String replaceFirst(String regulärer Ausdruck, String-Ersetzung)Ersetzen Sie den ersten Inhalt
		String s = "What can I say say!";
        System.out.println(s.replaceAll("say","look"));
        System.out.println(s.replaceFirst("say","SAY"));

        //What can I look look!
        //What can I SAY say!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

6. String-Splitting

MethodeFunktion
String[] teilen(String regulärer Ausdruck)Alle Saiten aufteilen
String[] split(String regulärer Ausdruck, int Grenze)Teilen Sie die Zeichenfolge im angegebenen Format in Grenzgruppen auf
 		//字符串拆分
        String s = "字 符 串 拆 分";
        String[] str = s.split(" ");
        for(String i : str) {
            System.out.print(i+"|");
        }
        System.out.println();
        String[] str2 = s.split(" ",2);
        for(String i : str2) {
            System.out.println(i);
        }
        
        /*
        * 输出:
        字|符|串|拆|分|
        字
        符 串 拆 分
        * */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
       /*
       *拆分是特别常用的操作:
       * 一定要重点掌握
       *另外有些特殊字符(通配符)作为分割符可能无法正确切分, 需要加上转义.
       * */
       String s2 = "192.168.1.16" ;
       String[] result = s2.split("\.") ;
       for(String i: result) {
           System.out.println(i);
       }
       System.out.println("\");
       //为了匹配字面上的点号,你需要使用反斜杠()来转义它,
       // 但在Java字符串中,反斜杠本身也是一个转义字符,
       // 所以你需要使用双反斜杠(\)来表示一个字面量上的反斜杠。
       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

7. String-Abfangen

	 //字符串截取
        String s = "What can I say!";
        System.out.println(s.substring(6));//an I say!
        System.out.println(s.substring(0,3));//What
  • 1
  • 2
  • 3
  • 4

8. Entfernen Sie führende und nachgestellte Leerzeichen aus Zeichenfolgen

	 String s = "   yy ds       ";
        System.out.println(s.trim());//yy ds
  • 1
  • 2

10. String-Änderung

Die String-Klasse kann nicht geändert werden. Bei allen Änderungen werden neue Objekte erstellt, was nicht effizient ist.
Fügen Sie hier eine Bildbeschreibung ein
Dies sind nur 10000, was 341 ms entspricht. Wenn Sie es ändern möchten, wird empfohlen, StringBuffer oder StringBuilder zu verwenden.

3. StringBuffer und StringBuilder

Aufgrund der Unveränderlichkeit von String stellt Java zur Erleichterung der Änderung von Zeichenfolgen auch die Klassen StringBuilder und StringBuffer bereit. Und die meisten Methoden dieser beiden Klassen sind gleich.
Bei Interesse klicken Sie bitteOnline-Dokumentation

Fügen Sie hier eine Bildbeschreibung ein

1 ms nach Verwendung von StringBuffer.
Fügen Sie hier eine Bildbeschreibung ein
Hinweis: String- und StringBuilder-Klassen können nicht direkt konvertiert werden. Wenn Sie sich gegenseitig konvertieren möchten, können Sie die folgenden Prinzipien verwenden:

  • String wird zu StringBuilder: Verwenden Sie den Konstruktor oder die append()-Methode von StringBuilder
  • StringBuilder wird zu String: Rufen Sie die toString()-Methode auf

Der Unterschied zwischen String, StringBuffer und StringBuilder

  • Der Inhalt von String kann nicht geändert werden, aber der Inhalt von StringBuffer und StringBuilder kann geändert werden.
  • StringBuffer verwendet synchrone Verarbeitung und ist eine Thread-sichere Operation; StringBuilder verwendet keine synchrone Verarbeitung und ist eine thread-unsichere Operation.
    Tun

Die sogenannte Thread-Sicherheit ist so, als ob mehrere Personen zu diesem Zeitpunkt auf die Toilette gehen. Sie gehen zuerst hinein, schließen die Tür und kommen wieder heraus, wenn Sie fertig sind. Während dieser Zeit haben Sie diesen Raum für sich allein und niemand kann ihn betreten. Schließen Sie zuerst die aktuelle Aufgabe ab, monopolisieren Sie die Ressourcen und geben Sie nach Abschluss die belegten Ressourcen frei.