最整洁的常用字符串String基础知识

本文深入介绍了 Java 中 String 类的基础知识,包括字符串的特点、构造方法、字符串常量池的概念及字符串内容的比较方法。此外,还详细阐述了 String 类中常用的获取、截取、转换和分割字符串的方法。

类 String 基础知识

一、类 String 简单介绍

  类 Stringjava.lang包下的类,所以不需要导包就可以直接使用。String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

  字符串是常量;它们的值在创建之后不能更改。StringBuffer(字符串缓冲区)支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

  • 记住字符串的三个特点

    1. 字符串的内容永不可变

    2. 正是因为字符串不可改变,所以字符串是可以共享使用的。

    3. 字符串效果上相当于是 char[] 字符数组,但是底层原理是 byte[] 字节数组。

String 是类是一个对象,不是 java 的三类8种基本数据类型。

  • 基本数据类型

    1. 字符型:char

    2. 布尔型:boolean

    3. 数值型:byte、short、int、long、float、double

二、类 String 构造方法

  字符串的构造方法有很多,常见的是一种直接创建的方法和几种构造方法。其中 StringBuffer StringBuilder会在其他文中单独讨论。

  • 直接创建 String str = "Hello"; 右边直接用双引号

  • 常见构造方法

    1. String() :构造一个空。
    2. String(byte[] bytes) :用 byte 数组来构造字符串。
    3. String(char[] value):用 char 数组来构造字符串。
    4. String(String original) :用已存在的字符串来构造新的字符串。
    5. String(StringBuffer buffer) :用字符串缓冲区中的内容来构造新的字符串。
    6. String(StringBuilder builder) :用字符串生成器中的内容来构造新的字符串。
  • 代码示例演示

public class DemoString {
    public static void main(String[] args) {
        // 使用空参构造
        String str1 = new String();         // 小括号留空,说明字符串什么内容都没有。
        System.out.println("第1个字符串:" + str1);
        // 根据字符数组创建字符串
        char[] charArray = { 'A', 'B', 'C' };
        String str2 = new String(charArray);
        System.out.println("第2个字符串:" + str2);
        // 根据字节数组创建字符串
        byte[] byteArray = { 97, 98, 99 };
        String str3 = new String(byteArray);
        System.out.println("第3个字符串:" + str3);
        // 直接创建
        String str4 = "Hello";
        System.out.println("第4个字符串:" + str4);
    }
}
  • 代码运行结果
第1个字符串:
第2个字符串:ABC
第3个字符串:abc
第4个字符串:Hello

三、字符串常量池与 String 内容比较

3.1 字符串常量

  字符串常量池:程序当中直接写上的双引号字符串,就在字符串常量池中。在堆中存放 new 出来的内容。对于基本类型来说,==进行数值的比较。对于引用类型来说,== 是进行地址值的比较。

  • 代码示例演示
public class DemoString {

    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";

        char[] charArray = {'a', 'b', 'c'};
        String str3 = new String(charArray);

        System.out.println(str1 == str2);       // true
        System.out.println(str1 == str3);       // false
        System.out.println(str2 == str3);       // false
    }
}
  • 内存图解
创建字符串时内存图解

  跟多内存相关的知识会在其他文中详细讲解,期待~

3.2 String 的内容比较

  == 是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用下面两个方法。

  • public boolean equals(Object obj) :参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true;否则返回false。

    1.任何对象都能用Object进行接收。
    2.equals 方法具有对称性,也就是 a.equals(b) 和 b.equals(a) 效果一样。
    3.如果比较双方一个常量一个变量,推荐把常量字符串写在前面。(推荐:“abc”.equals(str) 不推荐:str.equals(“abc”))

  • public boolean equalsIgnoreCase(String str) :忽略大小写,进行内容比较。

  • 代码示例演示

public class De03_String内容比较 {

    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        char[] charArray = {'H', 'e', 'l', 'l', 'o'};
        String str3 = new String(charArray);

        System.out.println(str1.equals(str2));      // true
        System.out.println(str2.equals(str3));      // true
        System.out.println(str3.equals("Hello"));   // true
        System.out.println("Hello".equals(str1));   // true

        String str4 = "hello";
        System.out.println(str1.equals(str4));      // false

        String str5 = null;
        System.out.println("abc".equals(str5));       // 推荐:false
        System.out.println(str5.equals("abc"));       // 不推荐:报错,空指针异常NullPointerException

        String strA = "Java";
        String strB = "java";
        System.out.println(strA.equals(strB));              // false,严格区分大小写
        System.out.println(strA.equalsIgnoreCase(strB));    // true,忽略大小写

        // 注意,只有英文字母区分大小写,其他都不区分大小写
        System.out.println("abc一123".equalsIgnoreCase("abc壹123"));  // false
    }
}

四、类 String 常用方法

4.1 与获取相关的方法

  1. public int length():获取字符串当中含有的字符个数,拿到字符串长度。
  2. public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串。
  3. public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始。)
  4. public int indexOf(String str)查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1值。
  • 注意

    数组a的长度: a.length
    ArrayList集合b的长度: b.size()
    String对象c的长度: c.length()

  • 代码示例演示

class DomoString {
    public static void main(String[] args) {
      	// 获取字符串的长度
        int length = "asdasfeutrvauevbueyvb".length();
        System.out.println("字符串的长度是:" + length);
				// 拼接字符串
        String str1 = "Hello";
        String str2 = "World";
        String str3 = str1.concat(str2);	
        System.out.println(str1); // Hello,原封不动
        System.out.println(str2); // World,原封不动
        System.out.println(str3); // HelloWorld,新的字符串
        System.out.println("==============");
				// 获取指定索引位置的单个字符
        char ch = "Hello".charAt(1);	
        System.out.println("在1号索引位置的字符是:" + ch);
        System.out.println("==============");
        // 查找参数字符串在本来字符串当中出现的第一次索引位置
        // 如果根本没有,返回-1值
        String original = "HelloWorldHelloWorld";
        int index = original.indexOf("llo");
        System.out.println("第一次索引值是:" + index); // 2
        System.out.println("HelloWorld".indexOf("abc")); // -1
    }
}

4.2 与截取相关的方法

  字符串的截取方法substring 函数。

  1. public String substring(int index):截取从参数位置一直到字符串末尾,返回新字符串。
  2. public String substring(int begin, int end):截取从begin开始,一直到end结束,中间的字符串。[begin,end),包含左边,不包含右边。
  • 代码示例演示
public class DemoString {
    public static void main(String[] args) {
        String str1 = "HelloWorld";
        String str2 = str1.substring(5);
        System.out.println(str1); // HelloWorld,原封不动
        System.out.println(str2); // World,新字符串
        System.out.println("================");
        String str3 = str1.substring(4, 7);
        System.out.println(str3); // oWo
    }
}

4.3 与转换相关的方法

  String 当中与转换相关的常用方法有:

  1. public char[] toCharArray():将当前字符串拆分成为字符数组作为返回值。
  2. public byte[] getBytes():获得当前字符串底层的字节数组
  3. public String replace(CharSequence oldString, CharSequence newString):将所有出现的老字符串替换成为新的字符串,返回替换之后的结果新字符串。(备注:CharSequence 意思就是说可以接受字符串类型。)
  • 代码示例演示
public class DemoString {
    public static void main(String[] args) {
        // 转换成为字符数组
        char[] chars = "Hello".toCharArray();
        System.out.println(chars[0]); // H
        System.out.println(chars.length); // 5
        System.out.println("==============");
        // 转换成为字节数组
        byte[] bytes = "abc".getBytes();
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]);
        }
        System.out.println("==============");
        // 字符串的内容替换
        String str1 = "How do you do?";
        String str2 = str1.replace("o", "*");
        System.out.println(str1); // How do you do?
        System.out.println(str2); // H*w d* y*u d*?
        System.out.println("==============");
        // 弹幕屏蔽
        String lang1 = "会不会玩儿呀!你大爷的!你大爷的!你大爷的!!!";
        String lang2 = lang1.replace("你大爷的", "****");
        System.out.println(lang2); // 会不会玩儿呀!****!****!****!!!
    }
}

4.4 与分割相关的方法

  String 当中与分割字符串方法:

  1. public String[] split(String regex):按照参数的规则,将字符串切分成为若干部分。
  • 注意

    1.split 方法的参数其实是一个“正则表达式”。其它文中探讨正则表达式。

    2.如果按照英文句点.”进行切分,必须写"\\."(两个反斜杠)

  • 代码示例演示

public class DemoString {
    public static void main(String[] args) {
        String str1 = "aaa,bbb,ccc";
        String[] array1 = str1.split(",");
        for (int i = 0; i < array1.length; i++) {
            System.out.print(array1[i] + " ");
        }
        System.out.println();
        String str2 = "aaa bbb ccc";
        String[] array2 = str2.split(" ");
        for (int i = 0; i < array2.length; i++) {
            System.out.print(array2[i] +" ");
        }
        System.out.println();
        String str3 = "XXX.YYY.ZZZ";
        String[] array3 = str3.split("\\.");
        for (int i = 0; i < array3.length; i++) {
            System.out.print(array3[i]+" ");
        }
    }
}
  • 代码运行结果
aaa bbb ccc 
aaa bbb ccc 
XXX YYY ZZZ 
### C语言中字符串的基本概念 在C语言中,字符串是以字符数组的形式存储的一系列字符。它以空字符 `\0` 结束来表示字符串的终止位置[^1]。 ```c char str[] = "Hello, world!"; ``` 上述代码定义了一个名为 `str` 的字符数组,并初始化为 `"Hello, world!"`。注意,编译器会自动在字符串末尾添加一个空字符 `\0` 来标记字符串结束。 --- ### 字符串的基本操作 #### 1. 获取字符串长度 通过标准库函数 `strlen()` 可以获取字符串的实际长度(不包括结尾的 `\0`)。该函数位于 `<string.h>` 头文件中[^2]。 ```c #include <stdio.h> #include <string.h> int main() { char str[32]; printf("Enter a string: "); fgets(str, sizeof(str), stdin); int length = strlen(str); // 计算字符串长度 printf("Length of the string is %d\n", length - 1); // 减去可能存在的换行符 '\n' return 0; } ``` 需要注意的是,如果输入方式使用了 `fgets()` 或者其他方法引入了换行符,则计算实际长度时应考虑这一点。 --- #### 2. 字符串复制 可以通过 `strcpy()` 将一个字符串的内容复制到另一个字符串变量中。同样需要包含头文件 `<string.h>`。 ```c #include <stdio.h> #include <string.h> int main() { char src[50] = "This is source"; char dest[50]; strcpy(dest, src); // 把src中的内容复制给dest printf("Destination now contains: \"%s\"\n", dest); return 0; } ``` 此过程不会检查目标缓冲区是否有足够的空间容纳源字符串及其终止符 `\0`,因此可能导致溢出风险。 --- #### 3. 字符串连接 利用 `strcat()` 实现两个字符串的拼接功能。第一个参数为目标字符串,第二个参数为待追加的部分。 ```c #include <stdio.h> #include <string.h> int main() { char greeting[80] = "Hello "; const char name[] = "Alice"; strcat(greeting, name); // 追加name至greeting之后 printf("%s\n", greeting); return 0; } ``` 执行结果将是打印完整的问候语句:“Hello Alice”。 --- #### 4. 输入与输出 对于简单的交互场景下读取用户键入的数据,常用的方法有: - 使用 `scanf()` 配合 `%s` 格式说明符接收单个单词; - 利用更安全的方式如 `fgets()` 接收整行数据并处理其中多余的空白字符或回车符号。 下面展示如何采用后者完成多词组录入任务: ```c #include <stdio.h> #define MAX_LEN 100 int main(void){ char input[MAX_LEN]; puts("Please type something:"); if(fgets(input,sizeof(input),stdin)){ /* Remove trailing newline character */ size_t len=strlen(input); if(len>0 && input[len-1]=='\n') input[len-1]='\0'; puts("You entered:"); puts(input); } else{ perror("Error reading line"); } return 0; } ``` 这里还包含了去除潜在多余换行符逻辑以便后续进一步分析或者显示更加整洁的结果。 --- ### 总结 以上介绍了有关于C语言里字符串基础知识以及几种常见的基本操作手段。这些技能构成了程序设计过程中不可或缺的一部分,在构建复杂应用之前掌握它们至关重要。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ItDaChuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值