>  기사  >  Java  >  Java 데이터 구조 문자열을 빠르게 시작하기

Java 데이터 구조 문자열을 빠르게 시작하기

WBOY
WBOY앞으로
2022-05-16 12:03:362042검색

이 기사에서는 문자열과 관련된 문제를 주로 소개하는 java 관련 지식을 제공합니다. 문자열은 0개 이상의 문자로 구성된 제한된 시퀀스이며, 함께 살펴보겠습니다. 그것은 모두에게 도움이 됩니다.

Java 데이터 구조 문자열을 빠르게 시작하기

추천 학습: "java 비디오 튜토리얼"

1. 문자열의 기본 지식

문자열은 0개 이상의 문자로 구성된 제한된 시퀀스이며 문자열이라고도 합니다.

이 기본 개념에서 알 수 있습니다.

  • 0개 이상의 문자: 문자열의 내부 요소 유형이 문자임을 의미합니다.
  • 제한됨: 문자열의 내용 길이가 최대 범위 미만으로 제한되어 있지만 이 범위 내에서는 실제 길이가 불확실함을 의미합니다.
  • 순서: 문자열에서 인접한 문자가 선행자와 후행 관계를 가지고 있음을 나타냅니다.

Java에는 내장된 문자열 유형이 없으며 큰따옴표로 묶인 모든 문자열은 Java의 String 클래스의 인스턴스입니다.

즉, String은 Java의 데이터 유형이 아닙니다. Java의 모든 문자열은 String의 인스턴스화된 객체입니다.

Java의 문자열

Java의 String 클래스는 문자열을 나타내며 Java 프로그램의 모든 문자열 리터럴(예: "abc")은 이 클래스의 인스턴스입니다.

즉, Java 프로그램에서 큰따옴표로 묶인 모든 문자열은 String 클래스의 개체입니다. String 클래스는 java.lang 패키지 아래에 있으므로 사용 시 패키지를 import할 필요가 없습니다!

Java에서 String의 가장 중요한 기능은 다음과 같습니다.

String 클래스는 변경할 수 없으므로 String 객체를 생성하면 해당 값을 변경할 수 없습니다. 우리는 이 속성을 문자열의 불변성이라고 부릅니다.

문자열의 불변성

불변성: 문자열에 값을 다시 할당하면 메모리에서 이전 값이 사라지지 않고 새 값을 저장할 공간이 새로 열립니다.

즉, String 개체가 메모리에 생성되면 변경할 수 없습니다. String 클래스의 모든 메서드는 String 개체 자체를 변경하지 않고 새 String 개체를 다시 생성합니다. 所有的String类中方法并不是改变String对象自己,而是重新创建一个新的String对象

例如:

String s="dcm";String s="ddccmm"

当s的值发生改变之后,ddccmm这个值并没有覆盖dcm,只是重新开发了一个新的空间去储存ddccmm然后将s指向它。

如果我们在实际开发中对很含有大量字符的字符串进行遍历赋值修改,会对内存中产生很多无法释放的字符串对象,造成内存垃圾。

正因为String对象的不可变性,如果需要对字符串进行大量的修改、添加字符、删除字符等操作尽量不要使用String对象,因为这样会频繁的创建新的对象导致程序的执行效率下降。

这时我们可以使用Java中另外一个字符串类StringBuilder。

我们在做题的时候关于字符串一般用的都是String类,但是考虑到我们有时候也会用到StringBuilder类这里我就对StringBuilder类进行稍微细致一点的讲解。

2.StringBuilder类

StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指StringBuilder对象中的内容是可变的。

2.1 StringBuilder类常用的方法
Java 데이터 구조 문자열을 빠르게 시작하기
可以看出来,构建一个StringBuilder的对象只能使用它的构造方法来构造,不像String一样可以直接String s= "123"来创建

因为StringBuilder类对象是可变的,所以当我们对一个字符串需要进行改变比较多的时候一般定义为StringBuilder类。

2.2 String和StringBuilder的区别

String 对象是不可改变的。每次使用String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。

StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值,当修改 StringBuilder 时,在达到容量之前,它不会为其自己重新分配空间。当达到容量时,将自动分配新的空间且容量翻倍。也就是说当对字符串进行改变时,都是对当前对象的状态进行更新的。

可以使用重载的构造函数之一来指定 StringBuilder

예:

public class String{
    public static void main(String[] args){
        String s = "baibai";
        StringBuilder s1 = new StringBuilder(s);
        System.out.println(s1);
    }}
s 값이 변경되면 ddccmm 값은 dcm을 포함하지 않고 ddccmm을 저장할 새 공간을 개발하고 s를 가리킵니다. 실제 개발에서 많은 문자가 포함된 문자열을 순회하고 할당하고 수정하면 해제할 수 없는 문자열 개체가 메모리에 많이 생성되어 메모리 가비지가 발생하게 됩니다.

String 개체의 불변성으로 인해 문자열을 많이 수정하고, 문자를 추가하고, 삭제하는 등의 작업이 필요한 경우 String 개체를 사용하지 마세요. 이렇게 하면 새 개체가 자주 생성되고 오류가 발생하기 때문입니다. 프로그램의 실행 효율성을 감소시킵니다.

이때 Java의 또 다른 문자열 클래스인 StringBuilder를 사용할 수 있습니다.

질문을 할 때 일반적으로 문자열은 String 클래스를 사용하는데 가끔 StringBuilder 클래스를 사용한다는 점을 고려하여 StringBuilder 클래스에 대해 좀 더 자세히 설명하겠습니다.

2. StringBuilder 클래스

StringBuilder

variable문자열 클래스입니다. 여기서 변수는 StringBuilder 객체는 변경 가능합니다.

2.1 StringBuilder 클래스에서 일반적으로 사용되는 메서드

 여기에 그림 설명 삽입

StringBuilder의 개체 구성은 직접 String과 달리 해당 구성 방법을 통해서만 구성될 수 있음을 알 수 있습니다. > String s= "123" StringBuilder 클래스 객체는 가변적이기 때문에 문자열에 많은 변경을 가해야 할 경우 일반적으로 로 정의합니다. > StringBuilder 클래스.


2.2 String과 StringBuilderJava 데이터 구조 문자열을 빠르게 시작하기

String 개체의 차이점은 변경할 수 없습니다. String 클래스의 메서드 중 하나를 사용할 때마다 메모리에 새 문자열 개체가 생성되므로 새 개체에 대해 새 공간을 할당해야 합니다.

StringBuilder 개체는 캡슐화하는 문자열의 문자 수를 확장할 수 있는 동적 개체이지만 를 수정할 때 저장할 수 있는 최대 문자 수에 대한 값을 지정할 수 있습니다. StringBuilder는 용량에 도달할 때까지 자체적으로 공간을 재할당하지 않습니다. 용량에 도달하면 새 공간이 자동으로 할당되고 용량이 두 배로 늘어납니다. 즉, 문자열이 변경되면 현재 개체의 상태가 업데이트됩니다. <p></p> <code>StringBuilder 클래스의 용량은 오버로드된 생성자 중 하나를 사용하여 지정할 수 있습니다.

2.3 String 클래스와 StringBuilder 클래스 간 변환

String 클래스를 StringBuilder 클래스로 변환

public class String {
    public static void main(String[] args){
        StringBuilder s1 = new StringBuilder();
        //连续连接
        s1.append("abc").append("efg");
        String s = s1.toString();
        System.out.println(s);
    }}
StringBuilder 클래스를 String 클래스로 변환

//方法一:直接创建
String s1= "大聪明 超牛的";
//方法二:对象创建
String s2 = new String("大聪明 超牛的"); 
String s3 = new String();//也可以创建一个空串
3 String 객체의 String 클래스 초기화

🎜 두 가지 방법: 🎜🎜
String s1 = "大聪明 超牛的";              // String 直接创建
String s2 = "大聪明 超牛的";              // String 直接创建
String s3 = s1;                    // 相同引用
String s4 = new String("大聪明 超牛的");   // String 对象创建
String s5 = new String("大聪明 超牛的");   // String 对象创建
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));
System.out.println(System.identityHashCode(s4));
System.out.println(System.identityHashCode(s5));
🎜두 가지 방법은 같아 보이지만 본질적으로 다릅니다. 🎜 String으로 생성된 문자열은 공용 풀에 저장되고, new로 생성된 문자열 개체는 힙에 저장됩니다. 공용 풀(상수 풀)에 저장하는 것과 힙에 저장하는 것에는 차이가 있나요? 🎜🎜🎜예를 들어보겠습니다: 🎜🎜
String.valueOf(boolean b) 
//将 boolean 变量 b 转换成字符串 
String.valueOf(char c) 
//将 char 变量 c 转换成字符串 
String.valueOf(char[] data)
//将 char 数组 data 转换成字符串 
String.valueOf(char[] data, int offset, int count)
//将char数组data中由data[offset]开始取 count个元素转换成字符串 
String.valueOf(double d)
//将 double 变量 d 转换成字符串 
String.valueOf(float f)
//将 float 变量 f 转换成字符串 
String.valueOf(int i)
//将 int 变量 i 转换成字符串 
String.valueOf(long l)
//将 long 变量 l 转换成字符串 
String.valueOf(Object obj)
//将 obj 对象转换成 字符串, 等于 obj.toString()
🎜출력: 🎜🎜🎜 처음 세 문자열의 주소는 동일하고 마지막 두 문자열은 다르다는 것을 알 수 있습니다! 🎜🎜문자열을 직접 생성할 때 공용 풀에 그런 문자열이 있는지 먼저 확인하고, 있다면 새로운 공간을 개발하지 않고 직접 참조를 가리키기 때문입니다. 여기서 s1, s2 및 s3의 세 참조는 공용 풀의 동일한 메모리를 가리킵니다. 🎜🎜객체가 생성되면 매번 문자열을 저장하기 위해 힙에 새로운 공간이 열립니다. 즉, s4와 s5는 힙에서 서로 다른 두 메모리를 가리키지만 두 메모리는 동일한 것을 저장합니다. 🎜🎜4. 일반적으로 사용되는 String 클래스의 API🎜🎜우리는 질문을 할 때 문자열 관련 질문을 접할 때 많은 변경 사항을 제외하고는 거의 항상 문제를 해결하기 위해 String 클래스를 사용한다는 점을 다시 강조하고 싶습니다. 당분간은 StringBuilder 클래스를 사용하겠습니다. 🎜🎜여기서 임시적인 점은 일반적으로 문자열 변경과 같은 작업 후에 문자열을 String 클래스로 변환해야 한다는 것입니다. 🎜🎜그래서 우리가 배워야 할 API는 주로 String API입니다. StringBuilder의 API에 대응하여 위에서 언급한 두 가지만 익히면 됩니다. 🎜🎜🎜String 클래스는 java.lang 패키지 아래에 있으므로 사용시 패키지를 import할 필요가 없습니다! 🎜🎜🎜4.1 기본 데이터 유형을 문자열로 변환하는 세 가지 방법이 있습니다 🎜🎜: 🎜

(1)基本类型数据的值+“” (最常用,最简单);
(2)使用包装类中的静态方法 static String toString(int i)返回一个表示指定整数的String 对象。如:在Integer中:Integer.toString(6)
(3)使用String类中的静态方法 static String valueOf(int i) 返回int 参数的字符串表示形式。如:String.valueOf(6)

String 类别中已经提供了将基本数据型态转换成String 的 static 方法也就是 String.valueOf() 这个参数多载的方法 :

String.valueOf(boolean b) 
//将 boolean 变量 b 转换成字符串 
String.valueOf(char c) 
//将 char 变量 c 转换成字符串 
String.valueOf(char[] data)
//将 char 数组 data 转换成字符串 
String.valueOf(char[] data, int offset, int count)
//将char数组data中由data[offset]开始取 count个元素转换成字符串 
String.valueOf(double d)
//将 double 变量 d 转换成字符串 
String.valueOf(float f)
//将 float 变量 f 转换成字符串 
String.valueOf(int i)
//将 int 变量 i 转换成字符串 
String.valueOf(long l)
//将 long 变量 l 转换成字符串 
String.valueOf(Object obj)
//将 obj 对象转换成 字符串, 等于 obj.toString()

因为是静态方法所以不需要实例化。

4.2 字符串转换为基本数据类型

一般使用包装类的静态方法parseXX("字符串")

要将 String 转换成基本数据类型大多需要使用基本数据型态的包装类别,如:String 转换成 byte可以使用 Byte.parseByte(String s)

Byte.parseByte(String s)
//将 s 转换成 byte 
Byte.parseByte(String s, int radix)
//以 radix 为基底 将 s 转换为 byte
Double.parseDouble(String s)
//将 s 转换成 double 
Float.parseFloat(String s)
//将 s 转换成 float  
Integer.parseInt(String s)
//将 s 转换成 int 
Long.parseLong(String s)
//将 s 转换成 long

注意这里也是静态方法,只不过都是对应包装类的静态方法

4.3 使用length()得到一个字符串的字符个数

int len = String.length();

4.4 使用toCharArray() 将一个字符串转换成字符数组

Char[] arr = String.toCharArray();

4.5 判断两个字符串的内容是否相等返回true/false

String1.equals(String2);//区分大小写
String1.equalsIgnoreCase(String2);//不区分大小写

4.6 与位置相关的字符串

charAt(int)//得到指定下标位置对应的字符
indexOf(String)//得到指定内容第一次出现的下标
lastIndexOf(String)//得到指定内容最后一次出现的下标

4.7 将一个字符串按照指定内容劈开split(String) ,返回字符串数组。

String s = "wa,dcm,nb!";
String[] str = s.split(",");//返回结果中str[1]=dcm

4.8 contains(String) 判断一个字符串里面是否包含指定的内容,返回true/false

Boolean a = String1.contains(String2)

4.9 使用substring()截取字符串,返回子串

String.substring(int)//从指定下标开始一直截取到字符串的最后
String.substring(int,int)//从下标x截取到下标y-1对应的元素

4.10 字符串大小写转换

String.toUpperCase()
//将一个字符串全部转换成大写
String.toLowerCase()//将一个字符串全部转换成小写

4.11 使用replace()进行字符串内容替换

String.replace(String,String)
//将某个内容全部替换成指定内容
String.replaceAll(String,String)
//将某个内容全部替换成指定内容,支持正则
String.repalceFirst(String,String)
//将第一次出现的某个内容替换成指定的内容

5.字符串进阶练习

387. 字符串中的第一个唯一字符
Java 데이터 구조 문자열을 빠르게 시작하기
题解:

把字符串的单个字符转化为对应数组下标,遍历一遍字符串获得26个字母分别出现几次。然后在遍历一遍字符串看哪个字符先出现次数为1,就输出对应下标。

class Solution {        
    public int firstUniqChar(String s) {
        int len = s.length();
        int[] vis = new int[26];
        int temp = -1;
        for(int i = 0; i <p>或者我们也可以把字符串先转换为字符数组来解题,原理都是一样的!</p><pre class="brush:php;toolbar:false">class Solution {
    public int firstUniqChar(String s) {
        int[] arr = new int[26];
        char[] chars = s.toCharArray();
        for (int i = 0; i <p>推荐学习:《<a href="https://www.php.cn/course/list/36.html" target="_blank">java视频教程</a>》</p>

위 내용은 Java 데이터 구조 문자열을 빠르게 시작하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제