String (es gibt ein kleines Problem)

Die String-Klasse bietet eine Vielzahl von Methoden zum Suchen und Extrahieren von Teilzeichenfolgen. Häufig verwendete Methoden sind:

// 是否包含子串:
"Hello".contains("ll"); // true

Suchzeichenfolge suchen

Beispiel:

"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true

Teilzeichenfolge extrahieren

Beispiel:

"Hello".substring(2); // "llo"
"Hello".substring(2, 4); "ll"

Teilzeichenfolge ersetzen

Um einen Teilstring in einem String zu ersetzen, gibt es zwei Methoden. Eine basiert auf dem Ersetzen von Zeichen oder Zeichenfolgen:

String s = "hello";
s.replace('l', 'w'); // "hewwo",所有字符'l'被替换为'w'
s.replace("ll", "~~");  //  "he~~o",所有子串"ll"被替换为"~~" 

Saite teilen

Verwenden Sie zum Teilen einer Zeichenfolge die Methode split (). Der reguläre Ausdruck wird außerdem übergeben:

String s = "A,B,C,D";
String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}

Verkettete Zeichenfolge

Verwenden Sie zum Verketten von Zeichenfolgen die statische Methode join (), die das Zeichenfolgenarray mit der angegebenen Zeichenfolge verbindet:

String[] arr = {
    
    "A", "B", "C"};
String s = String.join("***", arr); // "A***B***C"

Zeichenfolge formatieren

Die Zeichenfolge enthält die Methode formatiert () und die statische Methode format (). Sie können andere Parameter übergeben, die Platzhalter ersetzen und anschließend eine neue Zeichenfolge generieren:

public class Main {
    
    
    public static void main(String[] args) {
    
    
        String s = "Hi %s, your score is %d!";
        System.out.println(s.formatted("Alice", 80));
        System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5));
    }
}

Es gibt mehrere Platzhalter und einige Parameter werden später übergeben. Der Parametertyp sollte mit dem Platzhalter übereinstimmen. Wir verwenden diese Methode häufig, um Informationen zu formatieren. Häufig verwendete Platzhalter sind:

% s: Anzeigezeichenfolge;
% d: Ganzzahl anzeigen;
% x: Hexadezimale Ganzzahl anzeigen;
% f: Gleitkommazahl anzeigen.

Platzhalter können auch formatiert werden, z. B.:% .2f bedeutet, dass zwei Dezimalstellen angezeigt werden. Wenn Sie nicht sicher sind, welchen Platzhalter Sie verwenden sollen, verwenden Sie immer% s, da% s einen beliebigen Datentyp anzeigen kann.

Typkonvertierung

Um einen Basistyp oder Referenztyp in eine Zeichenfolge zu konvertieren, können Sie die statische Methode valueOf () verwenden . Dies ist eine überladene Methode. Der Compiler wählt automatisch die entsprechende Methode gemäß den Parametern aus:

String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"
String.valueOf(new Object()); // 类似java.lang.Object@636be97c

Um eine Zeichenfolge in andere Typen zu konvertieren, muss sie auf der jeweiligen Situation basieren. So konvertieren Sie beispielsweise eine Zeichenfolge in den Typ int:

int n1 = Integer.parseInt("123"); // 123
int n2 = Integer.parseInt("ff", 16); // 按十六进制转换,255

Konvertieren Sie die Zeichenfolge in einen booleschen Typ:

boolean b1 = Boolean.parseBoolean("true"); // true
boolean b2 = Boolean.parseBoolean("FALSE"); // false

Achten Sie besonders darauf, dass Integer über eine getInteger (String) -Methode verfügt, die einen String nicht in einen int konvertiert, sondern die dem String entsprechende Systemvariable in einen Integer konvertiert:

Integer.getInteger("java.version"); // 版本号,11

Konvertieren Sie zwischen String und char

char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String

Wenn das Array char [] geändert wird, ändert sich der String nicht:

public class Main {
    
    
    public static void main(String[] args) {
    
    
        char[] cs = "Hello".toCharArray();
        String s = new String(cs);
        System.out.println(s);
        cs[0] = 'X';
        System.out.println(s);
    }
}

Beide Ergebnisse sind:
Hallo
Hallo

Dies liegt daran, dass beim Erstellen einer neuen String-Instanz durch einen neuen String (char []) nicht direkt auf das übergebene char [] -Array verwiesen wird, sondern eine Kopie erstellt wird. Daher wirkt sich das Ändern des externen char [] -Arrays nicht auf das aus char [] -Array innerhalb der String-Instanz, da dies zwei verschiedene Arrays sind.

Aus dem Unveränderlichkeitsentwurf von String geht hervor, dass das eingehende Objekt, wenn es sich wahrscheinlich ändert, kopiert werden muss, anstatt direkt darauf zu verweisen.

Mit dem folgenden Code wird beispielsweise eine Score-Klasse zum Speichern der Scores einer Gruppe von Schülern entworfen:

public class Main {
    
    
    public static void main(String[] args) {
    
    
        int[] scores = new int[] {
    
     88, 77, 51, 66 };
        Score s = new Score(scores);
        s.printScores();
        scores[2] = 99;
        s.printScores();
    }
}

class Score {
    
    
    private int[] scores;
    public Score(int[] scores) {
    
    
        this.scores = scores;
    }

    public void printScores() {
    
    
        System.out.println(Arrays.toString(scores));
    }
}

[88, 77, 51, 66]
[88, 77, 99, 66]

Wenn Sie die Ausgabe zweimal beobachten, da Score direkt auf das extern übergebene int [] -Array verweist, ändert der externe Code das int [] -Array und wirkt sich auf die Felder der Score-Klasse aus. Wenn der externe Code nicht vertrauenswürdig ist, führt dies zu Sicherheitsrisiken.

Bitte korrigieren Sie die Konstruktionsmethode von Score so, dass die Änderung des Arrays durch externen Code keine Auswirkungen auf das Feld int [] der Score-Instanz hat.

Ich denke du magst

Origin blog.csdn.net/Mr_zhang66/article/details/113243112
Empfohlen
Rangfolge