13. String类

1. String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。

在面试中也频繁被问到,比如:String、StringBuff和StringBulider之间的区别等。

2. 常用方法

2.1 字符串构造

字符串的三种常用定义方式

//    字符串的三种定义方式
    public static void main(String[] args) {
        String str1 = "hello";
        String str2 = new String("abcd");
        char[] chars = {'a','b','c'};
        String str3 = new String(chars);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
    }

关于这三种定义字符串的存储方式,我们可以通过debug一下,去看看,见下图内容
在这里插入图片描述

存储方式:

str1, str2

在这里插入图片描述

str3

在这里插入图片描述

2.2 求字符串长度

注意:在Java中“ ”引起来的也是String类型对象
例如现在去让我们求一下“hello”的长度

    public static void main(String[] args) {
        System.out.println("hello".length());
    }

2.2.1 .length() 与 .length 的区别

  1. . l e n g t h 是求数组的长度 \color{red}{.length是求数组的长度} .length是求数组的长度
  2. . l e n g t h ( ) 是求字符串的长度 \color{red}{.length() 是求字符串的长度} .length()是求字符串的长度
    public static void main(String[] args) {
        int[] array = {1,2,3,4};
        String str = "hello";

        System.out.println(array.length);
        System.out.println(str.length());
    }

2.3 String对象的比较

字符串的比较是常见操作之一,比如:字符串排序。Java中总共提供了4中方式:

  1. == 比较是否引用同一个对象(地址)
    在这里插入图片描述

  2. .equals() 方法比较两字符串是否一样
    equals返回的是boolean类型
    在这里插入图片描述

  3. compareTo() 方法比较
    compareTo返回的是int类型

2.3.1charAt() 方法

我们可以通过使用charAt() 方法来打印字符串

    public static void main(String[] args) {
        String str1 = "hello";
        for (int i = 0; i < str1.length(); i++) {
            System.out.print(str1.charAt(i));
        }
    }

在这里插入图片描述

2.4转化

  1. 数值和字符串转化

2.4.1 数字 --> 字符串

String.valueOf()

String s1 = String.valueOf(1234);

2.4.2 字符串 --> 数字

Integer.parseInt

int data1 = Integer.parseInt("1234")

2.4.3 字符串 --> 数组(常用)

    public static void main(String[] args) {
        String s1 = "hello";
        char[] chars = s1.toCharArray();
        for (char x:chars) {
            System.out.println(x);
        }
        System.out.println(s1);
    }

2.4.4 数组 --> 字符串(常用)

    public static void main(String[] args) {
        char[] chars = {'a','b','c'};
        String str = new String(chars);
        System.out.println(str);
    }

2.5 字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:

方法功能
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换首个内容

2.6 字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:

方法功能
String[] split(String regex)将字符串全部拆分
String[] split(String regex, int limit)将字符串以指定的格式,拆分为limit组

代码示例:

    public static void main(String[] args) {
        String str = "welcome to CSDN we are family";
        String[] s1 = str.split(" ");
        for (String x:s1) {
            System.out.println(x);
        }
    }

String[] split(String regex)

在这里插入图片描述

String[] split(String regex, int limit)

    public static void main(String[] args) {
        String str = "welcome to CSDN we are family";
        String[] s1 = str.split(" ",4);
        for (String x:s1) {
            System.out.println(x);
        }
    }

在这里插入图片描述
注意事项:

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

2.7 字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:

方法功能
String substring(int beginIndex)从指定索引截取到结尾
String substring(int beginIndex, int endIndex)截取部分内容
    public static void main(String[] args) {
        String str = "abcdef";
        String ret1 = str.substring(2);//从2位置开始截取
        String ret2 = str.substring(3,5);//[3,5)
        System.out.println(ret1);
        System.out.println(ret2);
    }

在这里插入图片描述

2.8 其他操作方法

方法功能
String trim()去掉字符串中的左右空格,保留中间空格
String toUpperCase()字符串转大写
String toLowerCase()字符串转小写

S t r i n g 类的对象,一般返回的都是新的对象 \color{red}{String类的对象,一般返回的都是新的对象} String类的对象,一般返回的都是新的对象

3. StringBuilder和StringBuffer

3.1 StringBuilder

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大
部分功能是相同的,这里介绍 StringBuilder常用的一些方法

3.1.1 拼接字符串原理

看这几行代码

    public static void main(String[] args) {
        String s = "hello";
        s += " world";
        System.out.println(s);
    }

实际他还调用的了StringBuilder

    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("hello");
        stringBuilder.append(" world");
        String str = stringBuilder.toString();
        System.out.println(str);
    }

3.1.2StringBuilder逆置字符串

    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("hello");
        System.out.println(stringBuilder.reverse());
    }

在这里插入图片描述

String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可
以修改。频繁修改字符串的情况考虑使用StringBuilder

注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:

  • String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
  • StringBuilder变为String: 调用toString()方法。

3.2 面试题:

String、StringBuffer、StringBuilder的区别??

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操

以下代码总共创建了多少个String对象【前提不考虑常量池之前是否存在】

String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象

在这里插入图片描述

String类习题练习

1. 第一次只出现一次的字符

class Solution {
    public int firstUniqChar(String s) {
        int[] count = new int[26];
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            count[ch-'a']++;
        }
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (count[ch-'a'] == 1) {
                return i;
            }
        }
        return -1;
    }
}

2. 最后一个单词的长度

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            int index = str.lastIndexOf(" ");
            String ret = str.substring(index+1);
            System.out.println(ret.length());
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            String[] strings = str.split(" ");
            System.out.println(strings[strings.length-1].length());
        }
    }

3. 验证回文串

class Solution {
    private boolean isLegalChar(char ch){
        if (ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9'){
            return true;
        }
        return false;
    }
    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        int left = 0;
        int right = s.length()-1;
        while (left<right) {
            while (left<right && !isLegalChar(s.charAt(left))){
                left++;
            }
            while (left<right && !isLegalChar(s.charAt(right))){
                right--;
            }
            if (s.charAt(left) != s.charAt(right)){
                return false;
            }else {
                left++;
                right--;
            }
        }
        return true;
    }
}

今天的分享就到此结束了!

2022年10月12日16:11:19

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱听歌的阿漓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值