【Java SE】超详细讲解String类

🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈

在这里插入图片描述

文章目录

  • 1. 初步认识String
  • 2. String类的常用方法
    • 2.1 字符串构造
    • 2.2 String对象比较
      • 2.2.1 ==比较是否引用同一个对象
      • 2.2.2 boolean equals(Object anObject) 方法
      • 2.2.3 int compareTo(String s) 方法
      • 2.2.4 int compareToIgnoreCase(String str) 方法
    • 2.3 字符串查找
    • 2.4 字符串转化
      • 2.4.1 数字与字符串之间的转化
      • 2.4.2 大小写转换
      • 2.4.3 字符串转数组
      • 2.4.4 格式化
    • 2.5 字符串替换
    • 2.6 字符串拆分
    • 2.7 字符串截取
    • 2.8 字符串去掉左右空格

1. 初步认识String

我们要区分一个概念,尽管C语言中可以表示"字符串",但只能用字符数组或者字符指针,没有"字符串"直接表示的方法
而Java语言中专门提供String类表示字符串,是十分方便的

2. String类的常用方法

2.1 字符串构造

(1) 使用常量串构造

//使用常量串构造
String s1 = "hi new classmate";
System.out.println(s1);

(2) 直接new String对象

//直接new String对象
String s2 = new String("hi new classmate");
System.out.println(s2); 

(3) 使用字符数组进行构造

//使用字符数组进行构造
char[] array = {'h','i'};
String s3 = new String(array);
System.out.println(s2);

注意
(1) 在Java中""被双引号引起来的也是String类型对象,可以直接调用String类的方法

public class Test2 {
    public static void main(String[] args) {
        //"hi new classmate"是一个String类型对象
        System.out.println("hi new classmate");
        //"hi new classmate"是String类型对象的话,可以调用String类中的方法
        System.out.println("hi new classmate".length());
    }
}

打印结果如下:
为什么"hi new classmate"字符串长度为16?因为中间空格也算字符~
在这里插入图片描述
(2) String类为引用类型内部存储对象地址,并不存储字符串本身
(关于内存指向等,画图能够帮助我们更好了解)
通过String类的实现源码,更好了解String类实例变量,如下图:
在这里插入图片描述
在JDK1.8中,字符串实际保存在char类型的数组中(hash部分将在数据结构专栏中讲解,敬请期待)

public class Test2 {
    public static void main(String[] args) {
        String s1 = new String("hi");
        String s2 = new String("lou");
        String s3 = s2;
           
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}

打印结果如下:
在这里插入图片描述
上述代码内存图如下:
在这里插入图片描述

2.2 String对象比较

字符串的比较是常见操作之一,在字符串排序中需要进行字符串比较,Java中提供以下4种方式:

2.2.1 ==比较是否引用同一个对象

注意!!!对于内置类比较的是变量中的值,对于引用类型比较的是引用中的地址

public class Test3 {
    public static void main(String[] args) {
        String s1 = new String("hi");
        String s2 = new String("hi");
        String s3 = new String("ha");
        String s4 = s1;

        System.out.println(s1 == s2); //false
        System.out.println(s2 == s3); //false
        System.out.println(s1 == s4); //true
    }
}

打印结果如下:
在这里插入图片描述
解释说明
(1) 尽管字符串s1与字符串s2内容一样,但是比较的是引用变量是否为同一个对象
(2) 字符串s2与字符串s3,这两个变量指向的引用不一样所以返回false
(3) 字符串s1与字符串s4,由于String s4 = s1,这两个变量指向的引用一样,返回true

2.2.2 boolean equals(Object anObject) 方法

String类重写父类Object中equals方法,Object类中equals默认按照==比较,String重写equals方法后按照如下规则进行比较,即String类的对象调用equals按照如下规则:按照字典序比较,字典序即为字符大小的顺序,以下给出代码

public class Test4 {
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
}

解释说明
(1) 首先判断this和anObject 是否为同一个对象比较,如果是同一个对象则返回true
(2) 检测anObject是否为String类型的对象,如果是String类型对象则继续比较,并将anObject向下转型为String类型对象,否则返回false
(3) this和anObject两个字符串的长度是否相同,长度是相同则继续比较,否则返回false
(4) 按照字典序,从前往后逐个字符进行比较

2.2.3 int compareTo(String s) 方法

同样是按照字典序进行比较,返回的是int类型
equals与compareTo的区别
(1) equals返回的是boolean类型
(2) compareTo返回的是int类型
具体比较方式如下:
(1) 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个不等字符的大小差值(大小理解为ASCII码值)
即如果两个字符串的第一个字符不等,结束比较,返回这两个字符串第一个字符的ASCII码差值
如果两个字符串的第一个字符相等,则比较两个字符串的第二个字符,以此类推,直至不等为止,返回该字符的ASCII码差值
(2) 如果前k个字符相等(k为两个字符长度中的最小值),返回值为两个字符串的长度差值

public static void main(String[] args) {
    String s1 = new String("abc");
    String s2 = new String("ac");
    String s3 = new String("abc");
    String s4 = new String("abcdefgh");
    //s1和s2不同输出字符差值-1,b、c两个字符的ASCII差值为-1
    System.out.println(s1.compareTo(s2)); 
    //相同输出0  
    System.out.println(s1.compareTo(s3)); 
    //前k个字符完全相同,s1和s4前3个字符为abc相同,输出长度差值-5  
    System.out.println(s1.compareTo(s4));   
}

解释说明
为什么s1.compareTo(s2)的返回结果是-1,不是它们俩第一个字符相同嘛~不应该返回-2嘛!
注意这里前k个字符相等需要满足k为两个字符长度中的最小值,s1长度为3,s2长度为2,即k为2,必须满足前两个字符相等,才可以返回字符串长度的差值

2.2.4 int compareToIgnoreCase(String str) 方法

与compareTo方式一致,但不区分字母的大小写!(即忽略大小写比较)

public static void main(String[] args) {
    String s1 = new String("abc");
    String s2 = new String("ac");
    String s3 = new String("ABC");
    String s4 = new String("abcdefGH");
     //s1和s2不同输出字符差值-1
    System.out.println(s1.compareToIgnoreCase(s2));   
    //相同输出0  
    System.out.println(s1.compareToIgnoreCase(s3));  
    //前k个字符完全相同,s1和s4前3个字符为abc相同,输出长度差值-5  
    System.out.println(s1.compareToIgnoreCase(s4)); 

}

2.3 字符串查找

字符串查找是字符串中很常见的操作,String类提供的常用查找的方法:
在这里插入图片描述
下面通过代码,使用使用,进一步了解String类提供的常用查找方法

public static void main(String[] args) {
    String s = "aaabbbcccaaabbbccc";
    System.out.println(s.charAt(2));                             
    //找下标为2的字符结果为'a'
    System.out.println(s.indexOf('c'));                          
    //找s字符串中第一次出现'c'的下标值结果为6
    System.out.println(s.indexOf('c', 10));                   
    //找字符串s下标10开始第一次出现'c'的下标值结果为15
    System.out.println(s.indexOf("bbb"));                        
    //找字符串s第一次出现"bbb"的下标值结果为3
    System.out.println(s.indexOf("bbb", 10));                   
    //找字符串s下标10开始第一次出现"bbb"的下标值结果为12
    System.out.println(s.lastIndexOf('c'));                      
    //找字符串s从后往前第一次出现'c'的下标值结果为17
    System.out.println(s.lastIndexOf('c', 10));                  
    //找字符串s从下标10开始从后往前第一次出现'c'的下标值结果为8
    System.out.println(s.lastIndexOf("bbb"));                   
    //找字符串s从后往前第一次出现"bbb"的下标值结果为12
    System.out.println(s.lastIndexOf("bbb", 10));               
    //找字符串s下标10开始从后往前第一次出现"bbb"的下标值结果为12

2.4 字符串转化

2.4.1 数字与字符串之间的转化

  1. 数字转字符串 String valueOf()
  2. 字符串转数字
    转化为int类型 int data1 = Integer.parseInt(String s1);
    转化为double类型 double data2 = Double.parseDouble(String s2);
    转化为float类型 flaot data3 = Float.parseFloat(String s3);
public class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        //数字转字符串
        String s1 = String.valueOf(100);
        String s2 = String.valueOf(99.00);
        String s3 = String.valueOf(true);
        //对象转化为字符串
        String s4 = String.valueOf(new Person("张三", 20));
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);

        //字符串转数字
        int data1 = Integer.parseInt("100");
        double data2 = Double.parseDouble("99.00");
        System.out.println(data1);
        System.out.println(data2);
    }
}

打印结果如下:
在这里插入图片描述解释说明】 Integer、Double等是Java中的包装类型(在后续会讲解到~)

2.4.2 大小写转换

  1. 小写转大写 String toUpperCase()
  2. 大写转小写 String toLowerCase()
public class Test {
    public static void main(String[] args) {
        String s1 = "hi new classmates";
        String s2 = "HI NEW CLASSMATES";
        //小写转大写
        System.out.println(s1.toUpperCase());
        //大写转小写
        System.out.println(s2.toLowerCase());
    }
}

打印结果如下:
在这里插入图片描述

2.4.3 字符串转数组

  1. 字符串转字符数组 String toCharArray()
  2. 字符数组转为字符串 String s = new String(ch);
public class Test {
    public static void main(String[] args) {
        String s = "hello";    
        //字符串转数组
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            System.out.print(ch[i]);
        } 
        //数组转字符串
        String s2 = new String(ch);
        System.out.println(s2);
    }
}

提醒
字符串转字符数组,toCharArray()方法在刷题中会经常用到,比较方便,这样可以直接访问该字符中的某一个字符~(在刷题中就能体会到啦!)

2.4.4 格式化

字符串格式化 String format()

public class Test {
    public static void main(String[] args) {
        String s = String.format("%d-%d-%d", 2024,5,27);
        System.out.println(s);
    }
}

打印结果如下:
在这里插入图片描述

2.5 字符串替换

如果想要将字符串的某个字符替换成别的,该如何做呢~以下有两个方法:

  1. 替换掉所有指定内容 String replaceAll()
  2. 替换字符串出现第一次出现的指定字符 String replaceFirst()
public class Test {
    public static void main(String[] args) {
        String str = "hello,world!" ;
        System.out.println(str.replaceAll("l", "*"));
        System.out.println(str.replaceFirst("l", "*"));
    }
}

打印结果如下:
在这里插入图片描述
注意事项
因为字符串是不可变对象,替换不修改当前字符串,是产生一个新的字符串

2.6 字符串拆分

字符串拆分是一个很常用操作,需重点掌握
字符串拆分是可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串

  1. 将字符串全部拆分 String[] split(String regex)
  2. 将字符串以指定的格式拆分为limit组 String[] split(String regex, int limit)
public class Test11 {
    public static void main(String[] args) {
        String str1 = "hello1 new1 classmates1";

        String[] result1 = str1.split(" ") ; // 按照空格拆分

        for(String x: result1) {
            System.out.println(x);
        }
        System.out.println("-------------------------------------------------");
        String str2 = "hello2 new2 classmates2";
        String[] result2 = str2.split(" ",2) ; // 按照空格拆分,成两组

        for(String x: result2) {
            System.out.println(x);
        }
    }
}

打印结果如下:
在这里插入图片描述
下面再举两个栗子~帮助我们理解字符串拆分的应用!
(1)拆分IP地址

public class Test {
    public static void main(String[] args) {
        String str = "192.168.2.12" ;
        String[] result = str.split("\\.") ;
        for(String s: result) {
            System.out.println(s);
        }
    }
}

打印结果如下:
在这里插入图片描述
我们需要按照"." 拆分IP地址,为什么这里前面加上\呢!这就需要注意加上转义字符啦
注意事项
(以下字符均省略双引号)
1)字符 | * + . 都需要在前面加上转义字符\\
2)如果是\ ,需写成 \\\\
3)如果一个字符串中有多个分隔符,可以用|作为连字符

(2)多次拆分

public class Test {
    public static void main(String[] args) {
        String str = "name=泡泡&age=21" ;

        String[] result = str.split("&") ;

        for (int i = 0; i < result.length; i++) {
            String[] s = result[i].split("=") ;
            System.out.println(s[0]+" = "+s[1]);
        }
    }
}

打印结果如下:
在这里插入图片描述
解释说明
先按照 “&” 拆分字符串,再遍历该拆分字符串数组,每个元素再以 “=” 划分,最后调整一下输出格式

2.7 字符串截取

字符串截取是从一个完整的字符串之中截取出部分内容,非常常用的操作

  1. 指定索引截取到字符串结尾 String substring(int beginIndex)
  2. 截取部分内容 String substring(int beginIndex,int endIndex)
public class Test14 {
    public static void main(String[] args) {
        String str = "helloclassmates";
        //从索引5截到字符串末尾
        System.out.println(str.substring(5));
        //从下标0截到字符串索引5,不包括索引5的字符!!! 截取区间为[0,5)
        System.out.println(str.substring(0, 5));
    }
}

注意事项
String substring(int beginIndex,int endIndex) 这是前闭后开区间的写法,
包含beginIndex下标的字符,不包含 endIndex 下标,在上述例子中,substring(0, 5) 表示包含 0 下标的字符,不包含 5 下标

2.8 字符串去掉左右空格

String trim() 去掉字符串中的左右空格,换行,制表符,保留中间的空格

public class Test10 {
    public static void main(String[] args) {
        String str = "    hello world classmate    " ;
        System.out.println(str.trim());
    }
}

打印结果如下:
在这里插入图片描述

其它方法需要用到的时候,可以参考Java在线文档:Java在线文档

💛💛💛本期内容回顾💛💛💛
在这里插入图片描述

✨✨✨本期内容到此结束啦~下期内容将继续讲解String类(期待ing)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/660032.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

乐鑫ESP串口驱动安装,安装cp210x驱动

windows11安装cp210x驱动&#xff1a; 1&#xff1a;第一步官网下载驱动&#xff1a; 官网地址如下&#xff1a; CP210x USB to UART Bridge VCP Drivers - Silicon Labs 第二步&#xff1a;解压文件夹并安装如图所示&#xff1a; 3&#xff1a;第三步安装成功后会给你个提示…

java后端框架-MyBatis

一、概述 1、起源 MyBatis本是Apache下的开源项目&#xff0c;名为iBatis,2010年转投谷歌,从iBatis3.x开始更名为MyBatis 2、优点 (1)优秀的数据持久层框架&#xff08;对jdbc做了轻量级封装&#xff09; 3、特点 (1)对jdbc中接口进行封装的同时还提供了一些自己的类实现…

怎么看qq注册时间?你的qq生日居然是这样查看的!

QQ账号就像是一个穿越时空的日记本&#xff0c;每一个聊天记录、每一条动态都是时间的印记。而QQ注册时间&#xff0c;便是这本日记本的开篇第一章&#xff0c;它见证了你的网络生活的起点。怎么看qq注册时间呢&#xff1f;别着急&#xff0c;接下来我将为你揭晓答案。 操作环境…

MATLAB分类与判别模型算法:基于Fisher算法的分类程序【含Matlab源码 MX_002期】

算法思路介绍&#xff1a; 费舍尔线性判别分析&#xff08;Fishers Linear Discriminant Analysis&#xff0c;简称 LDA&#xff09;&#xff0c;用于将两个类别的数据点进行二分类。以下是代码的整体思路&#xff1a; 生成数据&#xff1a; 使用 randn 函数生成随机数&#x…

11. Django 常用的Web应用程序

11. 常用的Web应用程序 Django为开发者提供了常见的Web应用程序, 如会话控制, 缓存机制, CSRF防护, 消息框架, 分页功能, 国际化和本地化, 单元测试和自定义中间件. 内置的Web应用程序大大优化了网站性能, 并且完善了安全防护机制, 同时也提高了开发者的开发效率.11.1 会话控制…

IO系列(九) -什么是零拷贝

一、摘要 相信不少的网友&#xff0c;在很多的博客文章里面&#xff0c;已经见到过零拷贝这个词&#xff0c;会不禁的发出一些疑问&#xff0c;什么是零拷贝&#xff1f; 从字面上我们很容易理解出&#xff0c;零拷贝包含两个意思&#xff1a; 拷贝&#xff1a;就是指数据从…

宠物空气净化器:猫毛过敏者的终极解决方案,养猫不再是梦!

我有一位朋友&#xff0c;猫猫的深度爱好者。但是每当与猫咪接触的时候就会出现过敏反应&#xff0c;例如浑身发痒、打喷嚏、呼吸困难、起红疹等。对此&#xff0c;有专家给出权威的解释&#xff1a;引发铲屎官过敏的“罪魁祸首”是一种叫做Feld1的蛋白质成分&#xff0c;而这种…

性能击败99%PC用户,旗舰性能CPU 13700KF +技嘉Z790 + 德静界 机散装机配置思路分享

性能击败99%PC用户&#xff0c;旗舰性能CPU 13700KF 技嘉Z790 德静界 机散装机配置思路分享 又到了一年一度的618年中促销&#xff0c;今年的618比往年要来的更早。 很多人已经感受到&#xff0c;5月各大电脑相关配件都开始了今年的促销让利。 凑此机会&#xff0c;我又装了…

IT学习笔记--Kubernetes

kubernetes组件&#xff1a; 一个Kubernetes集群主要是由控制节点&#xff08;master&#xff09;、工作节点&#xff08;node&#xff09;构成&#xff0c;每个节点都会安装不同的组件。 master&#xff1a;集群的控制平面&#xff0c;负责集群的决策 ApiServer&#xff1a…

蓝桥杯物联网竞赛_STM32L071KBU6_对于EEPROM的新理解

EEPROM写函数&#xff1a; void Function_GetEepromData(){Function_EepromRead(4, BUFF);OLED_ShowChar(0, 0, BUFF[0] 0);OLED_ShowChar(0, 2, BUFF[1] 0); BUFF[0] ;BUFF[1] ;HAL_FLASHEx_DATAEEPROM_Unlock();HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_WOR…

项目经理催开发进度的5大技巧

项目经理在催促开发进度时&#xff0c;采用的技巧对于项目成功至关重要。这不仅影响到项目的按时完成&#xff0c;还关系到团队的士气、效率和最终产品的质量。项目经理如果不去主动催促开发进度&#xff0c;可能导致项目延期&#xff0c;团队偏离原定路线&#xff0c;工作重点…

用于脑肿瘤分割的跨模态深度特征学习| 文献速递-深度学习肿瘤自动分割

Title 题目 Cross-modality deep feature learning for brain tumor segmentation 用于脑肿瘤分割的跨模态深度特征学习 01 文献速递介绍 作为最致命的流行病&#xff0c;脑肿瘤的研究越来越受到关注。本文研究了一种基于深度学习的自动分割胶质瘤的方法&#xff0c;称为脑…

java版CRM客户关系管理系统源码-CRM客户关系管理系统的技术架构与功能实现

CRM客户关系管理系统的技术架构与功能实现 一、引言 随着市场竞争的日益激烈&#xff0c;客户关系管理&#xff08;CRM&#xff09;已成为企业赢得市场、提升客户满意度、促 进业务增长的关键手段。本文旨在介绍一款先进的CRM客户关系管理系统的技术架构与功能实现&#xff0…

认识NoSql

SQL是结构化的&#xff0c;NoSql是非结构化的 SQL是关联的&#xff1a; Nosql是无关联的&#xff1a; SQL采用的是SQL查询&#xff1a; 语法固定&#xff0c;好处是&#xff1a;只要是关系型数据库&#xff08;Mysql,Oracle&#xff09;&#xff0c;都能够使用相同的语句进行查…

2024年PMP考试备考需要多长时间,每天学习多长时间?

这取决于您在PMP上投入的时间和效率&#xff0c;通常情况下&#xff0c;2-3个月就够了。如果您平时工作很忙&#xff0c;每天可以挤出一个小时来学习&#xff1b;如果时间比较充裕&#xff0c;可以花两个小时看书、做题和参加直播课。在备考之前&#xff0c;要先了解PMP每年的考…

PostgreSQL数据库提权

前面讲述了mysql、SqlServer、Redis数据库相关的提权方式&#xff0c;有兴趣的也可以去看看。 这里讲的postgreSQL数据库提权就是任意命令执行漏洞(CVE-2019-9193)。 目录 数据库简介 漏洞原理 影响版本 漏洞利用 利用前提 漏洞复现 复现准备 复现过程 漏洞修复 数据…

JVM学习-字节码指令集(二)

对象的创建与访问指令 创建指令 虽然类实例和数组都是对象&#xff0c;但Java虚拟机对类实例和数组的创建和操作使用了不同的字节码指令创建类实例指令&#xff1a;new 它接收一个操作数&#xff0c;指向常量池的索引&#xff0c;表示要创建的类型&#xff0c;执行完成后&am…

基于匹配追踪和最大重叠离散小波变换的ECG心电信号R波检测(MATLAB 2018a)

准确识别心电信号的R波是进行HRV分析的前提。因此&#xff0c;开发出准确的心电信号R波检测方法十分重要。近几十年来&#xff0c;提出的R峰检测方法主要分为两个阶段。第1阶段是预处理阶段&#xff0c;目的是对受不同噪声影响的原始心电信号进行降噪处理&#xff0c;从而实现增…

1794 jsp蛋糕店管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp 蛋糕店管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

Pycharm打开django支持

在 PyCharm 中打开 “Settings/Preferences” -> “Languages & Frameworks” -> “Django”。 勾上Enable Django support 然后配置好文件根目录就好了