Teknologian jakaminen

Java - merkkijonoluokka

2024-07-12

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

1. Mikä on String-luokka?

Luulen, että olette joutuneet kosketuksiin merkkijonojen kanssa opiskellessanne C-kieltä, mutta C-kielessä voit käyttää vain
Merkkitaulukko char[10] str = "hei" tai merkkiosoitin char *str = "hei";Mitään omaa merkkijonoluokkaa ei tarjota . Olio-Javassa String-luokka ja sen toiminnot tarjotaan erityisesti, mikä on ohjelmoijamme helpompi käyttää.

Jousen muuttumattomuus

Merkkijonon sisältöä ei voi muuttaa.
Lisää kuvan kuvaus tähän

  • String-luokan merkit säilyttävät itse asiassa arvo-nimisen merkkijonon.
  • String-luokkaa muokkaa final, mikä tarkoittaa, että finalia ei voi periä.
  • Final muuttaa arvoa, mikä tarkoittaa, että arvo ei voi viitata muihin matriisiin, mutta taulukon sisältöä voidaan silti muuttaa!

Stringissä kaikki toiminnot, joihin liittyy mahdollisuus muuttaa merkkijonon sisältöä, luovat uuden objektin, ja se, mitä muutetaan, on uusi objekti.
Esimerkiksi kun etsit osamerkkijonoja:
Lisää kuvan kuvaus tähän
Jotkut sanovat: Merkkijonot ovat muuttumattomia, koska niiden sisällä olevaa merkkijonoa muokkaa lopullinen, eikä sitä siksi voi muuttaa.

  • Tämä väite on virheellinen Ensinnäkin Stringin viimeinen modifikaatio osoittaa, että String-luokka on viimeinen luokka, eikä sitä voida muokata tai periytyä. Lopullinen muokattu viitetyyppi ilmaisee, että viitemuuttuja ei voi viitata muihin objekteihin, mutta viitatun kohteen sisältöä voidaan silti muokata.
  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-luokan peruskäyttö

1 Kielirakenne

Merkkijono on viitetietotyyppi, eikä se tallenna itse merkkijonoa.

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

Lisää kuvan kuvaus tähän

Ilmoitus:
Merkkijono s1 = "ensimmäinen";
Java-virtuaalikone (JVM) tarkistaa ensin, onko merkkijono "ensimmäinen" jo olemassa merkkijonovakiovarannossa. Jos se on olemassa, merkkijonon viite vakiovarannossa palautetaan suoraan, jos sitä ei ole, merkkijono lisätään vakiovaraan ja sen viite palautetaan vakiovarannossa.

2 String-olioiden vertailu

  1. == Vertaa, ovatko ne samat viitetiedot
     //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() käyttää ja määrittääkseen, ovatko kaksi merkkijonoa yhtä suuret, palauttaa tosi, jos yhtä suuri, muussa tapauksessa 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

Lisää kuvan kuvaus tähän
3. vertailuTo() vertaa leksikografisessa järjestyksessä, palautusarvo on 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. vertaaIgnoreCase() Sama kuin vertailuTo-menetelmä, mutta kirjainkoko jätetään huomioimatta

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

menetelmäToiminto
char charAt(int index)Palauttaa merkin indeksipaikassa, jos indeksi on negatiivinen tai rajojen ulkopuolella, IndexOutOfBoundsException-poikkeus heitetään.
int indexOf(int ch)Palauttaa paikan, jossa ch esiintyy ensimmäisenä, palauttamatta arvoa -1
int indexOf(int ch, intfromIndex)Aloita fromIndex-paikasta löytääksesi paikan, jossa ch esiintyy ensimmäisenä, ja palauta -1
int indexOf(merkkijono str)Palauttaa paikan, jossa str esiintyy ensimmäisenä, palauttamatta arvoa -1
int indexOf(merkkijono str, intfromIndex)Etsi str:n ensimmäinen esiintymä alkaen paikasta fromIndex, palauttamatta -1:tä
int lastIndexOf(int ch)Hae takaa eteenpäin, palaa kohtaan, jossa ch ilmestyy ensimmäisenä, jos et palauta -1
int lastIndexOf(int ch, intfromIndex)Aloita haku fromIndex-paikasta ja etsi takaa eteenpäin kohtaan, jossa ch ilmestyy ensimmäisenä, ei palauteta.
int lastIndexOf(merkkijono str)Hae takaa eteenpäin ja palauta kohta, jossa str esiintyy ensimmäisenä, ei palauteta.
int lastIndexOf(String str, intfromIndex)Aloita haku fromIndex-paikasta ja etsi takaa eteenpäin kohtaan, jossa str ilmestyy ensimmäisenä.

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

1. Numeroiden ja merkkijonojen muuntaminen

		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. Tapauksen muuntaminen

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

3. Merkkijonosta merkkijonoon ja merkkijonosta merkkijonoon

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

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

5. Merkkijonojen vaihto

menetelmäToiminto
Merkkijono korvaa kaikki (merkkijonon säännöllinen lauseke, merkkijonon korvaus)Korvaa kaikki määritetty sisältö
Merkkijono korvaa ensin (merkkijonon säännöllinen lauseke, merkkijonon korvaus)Vaihda ensimmäinen sisältö
		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. Merkkijonojen halkaisu

menetelmäToiminto
Merkkijono[] jako (merkkijonon säännöllinen lauseke)Jaa kaikki merkkijonot
Merkkijono[] jako (merkkijonon säännöllinen lauseke, sisäinen raja)Jaa merkkijono rajaryhmiin määritetyssä muodossa
 		//字符串拆分
        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. Merkkijonojen sieppaus

	 //字符串截取
        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. Poista alku- ja loppuvälit merkkijonoista

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

10. Merkkijonomuunnos

String-luokkaa ei voi muokata. Kaikki muutokset luovat uusia objekteja, mikä ei ole tehokasta.
Lisää kuvan kuvaus tähän
Tämä on vain 10000, mikä on 341 ms. Jos haluat muokata sitä, on suositeltavaa käyttää StringBufferia tai StringBuilderiä.

3. StringBuffer ja StringBuilder

Stringin muuttumattoman luonteen vuoksi Java tarjoaa myös StringBuilder- ja StringBuffer-luokkia merkkijonojen muokkaamisen helpottamiseksi. Ja useimmat näiden kahden luokan menetelmistä ovat samat.
Jos olet kiinnostunut, napsautaVerkkodokumentaatio

Lisää kuvan kuvaus tähän

1 ms StringBufferin käytön jälkeen.
Lisää kuvan kuvaus tähän
Huomautus: String- ja StringBuilder-luokkia ei voi muuntaa suoraan. Jos haluat muuntaa toisensa, voit käyttää seuraavia periaatteita:

  • Merkkijonosta tulee StringBuilder: Käytä StringBuilderin konstruktoria tai append()-menetelmää
  • StringBuilder muuttuu String: kutsu toString()-menetelmäksi

Ero Stringin, StringBufferin ja StringBuilderin välillä

  • Stringin sisältöä ei voi muokata, mutta StringBufferin ja StringBuilderin sisältöä voidaan muokata.
  • StringBuffer käyttää synkronista prosessointia ja on säikeille turvallinen toiminta.
    tehdä

Niin sanottu lankaturva on kuin silloin, kun useat ihmiset menevät wc:hen. Tällä hetkellä on vain yksi huone. Menet ensin sisään, suljet oven ja tulet ulos. Tänä aikana sinulla on tämä huone itsellesi, eikä kukaan pääse sisään. Suorita ensin nykyinen tehtävä, monopolisoi resurssit ja vapauta sitten varatut resurssit valmistumisen jälkeen.