对Java中String类的解释

news2024/10/6 22:25:56

文章目录

  • 一、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);   //false
        System.out.println(s1 == s3);   //false
        System.out.println(s1 == s4);   //true

在这里插入图片描述

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

如:

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

        System.out.println(s1 == s2);   //false
        System.out.println(s1 == s3);   //true
        System.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 中的元素进行比较打印 true
        System.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 输出 -24
        System.out.println(s1.compareTo(s4));   //字符串元素相等输出 0
        System.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);    //插入123
        System.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-->H
        System.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.coloradmin.cn/o/126562.html

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

相关文章

[年终总结] 2023,希望一切都能够好起来

0. 引言 2022年&#xff0c;依旧是一个特殊的年份&#xff0c;从前年开始&#xff0c;我就开始撰写年终总结&#xff0c;感兴趣的大家可以看一看2020年终总结和2021年年终总结。 一年比一年过的快速&#xff0c;我也感觉到一年比一年过的更加珍惜。曾经以为自己尚且年轻&…

linux /dev/mapper/rhel-root分区扩容

命令查看linux内存占用情况 /dev/mapper/rhel-root分区已满&#xff0c;主要是东西太多&#xff0c;改善了也删了&#xff0c;但是还是不够用。在扩容之前在首先针对虚拟机硬盘进行扩展 接下来就是在linux上操作了 1、输入fdisk -l 这里显示我已经有了三个分区&#xff0c;sd…

ArcGIS基础实验操作100例--实验9线要素的延伸与裁剪

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验9 线要素的延伸与裁剪 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

qinglong-青龙面板部署

背景 之前服务器部署过 jd自动签到、刷豆的脚本&#xff0c;感觉还可以&#xff0c;薅羊毛每天1-2米左右&#xff0c;能把服务器成本薅回来&#xff0c;不过缺点不好管理&#xff0c;后面很久没人维护就凉了。最近了解到青龙面板能够很方便的维护这种脚本。所以部署了一下。 …

SQL学习笔记-聚合函数部分

鉴于自己最近在做后端开发的工作时&#xff0c;发现自己的SQL能力实在太差&#xff0c;开始学习SQL语句基础&#xff0c;学习过程中在本博客进行笔记记录&#xff0c;课程参考&#xff1a;SQL课程 聚合函数是一系列SQL内置的方法&#xff0c;能够完成一些非常使用的功能&#…

java输入语句怎么写

壹哥在前面给大家讲过&#xff0c;Java中给咱们提供了有三个标准的“流”&#xff0c;他们被统称为standard streams。除了负责输出的流之外&#xff0c;还有一个负责输入的标准流&#xff0c;Java中对应的API是System.in。 与标准输出相比&#xff0c;标准输入则复杂的多。尤…

OpenHarmony#深入浅出学习eTs/ArkUI#(一)模拟器/真机环境搭建

本项目的Gitee仓地址&#xff1a;深入浅出eTs学习: 带大家深入浅出学习eTs (gitee.com) &#xff08;之前有些意外&#xff0c;数据丢失了&#xff0c;现在重新发&#xff0c;且不参与任何活动&#xff0c;在第一篇说明一下&#xff0c;之后就不再说明了&#xff09; 一、下载…

2022 年 11 种最佳移动自动化测试工具

移动应用程序开发正在以前所未有的速度增长&#xff0c;并且相应地需要使用正确的移动测试策略执行彻底的测试。这些策略主要涉及使用各种移动自动化测试工具。 移动测试工具可帮助企业自动化其应用程序测试&#xff0c;并减少额外的成本、时间和人为错误的机会。我们生活在一个…

用QT实现一个模型交互的网络请求

最近&#xff0c;我接收到了一个项目需求&#xff0c;具体内容如下&#xff1a; 具体要求&#xff1a; 1.交付给我程序的源代码即可&#xff0c;因为我要集成到我的大软件中&#xff0c;要求采用C和QT开发&#xff1b; 2.程序首先检测当前用户环境有没有联网&#xff0c;如果没…

linux的权限

前言 学习权限我们先理解一下xshell 我们使用Xshell的存在的意义 帮助进行命令行传递和返回结构保护操作系统 linux的权限 (1)权限的概念 限制人的&#xff0c;访问的对象可能没有这种“属性” 权限&#xff1a;一件事情是否运行被谁“做” 权限 人 事物属性 (2)linux的上…

【vector的各个begin迭代器详解】

前言 本文是熊猫练习stl一段时间之后&#xff0c;对vector容器的各种迭代器产生了很大的好奇心&#xff0c;于是对它们进行了以下探究。 从图中我们可以知道&#xff0c;vector一个有四组不同的迭代器&#xff0c; 其中&#xff0c;字符 ‘c’ 是 const 常量的意思&#xff0c…

严蔚敏 《数据结构C语言版》读书笔记

目录 第一章 线性表 顺序表 Sequence Table 带头双向循环链表 Linked List 第二章 栈和队列 栈 Stack &#xff08;顺序存储&#xff09; 检查括号是否匹配 队列 Queue &#xff08;链式存储&#xff09; 循环队列 Circle Queue 第三章 串 模拟实现string.h库函数 第…

2 面向对象编程

面向对象编程(OOP) **面向对象的程序(oop)**是由对象组成的&#xff0c; 每个对象包含对用户公开的特定功能部分和隐藏的实现部分。 传统的结构化程序设计通过**设计一系列的过程&#xff08;即算法&#xff09;**来求解问题。一旦确定了这些过程&#xff0c; 就要开始考虑存…

设备通过发放批量自注册场景体验【玩转华为云】

创建实例 首先&#xff0c;根据提示创建实例 实例名称实例描述 创建成功 可以看到&#xff0c;当前实例已经在运行中了 设备发放 在左侧列表中点击“设备发放” 功能简介 您可以通过“设备发放”轻松管理跨多区域&#xff0c;海量设备的发放工作&#xff0c;实现单点发放管…

.Net WebApi— SwaggerUI配置

最近新公司用了特别老的技术【Web 服务 .asmx文件 做WebService服务】&#xff0c;而WebApi早就流行四五年了&#xff1b; 实在太过于简陋&#xff0c;关键其他系统对接的同事&#xff0c;经常说对接不上&#xff0c;如果接口过多确实不方便接口管理&#xff0c;所以最终决定重…

基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备

文章目录一、前言二、系列文章三、解析&#xff1a;完整源码1. helloworld_amlogic_char_driver.c2. Makefile四、编译执行4.1 编译4.2 执行&#xff08;1&#xff09;部署&#xff08;2&#xff09;加载ko文件&#xff08;3&#xff09;查看结果&#xff08;4&#xff09;是否…

android 皮肤包换肤之Resources加载(一)

Android 换肤之资源(Resources)加载(一) 本系列计划3篇: Android 换肤之资源(Resources)加载(一) — 本篇setContentView() / LayoutInflater源码分析(二)换肤框架搭建(三) 看完本篇你可以学会什么? Resources在什么时候被解析并加载的 Application#ResourcesActivity#Reso…

【Python黑帽子】——搭建TCP端口扫描器

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

计算1到n的和(不用循环且逐步限制条件)

目录 一、题目简单描述 二、递归实现 1、if…else… 2、三目运算符 &#xff1f;&#xff1a; 3、逻辑与操作符 && 三、公式实现 四、C调用构造函数累加法 注&#xff1a;满足题目要求的解法有递归实现的第三种、公式实现、C调用构造函数累加法三种方法、 一、题目简…

死锁的成因以及解决方案

&#x1f388;专栏链接:多线程相关知识详解 目录 一.什么是死锁以及死锁的成因 Ⅰ.一个线程一把锁 Ⅱ.两个线程两把锁 Ⅲ.多个线程多把锁 二.死锁的解决方案 一.什么是死锁以及死锁的成因 死锁是一个线程加上锁了之后,解不开了 在多线程编程中&#xff0c;我们为了防止多…