【Java SE】超详细讲解String类(上)

news2024/12/26 6:40:40

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

在这里插入图片描述

文章目录

  • 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/1704766.html

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

相关文章

创新实训2024.05.28日志:记忆化机制、基于MTPE与CoT技术的混合LLM对话机制

1. 带有记忆的会话 1.1. 查询会话历史记录 在利用大模型自身能力进行对话与解答时&#xff0c;最好对用户当前会话的历史记录进行还原&#xff0c;大模型能够更好地联系上下文进行解答。 在langchain chat chat的chat函数中&#xff0c;通过实现langchain框架提供的ChatMemo…

XGIS引擎上线曲折历史

演示地址&#xff1a;threelab首页 其实在一年前甚至更早&#xff0c;已经完整了初版的XGIS三维引擎开发&#xff0c;完成了基本的操作。 但是很多原因导致我一直没有上线&#xff0c;也不是没有上线&#xff0c;上线了&#xff0c;又下掉了。总感觉自己写的欠缺&#xff0c;或…

Easy-laser激光对中仪维修D505激光测平仪维修

Easylaser激光对中仪多应用于风力发电业的塔架、机架、轮毂、偏航轴承和变桨轴承的几何指标测量中。此系列常见维修型号包括D450&#xff1b;D480&#xff1b;D505&#xff1b;D525&#xff1b;D550等。 Easy-Laser对中仪维修注意事项&#xff1a; 测量功能包括&#xff1a; …

虚拟化技术 分布式资源调度

一、实验内容 实现分布式资源调度 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装VMware Workstation Pro已安装Windows Server 2008 R2 x64已安装vCenter Server 三、实验步骤 将主机esxi1和esxi2加入…

JVM-之GC日志

一、 开启gc 日志 在项目中开启GC 日志打印后会查看gc 日志如下 nohup java -Xms768m -Xmx768m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./dumplog/dumplog.log -Xloggc:./dumplog/gc.log -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintHeapAtGC -jar xxxx…

小易大数据:大数据报告查询领域的黑马,这些优势让你无法忽视!

随着大数据技术被运用到各行各业&#xff0c;风控领域也不例外&#xff0c;形成了基于大数据技术的大数据信用&#xff0c;也就是我们常说的大数据报告或者网贷大数据&#xff0c;在众多的查询平台中&#xff0c;小易大数据平台在市面上是比较受欢迎的&#xff0c;那在小易平台…

使用华为快传同步文件至电脑

使用华为快传同步文件至电脑&#xff0c;电脑端未发现设备解决办法 1、手机和电脑连同一网络 2、打开手机华为分享&#xff0c;打开电脑网络 3、网络中找到设备&#xff0c;输入账户密码进行连接&#xff08;未找到设备往下继续看&#xff09; 未找到设备解决办法&#xff1…

电脑如何在网页上下载视频 浏览器如何下载网页视频

对于现代职场人士而言&#xff0c;在日常生活中难免需要下载各种短视频&#xff0c;IDM下载加速器可以轻松获取抖音、快手等平台的无水印短视频文件。 Internet Download Manager&#xff0c;简称IDM。功能强大的网络下载器。您不需要多余的操作&#xff0c;IDM 能捕获您的下载…

阿里云获取nginx头部

k8s 配置 可以修改kube-system/nginx-configuration configmap的方式&#xff0c; compute-full-forwarded-for: “true” forwarded-for-header: “X-Forwarded-For” use-forwarded-headers: “true” https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-g…

Day01-01-git

Day01-01-git Content List0. 运维发展过程1. ci-cd-co基础1.1 软件的生命周期1&#xff09;软件的声明周期&#xff1a;软件从0-->1-->0过程2&#xff09;ci/cd3&#xff09;Devops4) 小结 1.2 什么是环境1.3 什么是代码部署1.4 代码发布方式 3. DevSecOpt之Git极速入门…

INTERCONNECT 中使用库中器件制作一个损耗为 3 dB /m 的直波导

INTERCONNECT 中使用库中器件制作一个损耗为 3 dB /m 的直波导 正文 正文 首先&#xff0c;插入以下器件并连接。 其次&#xff0c;设置直波导 WGD_1 的器件参数&#xff0c;如下图所示&#xff1a; 运行仿真&#xff0c;在 ONA 中查看 gain 值。 可以看到&#xff0c;对应…

C++入门——日期类的实现

前言 生活中&#xff0c;我们时不时会遇到算天数的问题&#xff1a;高考倒计时、考研倒计时、过年倒计时...... 想解决这些问题无非就是实现一个年月日的计算器&#xff0c;那要怎么来实现呢&#xff1f; 下面就让我们来探究一下。 1.了解日期计算器的需求 1.1 表面需求 …

Java实现链表

链表 前言一、链表的概念及结构二、链表的分类三、链表的实现无头单向非循环链表实现无头双向链表实现具体代码 四、链表习题五、顺序表和链表的区别 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&#xff0c;对我…

Linux shell编程学习笔记50:who命令

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。比如&#xff0c;我们可以使用who命令来收集当前已登陆系统的用户信息&#xff0c;当前运行级别等信息。 1. who命令 的功能、格式和选项…

再论任何图≌自己这一几何最最起码常识推翻平面公理

黄小宁 有了解析几何使人类对直线和射线的认识有革命性的飞跃。几何学有史2300年来一直认定起点和射出的方向都相同的射线必重合&#xff0c;任两异射线必有全等关系&#xff1b;解析几何使我发现这是2300年肉眼直观错觉。 h定理&#xff08;参考文献中的定理&#xff09;&am…

中国自动分拣行业TOP5玩家:大盘点(年收入开局12亿……)

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 随着物流行业的迅猛发展&#xff0c;自动分拣技术正成为提升物流效率的关键。中国自动分拣行业的几家领军企业在2023年展现了各自的战略…

1+x(Java)中级题库易混淆理论题(二)

冷备份实质就是数据库相关文件的复制 System.in是字节流 Map集合中的key是无序的 protected不能用于修饰类 接口中所有抽象方法默认使用public修饰 DML操作有&#xff1a;INSERT UPDATE DELETE SQL 语句中进行 group by 分组时&#xff0c;可以不写 where 子句 使…

【Web】2024 京麒CTF ezjvav题解

目录 step 0 step 1 step 2 EXP1 EXP2 step 0 进来是一个登录框 admin/admin成功登录 访问./source jwt伪造 带着伪造的jwt访问./source&#xff0c;拿到题目源码jar包 step 1 pom依赖有spring、fj、rome 反序列化入口在./Jsrc路由 有两层waf&#xff0c;一个是明…

【Docker】docker-compose 常用命令

启动服务&#xff1a; docker-compose up 如果你想在后台运行服务&#xff0c;可以添加 -d 标志&#xff1a; docker-compose up -d 开启所有服务 docker-compose start 停止服务&#xff1a; docker-compose down 查看服务状态&#xff1a; docker-compose ps 查看…

mumu 模拟器安装

1.下载安装 下载地址 Win 历史版本&#xff1a;http://mumu.163.com/update/win/Mac 历史 版本&#xff1a;http://mumu.163.com/20200515/25905_880858.html 2.设置为竖屏 在设置中心--界面设置页面设置宽720&#xff0c;高1280&#xff0c;DPI为240&#xff0c;如下图所示。…