String类知识

目录

一、String存在意义

二、字符串为何不可变

三、String类常用方法

        1、字符串构造

        2、String对象的比较

        3、字符串查找

        4、转化

        (1)数值和字符转化

        (2)大小写转换

        (3)字符串转数组

        (4)格式化

        5、字符串替换

        6、字符串拆分

        7、字符串截取

        8、字符串修改

        9、其他操作方法

四、StringBuilder和StringBuffer的使用和方法介绍

五、StringBuilder和StringBuffer的不同


一、String存在意义

        在c语言中我们以及接触到了字符串,但是表示字符串的方式只能是使用字符数组或者是字符指针,而Java面向对象很多时候离不开字符串,为了更好的实现面向对象的思想,Java提供了String类,这就是String类存在的意义

二、字符串为何不可变

        我们去写一个String类的时候,我们发现String类里面的内容不能直接被修改,为什么不能修改呢,我们先打开一下String类里面的构造:

         第一个final是不能被继承我们理解,那么第二个为啥不是字符串被修改的主要原因呢,上代码:

  public static void main(String[] args) {
        final char[] str={'1','2','3'};
        str[0]='4';
        System.out.println(str);
    }

        打印出来的结果是:

        为何会这样呢?主要得益于final修饰的一般是地址不能变,而修改数组里面的东西,地址是不会变化的,所以就算被fianl修饰,char[]里面的内容还是可以被修改。 而private私有化封装才是字符串不能被修改的本质原因。

三、String类常用方法

        1、字符串构造

         对于字符串的构造,常用的就三种构造方法——常量串构造,使用newString对象构造,使用字符数组构造,用代码来写如下:

 public static void main(String[] args) {
        //使用常量串构造
        String s1="wqe";
        //使用newString对象
        String s2=new String("wqer");
        //使用字符数组进行构造
        char[] str={'w','q','e'};
        String s3=new String(s2);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }

        打印结果如下:

        String类还提供了很多中字符串构造方法,而常用的就这三种

        2、String对象的比较

        一共有三种比较,第一种是==,第二种是equals方法比较,第三种是compareTo方法比较;

        对于==符号比较,比较的就是地址,equals方法比较的是里面的值是否相等,而且还是boolean类型,而compareTo方法是按顺序比较里面的字符串,相等则继续比较下一个,不相等则返回差值,值得注意的是,compareTo方法是按照ASC码里面的值进行比较,而对于相同的长度的字符串,返回-1或者1(根据前后俩个字符串哪个更长,前者减去后者)。  


public static void main(String[] args) {
        String q1="abc";
        String q2="abcA";
        String q3="abZ";
        String q4="abc";
        String q5=q1;
        //==比较地址
        System.out.println(q1 == q5);
        System.out.println(q1 == q3);
        System.out.println(q1 == q2);
        System.out.println("===========");
        //equals方法比较值
        System.out.println(q1.equals(q5));
        System.out.println(q1.equals(q3));
        System.out.println(q1.equals(q2));
        //compareTo桉顺序比较,不同返回差值,如果字符串长度不一样,而返回-1或者1
        System.out.println("===========");
        System.out.println(q1.compareTo(q4));
        System.out.println(q2.compareTo(q1));
        System.out.println(q1.compareTo(q3));
}

        而打印出来的结果是:

         总的来说,String类的比较方式还是挺常用的,可以根据自己需要去做出不同的比较方式。

        3、字符串查找

        字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法,如下图:

        

方法功能
char charAt(int index)返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException
int indexOf(int ch)返回ch第一次出现的位置,没有返回-1
int index(int ch,int fromIndex)从fromindex位置开始找ch第一次出现的位置,没有返回-1
int indexOf(String str)返回str第一次出现的位置,没有返回-1
'int indexOf(String str,int fromIndex)从fromIndex位置开始找str第一次出现的位置,没有返回-1
int lastIndexOf(int ch)从后往前找,返回ch第一次出现的位置,没有返回-1
int lastIndexOf(int ch,int fromIndex)从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1
int lastIndexOf(String str)从后往前找,返回str第一次出现的位置,没有返回-1
int lastIndexOf(String str,int fromIndex)从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1

        

 public static void main(String[] args) {
        String s="abcabcabcqwertyuiopz";
        System.out.println(s.charAt(3));//a
        System.out.println(s.indexOf('a'));//0
        System.out.println(s.indexOf('a', 3));//3
        System.out.println(s.indexOf("cab"));//2
        System.out.println(s.indexOf("cab", 5));//5
        System.out.println(s.lastIndexOf(3));//-1(没有找到)
        System.out.println(s.lastIndexOf("a", 10));//6
        System.out.println(s.lastIndexOf("cabc"));//5
        System.out.println(s.lastIndexOf("cabc",7));//5
    }

        主要查找的方法就是这些,索引,向前往后查找和从后往前查找,查找字符串或者字符,第二个参数就是从第几个开始查找。

        4、转化

        (1)数值和字符转化

        数值和字符转化可以分为数值转化为字符串,也可以是字符串转化为数值,以代码为例:

        

  public static void main(String[] args) {
        //数字转字符串(通过String.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);
        System.out.println("============");
        int data1=Integer.parseInt("1234");
        int data2=Integer.parseInt("12534");
        System.out.println(data1);
        System.out.println(data2);
    }

        打印结果如下:

        .value()是转换为字符串的用法,而包装类.转换类型()是字符串转换为数值的方法。

        (2)大小写转换

        大小写转化主要用到了toUpperCasetoLowerCase的方法,toUpperCase()是将小写转换为大写的方法,toLowerCase()是将大写转换为小写的方法,如下:

        

 public static void main(String[] args) {
        String q1="qwe";
        String q2="QWE";
        System.out.println(q1.toUpperCase());
        System.out.println(q1.toLowerCase());
    }

        打印结果为:

 

        (3)字符串转数组

        字符串转为数组使用到toCharArray()方法,,然后数组转换为字符串也可以用到new String()方法,代码如下:

        

 public static void main(String[] args) {
        String w1="qwerty";
        //字符串转数组
        char[] ch= w1.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            System.out.println(ch[i]);
        }
        System.out.println();
        //数组转字符串
        String s2=new String(ch);
        System.out.println(s2);
    }

        打印结果如下:

        (4)格式化

        格式化方法用到format方法,代码如下:

        

  public static void main(String[] args) {
        String e1=String.format("%d-%d-%d",2019,9,14);
        System.out.println(e1);
    }

         

        格式化主要是按照里面的格式打印,对于设置日期这些有很大帮助。

四、StringBuilder和StringBuffer的使用和方法介绍

        StringBuilder和StringBuffer的使用需要创建对象,不像String类那样可以直接String s="q",

需要new一个对象,代码如下:

 public static void main(String[] args) {
        //StringBuffer sbd="qwe";//会报错
        StringBuilder sbd=new StringBuilder("wqwq");
        StringBuffer sbf=new StringBuffer("asd");

        System.out.println(sbd);
        System.out.println(sbf);
    }

        打印出来结果是:

        

        那么它们有什么不同呢?方法上有很大不同,我列出一个表格:

方法说明
StringBuff append(String str)在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量
char charAt(int index)获取index位置的字符
int length()获取字符串的长度
int capacity()获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity)扩容
void setCharAt(int index,char ch)将index位置的字符设置为ch
int indexOf(String str)返回str第一次出现的位置
int indexOf(String str,int fromIndex)从fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str)返回最后一次出现str的位置
int lastIndexOf(String str,int fromIndex)从fromIndex位置开始找str最后一次出现的位置
StringBuffer insert(int offset,String str)

在offset位置插入:八种基本类型&String类型&

Object类型数据

StringBufferdeleteCharAt(int index)删除index位置字符
StringBuffer delete(int start, int end)删除[start,end)区间内的字符
 StringBuffer replace(int start, int end, String str)将[start,end)位置的字符替换为str
tring substring(int start)从start开始一直到末尾的字符以String的方式返回
String substring(int start, int end)将[start,end)将[start,end)范围内的字符以String的方式返回
StringBuffer reverse()反转字符串
ring toString()将所有字符按照String的方式返回

五、StringBuilder和StringBuffer的不同

        StringBuilder更适合于单线程,StringBuffer更适合多线程,为什么呢,我们打开这俩个的里面内容来看:

        这个是StringBuffer的,它的里面有锁,更适合多线程,而StringBuilder里面是没有锁的,更适合单线程,但速度更快。

 

 

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

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

相关文章

《精通ChatGPT:从入门到大师的Prompt指南》大纲目录

第一部分&#xff1a;入门指南 第1章&#xff1a;认识ChatGPT 1.1 ChatGPT是什么 1.2 ChatGPT的应用领域 1.3 为什么需要了解Prompt 第2章&#xff1a;Prompt的基本概念 2.1 什么是Prompt 2.2 好Prompt的特征 2.3 常见的Prompt类型 第二部分&#xff1a;Prompt设计技巧 第…

【Linux取经路】守护进程

文章目录 一、前台进程和后台进程二、Linux 的进程间关系三、setsid——将当前进程设置为守护进程四、daemon——设置为守护进程五、结语 一、前台进程和后台进程 Linux 中每一次用户登录都是一个 session&#xff0c;一个 session 中只能有一个前台进程在运行&#xff0c;键盘…

【Linux】进程切换环境变量

目录 一.进程切换 1.进程特性 2.进程切换 1.进程切换的现象 2.如何实现 3.现实例子 2.环境变量 一.基本概念 二.常见环境变量 三.查询常见环境变量的方法 四.和环境变量相关的命令 五.环境变量表的组织方式 六.使用系统调用接口方式查询环境变量 1.getenv 2.反思 …

高校运维赛 2024 pyssrf

没有环境,简单过一遍思路吧 考点: pickle反序列化urllib库注入redis缓存 from flask import Flask,request from redis import Redis import hashlib import pickle import base64 import urllib app Flask(__name__) redis Redis(host127.0.0.1, port6379)def get_result(u…

超越预期:Containerd 如何成为 Kubernetes 的首选容器运行时

> 作者&#xff1a;尹珉&#xff0c;KubeSphere Ambassado&#xff0c;rKubeSphere Contributor&#xff0c;KubeSphere 社区用户委员会杭州站站长。 踏上 Containerd 技术之旅 容器技术已经成为现代软件开发和部署的核心工具。通过容器&#xff0c;开发者可以创建轻量级…

【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法

文章目录 前言 背景介绍 初始代码 优化代码 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 背景介绍 在一个嵌入式软件开发项目中&#xff0c;需要设计一个ECU节点的CAN网路数据发送&#xff0c;需求是在500k的通信波特率上&a…

Python logging 模块详解

Python 的 logging 模块提供了一个强大而灵活的日志系统。它是 Python 标准库的一部分&#xff0c;因此可以在任何 Python 程序中使用。logging 模块提供了许多有用的功能&#xff0c;包括日志消息的级别设置、日志消息的格式设置、将日志消息输出到不同的目标&#xff0c;以及…

Mysql8安装教程与配置(超详细图文)

MySQL 8.0 是 MySQL 数据库的一个重大更新版本&#xff0c;它引入了许多新特性和改进&#xff0c;旨在提高性能、安全性和易用性。 1.下载MySQL 安装包 注&#xff1a;本文使用的是压缩版进行安装。 &#xff08;1&#xff09;从网盘下载安装文件 点击此处直接下载 &#…

Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)

文章目录 Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41)1.开机动画的启动过程概述2.为什么设置了属性之后就会播放&#xff1f; Android 开机动画的启动过程BootAnimation(基于Android10.0.0-r41) 1.开机动画的启动过程概述 下面就是BootAnimation的重要部…

KIBANA的安装教程(超详细)

前言 Kibana 是一个开源的基于浏览器的可视化工具&#xff0c;主要用于分析和展示存储在 Elasticsearch 索引中的数据。它允许用户通过各种图表、地图和其他可视化形式来探索和理解大量数据。Kibana 与 Elasticsearch 和 Logstash 紧密集成&#xff0c;共同构成了所谓的 ELK 堆…

【论文阅读】SELF-RAG,让模型决策和反思检索

关于LLM何时使用RAG的问题&#xff0c;原本是阅读了关于ADAPT-LLM模型的那篇论文&#xff0c;被问到与SELF-RAG有何区别。所以&#xff0c;大概看了一下SELF-RAG这篇论文&#xff0c;确实很像&#xff0c;这些基于LLM针对下游任务的模型架构和方法&#xff0c;本来就很像。不过…

[AVL数四种旋转详细图解]

文章目录 一.右单旋二. 左单旋三. 右左双旋四. 左右双旋 一.右单旋 新节点插入较高左子树的左侧—左左&#xff1a;右单旋 由于在较高左子树的左侧插入一个节点后&#xff0c;左边插入导致30的平衡因子更新为-1&#xff0c;而60平衡因子更新为-2&#xff0c;此时不平衡&…

oracle数据库通过impdp导入数据时提示,ORA-31684:对象类型用户xxx已存在,和ORA-39151:表xxx存在的解决办法

前提条件&#xff1a;首先备份原数据库中此用户对应的schemas 比如名为cams_wf的schemas 以便出了问题后还可以恢复原数据。 解决办法一、 通过命令或者数据库管理工具删除掉此schemas下的所有表&#xff0c;然后在impdp中加入ignorey 来忽略ORA-31684&#xff1a;对象类型用…

Signac|成年小鼠大脑 单细胞ATAC分析(1)

引言 在本教程中&#xff0c;我们将探讨由10x Genomics公司提供的成年小鼠大脑细胞的单细胞ATAC-seq数据集。本教程中使用的所有相关文件均可在10x Genomics官方网站上获取。 本教程复现了之前在人类外周血单核细胞&#xff08;PBMC&#xff09;的Signac入门教程中执行的命令。…

Spring运维之boot项目bean属性的绑定读取与校验

第三方bean属性的绑定 先写一个实体类 我们在配置yml文件里写了属性值 能一一对应 我们用注解让其对应 我们在启动类里面测试 我们首先拿到容器对象 再拿到bean 打印bean 发现我们的容器获取到的bean bean的属性与配置里面的属性一一对应 这时候提出一个问题 这是我们自定义…

C++设计模式-外观模式,游戏引擎管理多个子系统,反汇编

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 30. 外观模式 为子系统定义一组统一的接口&#xff0c;这个高级接口会让子系统更容易被使用。应用&#xff1a;如在游戏开发中&#xff0c;游戏引擎包含多个子系统&#xff0c;如物理、渲染、粒子、UI、音频等。可以使用外观…

组态软件远程监控

在信息化、智能化的浪潮下&#xff0c;远程监控技术已经渗透到工业生产的各个领域。HiWoo Cloud平台凭借其卓越的组态软件远程监控功能&#xff0c;为企业提供了高效、智能的监控解决方案&#xff0c;推动了工业生产的数字化转型。本文将详细介绍HiWoo Cloud平台在组态软件远程…

【机器学习】GLM4-9B-Chat大模型/GLM-4V-9B多模态大模型概述、原理及推理实战

​​​​​​​ 目录 一、引言 二、模型简介 2.1 GLM4-9B 模型概述 2.2 GLM4-9B 模型架构 三、模型推理 3.1 GLM4-9B-Chat 语言模型 3.1.1 model.generate 3.1.2 model.chat 3.2 GLM-4V-9B 多模态模型 3.2.1 多模态模型概述 3.2.2 多模态模型实践 四、总结 一、引言…

cocos入门4:项目目录结构

Cocos Creator 项目结构教程 Cocos Creator 是一个功能强大的游戏开发工具&#xff0c;它为开发者提供了直观易用的界面和强大的功能来快速创建游戏。在使用 Cocos Creator 开发游戏时&#xff0c;合理地组织项目结构对于项目的可维护性和扩展性至关重要。以下是一个关于如何设…

49.线程池的关闭方法

shutdown方法 1.线程池状态变为shutdown 2.不会接收新任务 3.已提交的任务会执行完 4.此方法不会阻塞调用线程执行 ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(() -> {log.debug("task1 running");try {TimeUnit…