【Java SE】超详细讲解String类

news2024/11/17 21:31:09

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

在这里插入图片描述

文章目录

  • 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.coloradmin.cn/o/1713478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3.4 移动机器人工作空间(摘自自主移动机器人导论2)

对于一个机器人来说&#xff0c;机动性等效于它的控制自由度。但是&#xff0c;机器人是处于某种环境的&#xff0c;因而下一个问题是把我们的分析放到环境之中。 我们关心机器人用它可控制的自由度在环境中定位它本身的方法。例如&#xff0c;考虑 Ackerman 车辆或汽车&#…

AI时代的服装设计师--AIGC

AI时代的服装设计师--AIGC AIGCAIGC设计能替代真正的设计师吗森马T恤设计AIGC优势、优化 本文记录于去年参加的一次森马T恤设计活动的感受。 AIGC 可以说&#xff0c;近期以来&#xff0c;随着ChatGPT的不断发展&#xff0c;从ChatGPT-3到ChatGPT-4的飞速发展&#xff0c;AIGC…

无人港口/码头兴起,可视化大屏功不可没。

码头/港口可视化大屏可以为管理上带来多方面的价值&#xff0c;包括但不限于&#xff1a; 1. 实时监控&#xff1a; 大屏可以将港口的各种数据、设备状态、船舶位置等信息实时展示&#xff0c;管理人员可以通过大屏随时监控港口的运营情况&#xff0c;及时发现并处理问题。 2…

香橙派AIpro初体验

1.开发板资料 开发板资源 产品介绍主页&#xff1a;http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-AIpro.html开发板案例源码&#xff1a;https://gitee.com/ascend/EdgeAndRobotics工具&原理图&案例源码&开发手册&#x…

python知识继续学习

1、计算机表示小数是有误差的&#xff0c;下面的5就是误差 2、在python中&#xff0c;所有的非0数字都是True&#xff0c;零是False。所有的非空字符串都是True&#xff0c;空字符串是False。空列表是False。在python的基本数据类型中&#xff0c;表示空的东西都是False&#x…

代码随想录算法训练营Day 53| 动态规划part14 | 1143.最长公共子序列、1035.不相交的线 、53. 最大子序和 (动态规划 )

代码随想录算法训练营Day 53| 动态规划part14 | 1143.最长公共子序列、1035.不相交的线 、53. 最大子序和 &#xff08;动态规划 &#xff09; 文章目录 代码随想录算法训练营Day 53| 动态规划part14 | 1143.最长公共子序列、1035.不相交的线 、53. 最大子序和 &#xff08;动态…

量化交易:如何在QMT中运行Python策略并在VSCode中高效调试?

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 为何选择QMT和VSCode进行量化策略开发&#xff1f; 在量化交易的世界里&#xff0c;选择正确的工具与拥有优秀的策略同等重要。调用用Visual Studio Code&#xff08;简称VSCode&#xff09;或pycharm&#xff0c;方…

10种排序算法总结-(c语言实现与动画演示)

算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。非比较类排序&#xff1a;不通过比较来决定元素间的相对次序&#…

GPT-4你了解多少呢

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术一直备受关注。近年来&#xff0c;随着深度学习技术的飞速发展&#xff0c;NLP领域也取得了显著进步。GPT-4&#xff0c;作为OpenAI公司最新发布的自然语言处理模型…

wxPython应用开发-后台线程更新大量数据到wxGrid避免ui无响应

一、问题描述 最近几天&#xff0c;我在用python开发一个数据处理的小工具。需要将xls文件中的大量数据&#xff08;少则几千行多则几万行&#xff09;读取出来后进行处理。其中一个功能是需要实现将读取到的原始数据和计算出来的结果在软件界面中以表格形式展示出来。 在pyt…

Sectigo证书介绍以及申请流程

Sectigo (原Comodo CA)是全球SSL证书市场占有率最高的CA公司&#xff0c;目前将近40%的SSL证书用户选择了Sectigo。由于其产品安全&#xff0c;价格低&#xff0c;受到大量站长的信任和欢迎。Sectigo旗下的SSL证书品牌包括Sectigo, Positive SSL, Sectigo Enterprise等。 品牌…

卷积常用网络

目录 1.AlexNet2.VGG3.GoogleNet4.ResNet5.MobileNet 1.AlexNet AlexNet是2012年ISLVRC 2012&#xff08;ImageNet Large Scale Visual Recognition Challenge&#xff09;竞赛的冠军网络。 首次利用 GPU 进行网络加速训练。使用了 ReLU 激活函数&#xff0c;而不是传统的 Si…

基于 Arm 虚拟硬件的 TinyMaix 超轻量级神经网络推理框架的项目实践

本实验过程中所显示的优惠价格及费用报销等相关信息仅在【Arm AI 开发体验创造营】体验活动过程中有效&#xff0c;逾期无效&#xff0c;请根据实时价格自行购买和体验。同时&#xff0c;感谢本次体验活动 Arm 导师 Liliya 对于本实验手册的共创与指导。 详见活动地址&#xff…

【大比武08】利用RAG技术构建档案智能问答系统

关注我们 - 数字罗塞塔计划 - # 大比武2024 本篇是参加“华夏伟业”杯第二届档案信息化公司业务与技术实力大比武&#xff08;简称“大比武 2024”&#xff09;的投稿文章&#xff0c;来自燕山大学档案馆&#xff08;校史馆&#xff09;的实际项目&#xff0c;由河北科怡科技…

拍摄的视频内容怎么做成二维码?视频在线转换成二维码的方法

怎么把拍的个人才艺视频做成二维码呢&#xff1f;现在扫码看视频是实现内容快速传播的一种常用方式&#xff0c;所以很多人会将自己拍摄的视频制作二维码图片&#xff0c;然后分享给其他人扫码获取内容&#xff0c;对于内容的传播速度及用户体验有很好的提升&#xff0c;在很多…

NTLM Relay Gat:自动化NTLM中继安全检测工具

关于NTLM Relay Gat NTLM Relay Gat是一款功能强大的NTLM中继威胁检测工具&#xff0c;该工具旨在利用Impacket工具套件中的ntlmrelayx.py脚本在目标环境中实现NTLM中继攻击风险检测&#xff0c;以帮助研究人员确定目标环境是否能够抵御NTLM中继攻击。 功能介绍 1、多线程支持…

【开发利器】使用OpenCV算子工作流高效开发

学习《人工智能应用软件开发》&#xff0c;学会所有OpenCV技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV实验大师Python SDK 基于OpenCV实验大师v1.02版本提供的Python SDK 实现工作流导出与第三方应用集…

Java---Cloneable接口---浅克隆和深克隆

在Java中&#xff0c;我们如何实现一个对象的克隆呢&#xff1f; 在Java中实现对象的克隆&#xff0c;我们要用到Cloneable接口。克隆也分为浅克隆和深克隆。 1.实现浅克隆 1.重写clone方法 当我们想直接通过前面已经建立好的对象来调用Object类中的clone方法时&#xff0c;…

vbs执行报错vbs没有文件拓展,双击无法打开

如果看不到文件扩展名需要设置&#xff1a; 无法双击打开vbs 一般为注册表问题 解决办法 将下方代码保存为xxx.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.VBS] "VBSFile" [HKEY_CLASSES_ROOT.VBS\PersistentHandler] "{5e941d80-bf96-…

VBA让按钮消失

要求 用VBA搞小程序&#xff0c;有个录入数据的按钮&#xff0c;点击后进行录入数据的操作&#xff0c;操作完成后这个按钮就是灰的&#xff0c;点不动&#xff0c;这个怎么做&#xff1f; 实现过程 没找到让按钮变灰的方法&#xff0c;退而求其次&#xff0c;让按钮消失。 …