기술나눔

자바 - 문자열 클래스

2024-07-12

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

1. String 클래스란 무엇입니까?

C 언어를 배우면서 문자열을 접한 적이 있을 것 같은데, C 언어에서는 문자열만 사용할 수 있습니다.
문자 배열 char[10] str = “hello”; 또는 문자 포인터 char *str = “hello”;전용 String 클래스가 제공되지 않습니다. . 객체 지향 Java에서는 String 클래스와 해당 작업이 특별히 제공되므로 프로그래머가 사용하기가 더 편리합니다.

문자열 불변성

문자열의 내용은 변경할 수 없습니다.
여기에 이미지 설명을 삽입하세요.

  • String 클래스의 문자는 실제로 value라는 문자 배열을 유지합니다.
  • String 클래스는 final에 의해 수정됩니다. 이는 final을 상속할 수 없음을 의미합니다.
  • Final은 값을 수정합니다. 즉, 값은 다른 배열을 참조할 수 없지만 배열의 내용은 여전히 ​​변경할 수 있습니다.

문자열에서 문자열 내용 수정 가능성과 관련된 모든 작업은 새 객체를 생성하며 변경되는 것은 새 객체입니다.
예를 들어 하위 문자열을 검색하는 경우:
여기에 이미지 설명을 삽입하세요.
어떤 사람들은 다음과 같이 말합니다. 문자열 안에 문자를 저장하는 배열이 final에 의해 수정되어 변경할 수 없기 때문에 문자열은 불변입니다.

  • 이 진술은 올바르지 않습니다. 첫째, 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 = "첫 번째";
JVM(Java Virtual Machine)은 먼저 문자열 상수 풀에 "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)-1을 반환하지 않고 ch가 처음 나타나는 위치를 반환합니다.
int indexOf(int ch, intfromIndex)fromIndex 위치부터 시작하여 ch가 처음 나타나는 위치를 찾고, -1을 반환합니다.
int indexOf(문자열 str)-1을 반환하지 않고 str이 처음 나타나는 위치를 반환합니다.
int indexOf(문자열 str, intfromIndex)-1을 반환하지 않고 fromIndex 위치부터 시작하여 str의 첫 번째 발생을 찾습니다.
int lastIndexOf(int ch)뒤에서 앞으로 검색하여 ch가 처음 나온 위치로 돌아가고, 그렇지 않으면 -1을 반환합니다.
int lastIndexOf(int ch, intfromIndex)fromIndex 위치부터 검색을 시작하고 ch가 처음 나타나는 위치를 뒤에서 앞으로 검색하면 -1이 반환되지 않습니다.
int lastIndexOf(문자열 str)뒤에서 앞으로 검색하여 str이 처음 나타나는 위치를 반환합니다. -1은 반환되지 않습니다.
int lastIndexOf(문자열 str, intfromIndex)fromIndex 위치부터 검색을 시작하고, str이 처음 나타나는 위치를 뒤에서 앞으로 검색합니다. No -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, 즉 341ms에 불과합니다. 수정하려면 StringBuffer 또는 StringBuilder를 사용하는 것이 좋습니다.

3. 스트링버퍼와 스트링빌더

문자열의 변경이 불가능한 특성으로 인해 문자열 수정을 용이하게 하기 위해 Java는 StringBuilder 및 StringBuffer 클래스도 제공합니다. 그리고 이 두 클래스의 메소드는 대부분 동일합니다.
관심있으시면 클릭해주세요온라인 문서

여기에 이미지 설명을 삽입하세요.

StringBuffer 사용 후 1ms.
여기에 이미지 설명을 삽입하세요.
참고: String 및 StringBuilder 클래스는 직접 변환할 수 없습니다. 서로 변환하려면 다음 원칙을 사용할 수 있습니다.

  • 문자열이 StringBuilder가 됨: StringBuilder의 생성자 또는 추가() 메서드를 사용합니다.
  • StringBuilder가 String이 됨: toString() 메서드 호출

스트링, 스트링버퍼, 스트링빌더의 차이점

  • String의 내용은 수정할 수 없지만 StringBuffer 및 StringBuilder의 내용은 수정할 수 있습니다.
  • StringBuffer는 동기 처리를 사용하며 스레드로부터 안전한 작업입니다. StringBuilder는 동기 처리를 사용하지 않으며 스레드로부터 안전하지 않은 작업입니다.
    하다

소위 스레드 안전은 여러 사람이 화장실에 갈 때와 같습니다. 이때 먼저 들어가서 문을 닫고 끝나면 나옵니다. 이 기간 동안에는 이 방을 단독으로 사용하게 되며 누구도 들어갈 수 없습니다. 현재 작업을 먼저 완료하고, 자원을 독점하고, 완료 후 점유된 자원을 해제합니다.