Обмен технологиями

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, что означает, что класс Final не может быть унаследован.
  • 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 струнная конструкция

String является ссылочным типом данных и не хранит саму строку.

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) сначала проверит, существует ли строка «first» уже в пуле строковых констант. Если она существует, ссылка на строку в пуле констант возвращается напрямую; если она не существует, строка добавляется в пул констант и возвращается ее ссылка в пуле констант.

2 Сравнение объектов String

  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(целый индекс)Возвращает символ в позиции индекса. Если индекс отрицательный или выходит за пределы, создается исключение IndexOutOfBoundsException.
int indexOf(int ch)Возвращает позицию, где впервые появляется ch, не возвращая -1.
int indexOf(int ch, intfromIndex)Начните с позиции fromIndex, чтобы найти позицию, где впервые появляется ch, и верните -1.
int indexOf(Строка str)Возвращает позицию, где впервые появляется строка, не возвращая -1
int indexOf(Строка str, intfromIndex)Найдите первое вхождение str, начиная с позиции fromIndex, не возвращая -1.
int lastIndexOf(int ch)Поиск сзади вперед, вернитесь к позиции, где впервые появляется ch, если нет, верните -1
int lastIndexOf(int ch, intfromIndex)Начните поиск с позиции fromIndex и выполните поиск сзади вперед, чтобы найти позицию, в которой ch -1 не возвращается.
int lastIndexOf(Строка str)Выполните поиск сзади вперед и верните позицию, в которой строка появляется впервые. -1 не возвращается.
int lastIndexOf(Строка str, intfromIndex)Начните поиск с позиции fromIndex и найдите позицию, в которой строка впервые появляется, начиная с номера -1.

 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. Замена струны

методФункция
String replaceAll(регулярное выражение строки, замена строки)Заменить весь указанный контент
String replaceFirst(регулярное выражение строки, замена строки)Заменить первый контент
		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[] split(регулярное выражение строки, ограничение 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, что составляет 341 мс. Если вы хотите изменить его, рекомендуется использовать StringBuffer или StringBuilder.

3. StringBuffer и StringBuilder

Из-за неизменяемой природы String, чтобы облегчить модификацию строк, Java также предоставляет классы StringBuilder и StringBuffer. И большинство методов этих двух классов одинаковы.
Если вы заинтересованы, пожалуйста, нажмитеОнлайн-документация

Вставьте сюда описание изображения

1 мс после использования StringBuffer.
Вставьте сюда описание изображения
Примечание. Классы String и StringBuilder нельзя преобразовать напрямую. Если вы хотите обратить друг друга, вы можете принять следующие принципы:

  • Строка становится StringBuilder: используйте конструктор или метод Append() StringBuilder.
  • StringBuilder становится String: вызов метода toString()

Разница между String, StringBuffer и StringBuilder

  • Содержимое String нельзя изменить, но можно изменить содержимое StringBuffer и StringBuilder.
  • StringBuffer использует синхронную обработку и является потокобезопасной операцией; StringBuilder не использует синхронную обработку и является потокобезопасной операцией.
    делать

Так называемая потокобезопасность аналогична ситуации, когда несколько человек идут в туалет. В это время есть только одна комната. Вы сначала заходите, закрываете дверь и выходите после того, как закончили. В течение этого периода эта комната принадлежит только вам, и никто не может войти. Сначала завершите текущую задачу, монополизируйте ресурсы, а затем после завершения освободите занятые ресурсы.