Berbagi teknologi

Java - Kelas string

2024-07-12

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

1. Apa yang dimaksud dengan kelas String?

Saya pikir kalian pernah berhubungan dengan string ketika kalian belajar bahasa C, tetapi dalam bahasa C kalian hanya bisa menggunakannya
Array karakter char[10] str = “halo”; atau penunjuk karakter char *str = “halo”;Tidak ada kelas String khusus yang disediakan . Dalam Java berorientasi objek, kelas String dan operasinya disediakan secara khusus, yang lebih nyaman digunakan oleh pemrogram kami.

Kekekalan string

Isi string tidak dapat diubah.
Masukkan deskripsi gambar di sini

  • Karakter dalam kelas String sebenarnya mempertahankan array karakter yang disebut nilai.
  • Kelas String diubah menjadi final, yang berarti final tidak dapat diwarisi.
  • Final memodifikasi nilai, artinya nilai tidak dapat merujuk ke array lain, tetapi isi array masih dapat diubah!

Dalam String, semua operasi yang melibatkan kemungkinan memodifikasi konten string membuat objek baru, dan yang diubah adalah objek baru.
Misalnya, saat mencari substring:
Masukkan deskripsi gambar di sini
Beberapa orang mengatakan: String tidak dapat diubah karena array yang menyimpan karakter di dalamnya telah dimodifikasi oleh final dan oleh karena itu tidak dapat diubah.

  • Pernyataan ini tidak benar Pertama, modifikasi akhir dari String menunjukkan bahwa kelas String adalah kelas final dan tidak dapat dimodifikasi atau diwariskan. Tipe referensi terakhir yang dimodifikasi menunjukkan bahwa variabel referensi tidak dapat merujuk ke objek lain, namun konten objek yang direferensikan masih dapat dimodifikasi.
  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. Penggunaan dasar kelas String

1 Konstruksi tali

String adalah tipe data referensi dan tidak menyimpan string itu sendiri.

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

Masukkan deskripsi gambar di sini

Melihat:
String s1 = “pertama”;
Java Virtual Machine (JVM) pertama-tama akan memeriksa apakah string "pertama" sudah ada di kumpulan konstanta string. Jika ada, referensi string di kumpulan konstan dikembalikan secara langsung; jika tidak ada, string ditambahkan ke kumpulan konstan dan referensinya di kumpulan konstan dikembalikan.

2 Perbandingan objek String

  1. == Membandingkan apakah keduanya merupakan referensi yang sama
     //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. sama dengan() menggunakan dan untuk menentukan apakah dua string sama, mengembalikan nilai benar jika sama, jika tidak salah
      
        //因为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

Masukkan deskripsi gambar di sini
3. bandingkanTo() membandingkan dalam urutan leksikografis, nilai yang dikembalikan adalah 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. bandingkanToIgnoreCase() Sama seperti metode bandingkanTo, tetapi mengabaikan huruf besar-kecil

        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. Pencarian string

metodeFungsi
char charAt(int indeks)Mengembalikan karakter pada posisi indeks. Jika indeks negatif atau di luar batas, pengecualian IndexOutOfBoundsException akan ditampilkan.
int indeks(int ch)Mengembalikan posisi di mana ch pertama kali muncul, tanpa mengembalikan -1
int indexOf(int ch, intdariIndeks)Mulai dari posisi fromIndex untuk menemukan posisi di mana ch pertama kali muncul, dan kembalikan -1
int indeksOf(String str)Mengembalikan posisi di mana str pertama kali muncul, tanpa mengembalikan -1
int indexOf(String str, intdariIndeks)Temukan kemunculan pertama str mulai dari posisi fromIndex, tanpa mengembalikan -1
int indeksterakhir(int ch)Cari dari belakang ke depan, kembali ke posisi munculnya ch pertama kali, jika tidak kembali -1
int lastIndexOf(int ch, intdariIndeks)Mulailah mencari dari posisi fromIndex, dan cari dari belakang ke depan untuk posisi di mana ch -1 pertama kali muncul.
int indeksterakhir(String str)Pencarian dari belakang ke depan dan mengembalikan posisi dimana str pertama kali muncul.
int lastIndexOf(String str, intdariIndeks)Mulailah mencari dari posisi fromIndex, dan cari dari belakang ke depan untuk posisi di mana str pertama kali muncul.

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

1. Konversi angka dan string

		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. Konversi kasus

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

3. String ke array karakter dan array karakter ke 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.Memformat

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

5. Penggantian senar

metodeFungsi
String replaceAll(String regex, Penggantian string)Ganti semua konten yang ditentukan
String replaceFirst(String regex, Penggantian string)Ganti konten pertama
		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. Pemisahan senar

metodeFungsi
String[] pisah(String regex)Pisahkan semua string
String[] pisah(String regex, int batas)Pisahkan string menjadi grup batas dalam format yang ditentukan
 		//字符串拆分
        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. Intersepsi senar

	 //字符串截取
        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. Hapus spasi awal dan akhir dari string

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

10. Modifikasi senar

Kelas String tidak dapat dimodifikasi. Semua modifikasi akan membuat objek baru, yang tidak efisien.
Masukkan deskripsi gambar di sini
Ini hanya 10000, yaitu 341ms. Jika ingin memodifikasinya, disarankan menggunakan StringBuffer atau StringBuilder.

3. StringBuffer dan StringBuilder

Karena sifat String yang tidak dapat diubah, untuk memudahkan modifikasi string, Java juga menyediakan kelas StringBuilder dan StringBuffer. Dan sebagian besar metode kedua kelas ini sama.
Jika Anda tertarik, silakan klikDokumentasi daring

Masukkan deskripsi gambar di sini

1 ms setelah menggunakan StringBuffer.
Masukkan deskripsi gambar di sini
Catatan: Kelas String dan StringBuilder tidak dapat dikonversi secara langsung. Jika Anda ingin saling mengkonversi, Anda dapat menggunakan prinsip berikut:

  • String menjadi StringBuilder: Gunakan metode konstruktor atau append() dari StringBuilder
  • StringBuilder menjadi String: panggil metode toString()

Perbedaan antara String, StringBuffer dan StringBuilder

  • Isi dari String tidak dapat diubah, tetapi isi dari StringBuffer dan StringBuilder dapat diubah.
  • StringBuffer menggunakan pemrosesan sinkron dan merupakan operasi yang aman untuk thread; StringBuilder tidak menggunakan pemrosesan sinkron dan merupakan operasi yang tidak aman untuk thread.
    Mengerjakan

Yang disebut pengaman benang adalah seperti ketika banyak orang pergi ke toilet. Saat ini hanya ada satu ruangan. Anda masuk dulu, tutup pintunya, dan keluar setelah selesai. Selama periode ini, Anda memiliki ruangan ini untuk diri Anda sendiri dan tidak ada yang bisa masuk. Selesaikan tugas saat ini terlebih dahulu, monopoli sumber daya, lalu lepaskan sumber daya yang ditempati setelah selesai.