对Java中String类的解释

news/2024/11/18 0:28:45/

文章目录

  • 一、String 的常用方法
    • 1.字符串的构造以及字符串常量池
    • 2.String 类中对象的比较
    • 3.字符串查找
    • 4.转化
    • 5.字符串替换
    • 6.字符串拆分
    • 7.字符串截取
  • 二、StringBuilder 和 StringBuffer
    • 1.引入两者的原因
    • 2.相关修改操作的介绍

一、String 的常用方法

首先,在介绍 String 类的常用方法之前,我们需要明白,Java 中为何要引入这样一个元素?

我们在 C 语言中都已经接触过字符串了,但是在 C 语言中要表示字符串只能使用字符数组 或 字符指针,可以使用其标准库中提供的字符串系列函数来完成需要的操作,但是,在 Java 中,将数据和操作数据方法分离的方式不符合面向对象的思想,因而设计了 String 类。

1.字符串的构造以及字符串常量池

String 类为构造字符串提供了很多的方法结构,但是常用的通常为以下三种。

        //1.使用常量串直接构造String s1 = "hello s1";System.out.println(s1);//2.使用new String 对象String s2 = new String("hello s2");System.out.println(s2);//3.利用字符数组进行构造char[] array = {'h','e','l','l','o',' ','s','3'};String s3 = new String(array);System.out.println(s3);

注意:我们在建立字符串时,有时会出现类似这种语句

        String s1 = "hello";String s2 = "world";String s3 = s1;

这里我们要明确一点,String 是引用类型,并不存储元素本身,所以,这里的 s3 并不是创建了一个新的元素,而是指向了 s1 这里创建的元素,如图:

在这里插入图片描述
字符串常量池
在上面的字符串构造中,其中的图示,阐述了为什么 s1 和 s3 是指向同一个对象,这也就是字符串常量池的一种类似的描述

简单解释:字符串常量池是指,将一些常用的字符串,在堆区中提前存储一份,当要使用这些字符串时,无需再开辟新的空间进行存储,直接调用即可

2.String 类中对象的比较

  1. 用"=="来比较是否引用同一个对象

    在通常的内置类型中 == 是用来比较变量中的值是否相同,但在引用类型中 == 是用来比较元素存储的地址是否相同。

例如:内置类型

    public static void main(String[] args) {int a = 10;int b = 20;int c = 10;System.out.println(a==b);System.out.println(a==c);}

在这里插入图片描述
引用类型

        String s1 = new String("hello");String s2 = new String("world");String s3 = new String("hello");String s4 = s1;System.out.println(s1 == s2);   //falseSystem.out.println(s1 == s3);   //falseSystem.out.println(s1 == s4);   //true

在这里插入图片描述

这里要注意,引用类型中要出现上述情况,必须是 new String() 对象实现,如果进行字符串直接构造结果就会出现差异。

如:

        String s1 = "hello";String s2 = "world";String s3 = "hello";String s4 = s1;System.out.println(s1 == s2);   //falseSystem.out.println(s1 == s3);   //trueSystem.out.println(s1 == s4);   //true

在这里插入图片描述

  1. boolean equals(Object anObject) 方法:按照字典序比较

s1.equals(s2)

String 类重写了父类 Object 中的 equals 方法,在 Object 中 equals 默认按照的是 == 进行比较,而在 String 中重写后按照以下的方式进行比较。

  • (1)传入元素后检测传入元素 Object 和 anObject 是否为同一对象比较
  • (2)检测是否为 String 类型的元素,如果是就继续比较
  • (3)检测两个字符串的长度是否相同,如果是就继续比较
  • (4)按找字典序,从前往后依次对两个字符串进行比较

比较方法代码示例:

        String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("Hello");System.out.println(s1.equals(s2));  //s1 和 s2 中的元素进行比较打印 trueSystem.out.println(s1.equals(s3));  //s1 和 s3 中的元素进行比较打印 false

在这里插入图片描述

  1. int compareTo(String s) 方法: 按照字典序进行比较

s1.compareTo(s2)

compareTo 方法和 equals 不同的是,equlas返回的是 boolean 类型,而 compareTo 方法返回的是 int 类型。

  • (1)按照字典次序大小比较,如果出现不相等的字符,直接返回这两个字符串的大小差值.
  • (2)如果前 K 个字符相等(K 的长度 >= 2),返回的是两个字符串的长度差值。
        String s1 = new String("abc");String s2 = new String("az");String s3 = new String("abcdef");String s4 = new String("abc");System.out.println(s1.compareTo(s2));   //b 98 和 z 122 相差 24 输出 -24System.out.println(s1.compareTo(s4));   //字符串元素相等输出 0System.out.println(s1.compareTo(s3));   //前 3 个字符串相同,输出长度差值 -3

在这里插入图片描述

int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较

3.字符串查找

如图,String 提供的常用的查找方法
在这里插入图片描述

        String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3));    //查找第 3 个元素System.out.println(s.indexOf('c'));     //返回 c 第一次出现的位置System.out.println(s.indexOf('c', 10));     //从第 10 个位置开始,返回第一次出现 c 的位置System.out.println(s.indexOf("bbb"));   // 返回 ‘bbb’ 第一次出现的位置System.out.println(s.indexOf("bbb", 10));   //从第 10 个位置开始,返回第一次出现‘bbb’的位置System.out.println(s.lastIndexOf('c'));     //从后往前找到第一个出现 c 的位置System.out.println(s.lastIndexOf('c', 10));     //从正数第 10 个开始,从后向前找到第一次出现 c 的位置System.out.println(s.lastIndexOf("bbb"));System.out.println(s.lastIndexOf("bbb", 10)); // 字符串同理

在这里插入图片描述

4.转化

  1. 数值和字符串变化

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);

在这里插入图片描述
(2)将字符串转换为数字

        int data1 = Integer.parseInt("1234");double data2 = Double.parseDouble("12.34");System.out.println(data1);System.out.println(data2);

在这里插入图片描述

  1. 大小写转化

toUpperCase() 小写转大写
toLowerCase() 大写转小写

        String s1 = "hello";String s2 = "HELLO";System.out.println(s1.toUpperCase());System.out.println(s2.toLowerCase());

在这里插入图片描述

  1. 字符串转数组

toCharArray(); //将字符串转化为数组方法

		String s = "hello";char[] ch = s.toCharArray();    //将String 转化为数组类型for (int i = 0; i < ch.length; i++) {System.out.print(ch[i]);}System.out.println();String s2 = new String(ch);     //将数组转化成字符串System.out.println(s2);

在这里插入图片描述

  1. 格式化

format(); //将数字转化成所需的格式形式

        String data = String.format("%d/%d/%d",2022,12,20);//%d 之间的分割符 / 可以根据需要变换System.out.println(data);

在这里插入图片描述
在这里插入图片描述

5.字符串替换

在这里插入图片描述

        String str = "HelloWorld";String all = str.replaceAll("l","*");//将所有的 l 替换成 * String first = str.replaceFirst("l","*");//将第一个出现的 l 替换成 *System.out.println(all);System.out.println(first);

在这里插入图片描述

6.字符串拆分

在这里插入图片描述
(1)按照空格进行拆分

        String str = "Hello world hello boy";String[] result = str.split(" ");   //按照空格进行拆分for (int i = 0; i < result.length; i++) {System.out.println(result[i]);}

在这里插入图片描述

(2)将字符串按照部分拆分

        String str = "Hello world hello boy";String[] result = str.split(" ",2);   //以第一个空格为界,将字符串分为两部分for (int i = 0; i < result.length; i++) {System.out.println(result[i]);}

在这里插入图片描述

(3)对于特定的分割条件需要转译

例如: 当前要将 ip 地址依照 “.” 进行分割。

在这里插入图片描述
在这里插入图片描述
不难看出这样直接输入分割对象是错误操作

正确操作如下:

        String str = "192.168.1.1";String[] result = str.split("\\.");for (String s:result) {System.out.println(s);}

在这里插入图片描述

对于字符串的多次分割

        String str = "name=zhangsan&age=18";String[] result = str.split("&");   //根据 & 先将整体分为两部分for (int i = 0; i < result.length; i++) {String[] temp = result[i].split("=");   //在进行细分System.out.println(temp[0]+"="+temp[1]);}

在这里插入图片描述

7.字符串截取

在这里插入图片描述

        String str = "helloworld";String one = str.substring(5);String two = str.substring(0,5);System.out.println(one);System.out.println(two);

在这里插入图片描述

二、StringBuilder 和 StringBuffer

1.引入两者的原因

  1. 字符串的不可变性

    String 类在设计时就是不可改变的,如图:
    在这里插入图片描述
    String 类中的字符实际保存在内部维护的 value 字符数组中,从图中还可以看出:
    (1) String 类被 final 进行修饰,表明该类不能被继承。
    (2) value 被 final 修饰,表明 value 自身的值不能改变,即,不能引用其他的字符数组,但是其引用空间的内容都可以修改。

因此,为了避免对 String 类的直接修改,我们就需要引入 StringBuilder 和 StringBuffer 进行修改。

2.相关修改操作的介绍

在 Java 中提供的修改字符串操作 StringBuilder和StringBuffer类,这两大类的部分操作功能是相同的,在这里介绍一些常用的 StringBuilder 操作方法。

  1. append(String str)
    在尾部追加字符串,相当于String 的 += 操作。
        StringBuilder sb1 = new StringBuilder("hello");//追加:即尾插如--> 字符、字符串、整形数字。sb1.append(' ');    //插入空格sb1.append("world");    //插入world字符sb1.append(123);    //插入123System.out.println(sb1);

在这里插入图片描述

  1. char charAt(int index)
    获取 index 位置的字符
        char a = sb1.charAt(0);	//获取0下标的字符串元素,使用 char 类型System.out.println(a);

在这里插入图片描述

  1. int length()
    获取字符串长度
        int b = sb1.length();   //获取字符串的有效长度System.out.println(b);

在这里插入图片描述

  1. int capacity()
    获取底层保存字符串的总长度大小
        int c = sb1.capacity();     //获取底层数组的总大小System.out.println(c);

在这里插入图片描述

  1. setCharAt(int index,char ch)
    将 index 位置的字符设置为 ch
        sb1.setCharAt(0,'H');   //修改设置任意位置的字符 h-->HSystem.out.println(sb1);

在这里插入图片描述

  1. insert(int index,char ch)
    在 index 位置前插入 ch 字符串
        sb1.insert(1,"Hello world!!!");     //在任意前位置插入字符System.out.println(sb1);

在这里插入图片描述

  1. indexOf(char ch)
    查找字符 ch 第一次出现的位置
        int d = sb1.indexOf("Hello");	//查找第一次 Hello 出现的位置System.out.println(sb1);System.out.println(d);

在这里插入图片描述

  1. lastIndexOf(char ch)
    获取 ch 最后一次出现的位置
        int e = sb1.lastIndexOf("123");System.out.println(sb1);System.out.println(e);

在这里插入图片描述

  1. deleteChar(0)
    删除指定位置的字符串元素
   System.out.println(sb1.deleteCharAt(0));

在这里插入图片描述

  1. delete(int start,int end)
    删除指定范围的元素
        System.out.println(sb1.delete(0,6));

在这里插入图片描述

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

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

到此, 文章结束, 如有不足, 欢迎提出. 如有错误, 欢迎指正!


http://www.ppmy.cn/news/7619.html

相关文章

前端性能优化(一):指标和工具

目录 一&#xff1a;性能指标和优化目标 1.1.网络加载性能 1.2.用户交互体验 二&#xff1a;RAIL测量模型 2.1.Response&#xff08;响应&#xff09;: 处理事件应在在50ms内完成 2.2.Animation&#xff08;动画&#xff09;: 每10ms产生一帧 2.3.Idle&#xff08;空闲&…

阿里云-数据仓库-全链路大数据开发治理平台-DataWorks的数字世界

一、前言 上文我讲到 阿里云-数据仓库-数据分析开发神器-ODPS &#xff0c;今天我带领大家一起走进神器的成长环境及它的数据世界。 二、 DataWorks是什么 DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎&#xff0c;为数据仓库、数据湖、湖仓一体等…

亚马逊---人工智能入门---学习笔记

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;蓝桥杯算法笔记 &#x1f4ac;总结&#xff1a;希望你看完之…

2023北京老博会,CBIAIE第十届中国国际老年产业博览会

积极响应发展政策&#xff0c;顺应市场发展需求&#xff0c;2023第十届中国国际老年产业博览会8月再举办&#xff1b; 无限发展前景的老年产业&#xff1a;近年来&#xff0c;随着我国老龄化社会的持续加速&#xff0c;使得我国养老问题形势严峻&#xff1b;截止2022年11月&am…

Linux学习笔记——Linux实用操作(二)

04、Linux实用操作 4.6、IP地址、主机名 4.6.1、IP地址、主机名 学习目标&#xff1a; 掌握什么是IP地址掌握什么是主机名掌握什么是域名解析 4.6.1.1、IP地址 1、每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯。 IP地址主要有2个版本&#xff0…

7的2022年终总结

7&的2022年终总结 文章目录7&的2022年终总结1、前言2、技术3、生活4、展望未来1、前言 2022年&#xff0c;终究是不平凡的一年。 2022年2月4日&#xff0c;中国农历大年初四&#xff0c;这一天&#xff0c;北京冬奥会将拉开大幕。 2022年3月份&#xff0c;疫情还未结束…

React学习03-基于脚手架的React应用

初始化脚手架 使用 npx 创建 npx create-react-app 项目名使用 npm install 创建 全局安装create-react-app包&#xff1a; npm install -g create-react-app创建脚手架&#xff1a; create-react-app 项目名npm 镜像 执行 create-react-app时&#xff0c;还会自动安装一…

C++音乐系统

一、前言 2022临近尾声&#xff0c;2023即将来临。 过去的一年&#xff0c;我们同努力&#xff0c;我们共欢笑.。 每一次成功都蕴藏着我们辛勤的劳动。 新的一年即将来到&#xff0c;我们不能停滞不前。 与时俱进 拼搏不懈 共创新的辉煌&#xff01; 二、实现步骤 第一&#x…