Κοινή χρήση τεχνολογίας

Java - Κλάση συμβολοσειρών

2024-07-12

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

1. Τι είναι η κλάση String;

Νομίζω ότι έχετε έρθει σε επαφή με χορδές όταν μαθαίνατε τη γλώσσα C, αλλά στη γλώσσα C μπορείτε να χρησιμοποιήσετε μόνο
Πίνακας χαρακτήρων char[10] str = "γεια" ή δείκτης χαρακτήρων char *str = "γεια" αλλάΔεν παρέχεται ειδική τάξη String . Στην αντικειμενοστραφή Java, η κλάση String και οι λειτουργίες της παρέχονται ειδικά, κάτι που είναι πιο βολικό να χρησιμοποιούν οι προγραμματιστές μας.

Αμετάβλητη χορδή

Τα περιεχόμενα της συμβολοσειράς δεν μπορούν να αλλάξουν.
Εισαγάγετε την περιγραφή της εικόνας εδώ

  • Οι χαρακτήρες στην κλάση String διατηρούν στην πραγματικότητα έναν πίνακα χαρακτήρων που ονομάζεται τιμή.
  • Η κλάση String τροποποιείται με τελικό, πράγμα που σημαίνει ότι το τελικό δεν μπορεί να κληρονομηθεί.
  • Το Final τροποποιεί την τιμή, πράγμα που σημαίνει ότι η τιμή δεν μπορεί να αναφέρεται σε άλλους πίνακες, αλλά τα περιεχόμενα του πίνακα μπορούν ακόμα να αλλάξουν!

Στο String, όλες οι λειτουργίες που περιλαμβάνουν τη δυνατότητα τροποποίησης του περιεχομένου της συμβολοσειράς δημιουργούν ένα νέο αντικείμενο και αυτό που αλλάζει είναι το νέο αντικείμενο.
Για παράδειγμα, κατά την αναζήτηση υποσυμβολοσειρών:
Εισαγάγετε την περιγραφή της εικόνας εδώ
Μερικοί άνθρωποι λένε: Οι συμβολοσειρές είναι αμετάβλητες επειδή ο πίνακας που αποθηκεύει τους χαρακτήρες μέσα τους τροποποιείται με τελικό και επομένως δεν μπορεί να αλλάξει.

  • Αυτή η δήλωση είναι εσφαλμένη Πρώτον, η τελική τροποποίηση του String υποδεικνύει ότι η κλάση String είναι η τελική κλάση και δεν μπορεί να τροποποιηθεί ή να κληρονομηθεί. Ο τελικός τροποποιημένος τύπος αναφοράς υποδεικνύει ότι η μεταβλητή αναφοράς δεν μπορεί να αναφέρεται σε άλλα αντικείμενα, αλλά τα περιεχόμενα του αναφερόμενου αντικειμένου μπορούν ακόμα να τροποποιηθούν.
  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. Βασική χρήση της κλάσης String

1 Κατασκευή χορδών

Η συμβολοσειρά είναι ένας τύπος δεδομένων αναφοράς και δεν αποθηκεύει την ίδια τη συμβολοσειρά.

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

Εισαγάγετε την περιγραφή της εικόνας εδώ

Ειδοποίηση:
Συμβολοσειρά s1 = "πρώτη";
Η εικονική μηχανή Java (JVM) θα ελέγξει πρώτα εάν η συμβολοσειρά "πρώτα" υπάρχει ήδη στη συγκέντρωση σταθερών συμβολοσειρών. Εάν υπάρχει, η αναφορά της συμβολοσειράς στο σταθερό pool επιστρέφεται απευθείας, εάν δεν υπάρχει, η συμβολοσειρά προστίθεται στη συγκέντρωση σταθερών και επιστρέφεται η αναφορά της στη συγκέντρωση σταθερών.

2 Σύγκριση αντικειμένων συμβολοσειράς

  1. == Συγκρίνει εάν είναι η ίδια αναφορά
     //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. Η equals() χρησιμοποιεί και για να προσδιορίσει αν δύο συμβολοσειρές είναι ίσες, επιστρέφει true αν είναι ίσες, διαφορετικά 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

Εισαγάγετε την περιγραφή της εικόνας εδώ
3. Η compareTo() συγκρίνει με λεξικογραφική σειρά, η τιμή επιστροφής είναι 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() Το ίδιο με τη μέθοδο compareTo, αλλά αγνοεί τα πεζά

        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. Αναζήτηση συμβολοσειρών

μέθοδοςΛειτουργία
char charAt(int index)Επιστρέφει τον χαρακτήρα στη θέση του ευρετηρίου Εάν ο δείκτης είναι αρνητικός ή εκτός ορίων, δημιουργείται μια εξαίρεση IndexOutOfBoundsException.
int indexOf(int ch)Επιστρέφει τη θέση όπου εμφανίζεται για πρώτη φορά το ch, χωρίς να επιστρέφει -1
int indexOf(int ch, intfromIndex)Ξεκινήστε από τη θέση fromIndex για να βρείτε τη θέση όπου εμφανίζεται για πρώτη φορά το ch και επιστρέψτε -1
int indexOf(String str)Επιστρέφει τη θέση όπου εμφανίζεται για πρώτη φορά το str, χωρίς να επιστρέφει -1
int indexOf(String str, intfromIndex)Βρείτε την πρώτη εμφάνιση του str ξεκινώντας από τη θέση fromIndex, χωρίς να επιστρέψετε -1
int lastIndexOf(int ch)Αναζητήστε από πίσω προς τα εμπρός, επιστρέψτε στη θέση όπου εμφανίζεται για πρώτη φορά το ch, αν όχι επιστροφή -1
int lastIndexOf(int ch, intfromIndex)Ξεκινήστε την αναζήτηση από τη θέση fromIndex και αναζητήστε από πίσω προς τα εμπρός για τη θέση όπου το ch εμφανίζεται για πρώτη φορά.
int lastIndexOf(String str)Αναζητήστε από πίσω προς τα εμπρός και επιστρέψτε τη θέση όπου εμφανίζεται για πρώτη φορά η str -1.
int lastIndexOf(String str, intfromIndex)Ξεκινήστε την αναζήτηση από τη θέση fromIndex και αναζητήστε από πίσω προς τα εμπρός τη θέση όπου εμφανίζεται για πρώτη φορά η str.

 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.Μετατροπή

1. Μετατροπή αριθμών και συμβολοσειρών

		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. Μετατροπή θήκης

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

3. Πίνακας από συμβολοσειρά σε χαρακτήρες και πίνακας χαρακτήρων σε συμβολοσειρά

 		//字符串转字符数组
        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.Μορφοποίηση

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

5. Αντικατάσταση χορδών

μέθοδοςΛειτουργία
Συμβολοσειρά αντικατάστασηΌλων (Regex συμβολοσειράς, Αντικατάσταση συμβολοσειράς)Αντικαταστήστε όλο το καθορισμένο περιεχόμενο
Αντικατάσταση συμβολοσειράςFirst (regex συμβολοσειράς, αντικατάσταση συμβολοσειράς)Αντικαταστήστε το πρώτο περιεχόμενο
		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[] split (String regex)Διαχωρίστε όλες τις χορδές
Διαχωρισμός συμβολοσειράς[] (Regex συμβολοσειράς, όριο int)Διαχωρίστε τη συμβολοσειρά σε ομάδες ορίων στην καθορισμένη μορφή
 		//字符串拆分
        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 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. Αφαιρέστε τα προπορευόμενα και τα πίσω κενά από τις χορδές

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

10. Τροποποίηση χορδής

Η κλάση String δεν μπορεί να τροποποιηθεί Όλες οι τροποποιήσεις θα δημιουργήσουν νέα αντικείμενα, κάτι που δεν είναι αποτελεσματικό.
Εισαγάγετε την περιγραφή της εικόνας εδώ
Αυτό είναι μόνο 10000, το οποίο είναι 341ms Εάν θέλετε να το τροποποιήσετε, συνιστάται να χρησιμοποιήσετε το StringBuffer ή το StringBuilder.

3. StringBuffer και StringBuilder

Λόγω της αμετάβλητης φύσης του String, προκειμένου να διευκολυνθεί η τροποποίηση των συμβολοσειρών, η Java παρέχει επίσης κλάσεις StringBuilder και StringBuffer. Και οι περισσότερες από τις μεθόδους αυτών των δύο τάξεων είναι ίδιες.
Εάν ενδιαφέρεστε, κάντε κλικΗλεκτρονική τεκμηρίωση

Εισαγάγετε την περιγραφή της εικόνας εδώ

1 ms μετά τη χρήση του StringBuffer.
Εισαγάγετε την περιγραφή της εικόνας εδώ
Σημείωση: Οι κλάσεις String και StringBuilder δεν μπορούν να μετατραπούν απευθείας. Εάν θέλετε να μετατρέψετε ο ένας τον άλλον, μπορείτε να υιοθετήσετε τις ακόλουθες αρχές:

  • Η συμβολοσειρά γίνεται StringBuilder: Χρησιμοποιήστε τη μέθοδο κατασκευής ή append() του StringBuilder
  • Το StringBuilder γίνεται String: μέθοδος κλήσης toString().

Η διαφορά μεταξύ String, StringBuffer και StringBuilder

  • Τα περιεχόμενα του String δεν μπορούν να τροποποιηθούν, αλλά τα περιεχόμενα του StringBuffer και του StringBuilder μπορούν να τροποποιηθούν.
  • Το StringBuffer χρησιμοποιεί σύγχρονη επεξεργασία και είναι μια λειτουργία ασφαλής για νήματα.
    κάνω

Η λεγόμενη ασφάλεια κλωστών είναι όπως όταν πολλά άτομα πηγαίνουν στην τουαλέτα Αυτή τη στιγμή, μπαίνεις μέσα, κλείνεις την πόρτα και βγαίνεις έξω. Κατά τη διάρκεια αυτής της περιόδου, έχετε αυτό το δωμάτιο για τον εαυτό σας και κανείς δεν μπορεί να μπει. Ολοκληρώστε πρώτα την τρέχουσα εργασία, μονοπωλήστε τους πόρους και, στη συνέχεια, απελευθερώστε τους κατειλημμένους πόρους μετά την ολοκλήρωση.