【JavaSE】搞定String类

前言

本篇会细致讲解String类的常见用法,让小伙伴们搞定String类~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

常用的三种字符串构造

字符串长度length

字符串比较

==比较

比较字符串的内容equals

忽略大小写比较equalsIgnoreCase

比较字符串大小compareTo

忽略大小写比较compareToIgnoreCase

获取字符串中某一个字符

通过字符获取下标indexOf

从指定位置开始找

从后的指定位置开始找lastIndexOf

转化

数值和字符串转化valueOf

字符串转数值parseInt和parseDouble

大小写转化toLowerCase和toUpperCase

将字符串转数组toCharArray

格式化format

字符串替换replace

替换字符串的第一个replaceFirst和整体替换replaceAll

字符串拆分split

多次拆分

字符串截取substring

去掉字符串左右两边的空格trim

字符串不可变性

字符串拼接

​编辑

String、StringBuffer、StringBuilder的区别


常用的三种字符串构造

复制代码
    public static void main(String[] args) {
        //直接赋值的方法, 定义字符串
        String str1="abcdef";//简写形式
        String str2=new String("hello Word!");

        //用字符数组 构造字符串
        char[]array={'a','b','c'};
        String str3=new String(array);

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

结果

String是引用类型,内部并不存储字符串本身

复制代码
    // s1和s2引用的是不同对象 s1和s3引用的是同一对象
    String s1 = new String("hello");
    String s2 = new String("world");
    String s3 = s1;

字符串长度length

  • .length用于求字符长度

  • .isEmpty用于判断字符串是否为空

    复制代码
          String str1="abcdef";
          System.out.println(str1.length());//6
    
          String str2=null;
          System.out.println(str2);//null
          System.out.println(str1.length());//空指针异常
    
          String str3="";
          System.out.println(str3.length());//0
          System.out.println(str3.isEmpty());//用于判断字符串是否为空 返回true或false

字符串比较

==比较

注意:

  • 对于内置类型, ==比较的是变量中的
  • 对于引用类型, ==比较的是引用中的地址

下面代码结果是true还是false?

复制代码
        String str1="abcdef";
        String str2="abcdef";
        System.out.println(str1==str2);

答案是true,解释如下

只要是双引号引起来的字符串常量,会存在一个字符串常量池中。

存储逻辑:先检查内存(字符串常量池)中是否有这个字符串;如果没有,存进去;如果有,直接去现有对象的即可。

上面代码str1先存在了字符串常量池中,str2不会在生成一个对象了,而是直接指向str1同一个对象。

不同上一题,下面代码结果是true还是false?

复制代码
        String str3=new String("abcd");
        String str4=new String("abcd");
        System.out.println(str3==str4);

结果是false

因为这里是强制产生了两个不同的对象,位于两个不同的空间,所以str3和str4是两个不同的字符串,结果是false

比较字符串的内容equals

复制代码
System.out.println(str1.equals(str2));

System.out.println(str3.equals(str4));

这里的结果两个都为true,equals比较的是两者的内容是否一致

忽略大小写比较equalsIgnoreCase

复制代码
        System.out.println(str3.equalsIgnoreCase(str4));

比较字符串大小compareTo

  1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值

  2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值

    复制代码
         String str1="abcde";
         String str2="edf";
         System.out.println(str1.compareTo(str2));

忽略大小写比较compareToIgnoreCase

复制代码
        System.out.println(str1.compareToIgnoreCase(str2));

获取字符串中某一个字符

复制代码
        String str1="abcde";
        char ch=str1.charAt(2);
        System.out.println(ch);

通过字符获取下标indexOf

复制代码
int index =str1.indexOf('d');
System.out.println(index);

从指定位置开始找

复制代码
        int index =str1.indexOf('a',2);//从2位置开始找a

从后的指定位置开始找lastIndexOf

复制代码
        String str3="ababcabcd";
        int index3=str3.lastIndexOf('a',4);
        System.out.println(index3);//2

转化

数值和字符串转化valueOf

复制代码
        String s1=String.valueOf(1234);
        String s2=String.valueOf(12.34);
        String s3=String.valueOf(true);

        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);

字符串转数值parseInt和parseDouble

复制代码
        int data1=Integer.parseInt("1234");//用类调用的方法,说明parseInt是静态方法
        double data2=Double.parseDouble("23.34");
        System.out.println(data1+6);
        System.out.println(data2+6);

查看parseInt源码,他是被static修饰的

大小写转化toLowerCase和toUpperCase

复制代码
        String str1="ABCD";//大写转小写
        String str2=str1.toLowerCase();//不是在原字符串本身进行修改(str1并没有改变,str2是产生的新的对象)
        System.out.println(str1);
        System.out.println(str2);

        String str3=str2.toUpperCase();//小写转大写
        System.out.println(str3);

结果如图

将字符串转数组toCharArray

复制代码
        String str1="ABCD";
        char[]array=str1.toCharArray();
        System.out.println(Arrays.toString(array));

结果如图

格式化format

复制代码
        String s=String.format("%d-%d-%d",2024,4,15);
        System.out.println(s);

字符串替换replace

有两种替换(replace的重载)

图中第一种是字符整体 替换,第二种是字符串整体替换

复制代码
        String str1="abcdab";
        String ret=str1.replace('a','z');
        String ret2=str1.replace("ab","yiyi");
        System.out.println(ret);
        System.out.println(ret2);

结果

替换字符串的第一个replaceFirst和整体替换replaceAll

复制代码
        //替换字符串的第一个
        String ret3=str1.replaceFirst("ab","yiyi");
        System.out.println(ret3);

        //字符串的整体替换
        String ret4=str1.replaceAll("ab","ttttt");
        System.out.println(ret4);

结果

字符串拆分split

复制代码
        //字符串拆分
        String s1="abc&tttt&hijk";
        String []str1=s1.split("&",2);//2表示最多分两组
        for (String s:str1) {
            System.out.println(s);
        }

结果

注意:

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

代码示例

复制代码
        String s2="2024.4.15";
        String []str2=s2.split("\\.");

        String s3="abc&pppp*hhhh";
        String []str3=s3.split("&|\\*");//用|表示将&和*分开,有这两个分隔符,用\\表示转义*

多次拆分

复制代码
//多次拆分
        String str="name=zhangsan&name=lisi";
        String[]strings=str.split("&");
        for (String s:strings) {
            String []ss=s.split("=");
            for (String x:ss) {
                System.out.println(x);
            }
        }

结果

字符串截取substring

复制代码
        //字符串截取
        String s1="abcdrrrr";
        //从指定下标开始一直往下截取
        String s2=s1.substring(1);
        System.out.println(s2);


        //截取目标下标下的字符串
        String s3=s1.substring(2,5);//左闭右开[2,5)
        System.out.println(s3);

去掉字符串左右两边的空格trim

复制代码
       String s1="    ab s c   d    f    ";
        System.out.println(s1);
        String s2=s1.trim();//去掉字符串左右两边的空格
        System.out.println(s2);

结果

字符串不可变性

字符串String类的源码中,value的值被final修饰,不能发生改变(value指向不能发生改变 ),但它指向的对象的内容是可以修改

又因为value被private封装了,源码中有没有get和set方法,使得字符串具有不可变性。

例如下面代码中数组array被final修饰

复制代码
        final int[]array=new int[]{1,3,4};
        array=new int[]{1,3,6};//报错
        array[0]=99;//可以修改

所以字符串实际上是不能被修改的。

尽量避免直接对String类型对象进行修改 ,因为String类是不能修改的,所有的修改都会创建新对象,效率 非常低下。

字符串拼接

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大 部分功能是相同的。以下演示StringBuilder

StringBuilde用于在原字符串上拼接字符串

复制代码
        StringBuilder stringBuilder=new StringBuilder("abcd");
        stringBuilder.append("yyyyyyy");

结果

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

String、StringBuffer、StringBuilder的区别

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理, 属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操 作。
相关推荐
想躺平的咸鱼干5 分钟前
Elasticsearch 的自动补全以及RestAPI的使用
java·后端·elasticsearch·中间件·intellij-idea
真实的菜15 分钟前
Java NIO 面试全解析:9大核心考点与深度剖析
java·面试·nio
宋一平工作室26 分钟前
单片机队列功能模块的实战和应用
c语言·开发语言·stm32·单片机·嵌入式硬件
飞翔的佩奇31 分钟前
Java项目:基于SSM框架实现的劳务外包管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·mysql·spring·毕业设计·ssm·毕业论文·劳务外包
豆豆(设计前端)39 分钟前
在 JavaScript 中,你可以使用 Date 对象来获取 当前日期 和 当前时间、当前年份。
开发语言·javascript·ecmascript
luckywuxn1 小时前
EurekaServer 工作原理
java·eureka
壹米饭1 小时前
Java程序员学Python学习笔记一:学习python的动机与思考
java·后端·python
java金融1 小时前
Java 锁升级机制详解
java
Young55661 小时前
还不了解工作流吗(基础篇)?
java·workflow·工作流引擎
让我上个超影吧1 小时前
黑马点评【缓存】
java·redis·缓存