Partage de technologie

Java - Classe de chaînes

2024-07-12

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

1. Qu'est-ce que la classe String ?

Je pense que vous êtes entrés en contact avec des chaînes lorsque vous appreniez le langage C, mais en langage C, vous ne pouvez utiliser que
Tableau de caractères char[10] str = « bonjour » ; ou pointeur de caractère char *str = « bonjour » mais ;Aucune classe String dédiée n'est fournie . En Java orienté objet, la classe String et ses opérations sont spécialement fournies, ce qui est plus pratique à utiliser pour nos programmeurs.

Immuabilité des chaînes

Le contenu de la chaîne ne peut pas être modifié.
Insérer la description de l'image ici

  • Les caractères de la classe String conservent en fait un tableau de caractères appelé valeur.
  • La classe String est modifiée par final, ce qui signifie que final ne peut pas être hérité.
  • Final modifie la valeur, ce qui signifie que la valeur ne peut pas faire référence à d'autres tableaux, mais le contenu du tableau peut toujours être modifié !

Dans String, toutes les opérations impliquant la possibilité de modifier le contenu de la chaîne créent un nouvel objet, et ce qui est modifié est le nouvel objet.
Par exemple, lors de la recherche de sous-chaînes :
Insérer la description de l'image ici
Certaines personnes disent : Les chaînes sont immuables car le tableau qui contient les caractères est modifié par final et ne peut donc pas être modifié.

  • Cette affirmation est incorrecte Premièrement, la modification finale de String indique que la classe String est la classe finale et ne peut pas être modifiée ou héritée. Le type de référence modifié final indique que la variable de référence ne peut pas faire référence à d'autres objets, mais que le contenu de l'objet référencé peut toujours être modifié.
  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. Utilisation de base de la classe String

1 construction de cordes

String est un type de données de référence et ne stocke pas la chaîne elle-même.

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

Insérer la description de l'image ici

Avis:
Chaîne s1 = « premier » ;
La machine virtuelle Java (JVM) vérifiera d'abord si la chaîne « first » existe déjà dans le pool de constantes de chaîne. Si elle existe, la référence de la chaîne dans le pool de constantes est directement renvoyée ; si elle n'existe pas, la chaîne est ajoutée au pool de constantes et sa référence dans le pool de constantes est renvoyée.

2 Comparaison des objets String

  1. == Compare s'il s'agit de la même référence
     //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() utilise et pour déterminer si deux chaînes sont égales, renvoie vrai si égal, sinon faux
      
        //因为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

Insérer la description de l'image ici
3. compareTo() compare par ordre lexicographique, la valeur de retour est un entier

        /*
        * 比较的方式有一下两种:
        * 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() Identique à la méthode compareTo, mais ignore la casse

        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. Recherche de chaîne

méthodeFonction
char charAt(int index)Renvoie le caractère à la position d'index. Si l'index est négatif ou hors limites, une exception IndexOutOfBoundsException est levée.
int indexOf(int ch)Renvoie la position où ch apparaît pour la première fois, sans renvoyer -1
int indexOf(int ch, intfromIndex)Commencez à partir de la position fromIndex pour trouver la position où ch apparaît pour la première fois et renvoyez -1
int indexOf(Chaîne str)Renvoie la position où str apparaît pour la première fois, sans renvoyer -1
int indexOf(Chaîne str, intfromIndex)Rechercher la première occurrence de str à partir de la position fromIndex, sans renvoyer -1
int dernierIndexOf(int ch)Rechercher de l'arrière vers l'avant, revenir à la position où ch apparaît en premier, sinon retourner -1
int dernierIndexDe(int ch, intfromIndex)Commencez la recherche à partir de la position fromIndex et recherchez de l'arrière vers l'avant la position où ch apparaît en premier -1 n'est pas renvoyé.
int lastIndexOf(Chaîne str)Recherchez de l'arrière vers l'avant et renvoyez la position où str apparaît en premier -1 n'est pas renvoyé.
int lastIndexOf(Chaîne str, intfromIndex)Commencez la recherche à partir de la position fromIndex et recherchez de l'arrière vers l'avant la position où str apparaît pour la première fois, le numéro -1 est renvoyé.

 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.Conversion

1. Conversion de nombres et de chaînes

		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. Conversion de cas

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

3. Chaîne en tableau de caractères et tableau de caractères en chaîne

 		//字符串转字符数组
        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.Formatage

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

5. Remplacement des chaînes

méthodeFonction
Chaîne replaceAll (chaîne regex, remplacement de chaîne)Remplacer tout le contenu spécifié
Chaîne replaceFirst (chaîne regex, remplacement de chaîne)Remplacer le premier contenu
		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. Fractionnement des chaînes

méthodeFonction
Chaîne[] split(chaîne regex)Diviser toutes les chaînes
String[] split(Chaîne regex, int limit)Diviser la chaîne en groupes de limites au format spécifié
 		//字符串拆分
        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. Interception de chaînes

	 //字符串截取
        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. Supprimez les espaces de début et de fin des chaînes

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

10. Modification de chaîne

La classe String ne peut pas être modifiée. Toutes les modifications créeront de nouveaux objets, ce qui n'est pas efficace.
Insérer la description de l'image ici
Ce n'est que 10 000, soit 341 ms. Si vous souhaitez le modifier, il est recommandé d'utiliser StringBuffer ou StringBuilder.

3. StringBuffer et StringBuilder

En raison de la nature immuable de String, afin de faciliter la modification des chaînes, Java fournit également les classes StringBuilder et StringBuffer. Et la plupart des méthodes de ces deux classes sont les mêmes.
Si vous êtes intéressé, veuillez cliquerDocumentation en ligne

Insérer la description de l'image ici

1 ms après avoir utilisé StringBuffer.
Insérer la description de l'image ici
Remarque : Les classes String et StringBuilder ne peuvent pas être converties directement. Si vous souhaitez vous convertir, vous pouvez adopter les principes suivants :

  • String devient StringBuilder : utilisez la méthode constructeur ou append() de StringBuilder
  • StringBuilder devient String : appelez la méthode toString()

La différence entre String, StringBuffer et StringBuilder

  • Le contenu de String ne peut pas être modifié, mais le contenu de StringBuffer et StringBuilder peut être modifié.
  • StringBuffer utilise un traitement synchrone et est une opération thread-safe ; StringBuilder n'utilise pas de traitement synchrone et est une opération thread-safe.
    faire

La soi-disant sécurité du fil, c'est comme lorsque plusieurs personnes vont aux toilettes. Il n'y a qu'une seule pièce à ce moment-là. Vous entrez en premier, fermez la porte et sortez après avoir terminé. Durant cette période, vous disposez de cette pièce pour vous seul et personne ne peut y entrer. Terminez d'abord la tâche en cours, monopolisez les ressources, puis libérez les ressources occupées une fois terminée.