String讲解
文章目录
- String类的重要性
- 常用的方法
- 常用的构造方法
- String类的比较
- 字符串的查找
- 转化
- 数字转化为字符串
- 字符串转数字
- 字符串替换
- 字符串的不可变性
- 字符串拆分
- 字符串截取
- 字符串修改
- StringBuilder和StringBuffer
String类的重要性
在c/c++的学习中我们接触到了字符串,但是在c中其实并没有字符串类型我们写的字符串是char arr[]这样子,其实这个严格来说应该叫字符指针因此其实他并不是字符串类型,而想要操作字符串需要用到库函数或者自己写的函数这并不符合面向对象的思想因此java中创造了String类。
常用的方法
常用的构造方法
常用的构造方法主要有三个
public static void main(){String arr="hello";char[] a={'h','e','l','l','o'};String arr2=new String(a);Strin arr3=new String(arr);
}
常见的基本上就是以上三种第一种是直接使用等号,第二种则是使用字符数组,第三种直接利用已有的String对象new一个拷贝一个新的String对象。
此外要主要,String是一种引用类型他的内部存储的是地址而不是字符串。这一点我们怎么证明呢?请看下面的String类的比较
String类的比较
刚刚我们提到String类是引用类型,它内部其实存储的是内存地址我们如何证明这个结论呢?我们来看看下面一段代码
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {String str=new String("abcd");String str2=new String("abcd");System.out.println((str==str2));}
}
这段代码打印出来的内容应该是什么呢?我们分情况来讨论。
首先这个代码都是new一个相同内容的对象,因此我们可以知道这两个对象内部存储的内容是相同的但是地址一定不同因此如果说String对象内部是直接存储的内容的话用等于判断结果应该是true否则如果是地址的话应该是false

而以上代码的最终结果也是false这其实就已经说明了他的内部存储的是地址而并非内容。而String内部的变量的关系如图

注意这里的内部实际关系中我们是可以看到一个String对象其内部还有一个value对象这个value对象指向内容。这里我们可以看一下源代码
可是我们在实际比较的过程中肯定是不希望比较的是地址而是希望以内容作为比较的,那么这个问题该怎么解决呢?其实String‘类的内部重写了equals方法我们在比较的时候其实使用这个方法进行比较的。
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {String str=new String("abcd");String str2=new String("abcd");System.out.println((str.equals(str2)));}
}

而当我们使用equals进行比较时就可以发现最后的结果时正确的了,但是我们会发现这样一个事情那就是当一个char[]类型和一个String类型的内容相同时返回的确实false这是为什么呢?
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {String str=new String("abcd");String str2=new String("abcd");char[] arr={'a','b','c','d'};System.out.println((str.equals(arr)));}
}

原因就要从equals的底层说起了我们来看一下equals的底层代码

我们看一下equals的底层就会发现这里呢会有两个判断首先第一个就是this==anObject以及anobject instanceof String这里是什么意思呢?首先第一个if就是比较传进来的这个参数是不是自己本身那么这里我们传入的是一个char[]很明显第一个if进不去那么第二个if什么意思呢?第二个if的意思就是传进来的对象是不是String类对象很明显也不是那么最终返回的肯定就是false了
字符串的查找
字符串的查找,String中我们想要单独的拿出来一个字符无法像char[]那般直接进行,[下标的方式]那么我们该如何呢?字符串的查找String类用了一系列的方法其中最重要的一个是charAt()方法用法如下
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {String str=new String("abcd");for(int i=0;i<str.length();i++){System.out.println(str.charAt(i));}}
}
他的使用和下标的使用是一样的。
转化
数字转化为字符串
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {String str=new String("abcd");String str2=String.valueOf(10010);System.out.println(str2);}
}

字符串转数字
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd");String str2=String.valueOf(10010);int a=Integer.parseInt(str2);System.out.println(a);//System.out.println(str2);}
}
字符串替换
使用一个新的字符串替换掉原来的字符串,这里我们要知道一个概念就是字符串的不可变性。
字符串的不可变性
字符串的不可变性是指字符串在创建之后字符串的内容事不能在被改变的,换句话说字符串一旦呗创建他的内容就不能在被改变了任何一个尝试修改字符串的手段本质上来说都是用一个新的字符串替换 掉原有的字符串。

由此我们再来看替换字符串的两个函数我们也应当能够明白字符串的不可变性是的所有的替换其实都是不改变原有内容而是重新创建一个字符串
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd");String str2=new String("abcd");//int a=Integer.parseInt(str2);//System.out.println(a);//System.out.println(str2);String str3=str2.replaceAll("a","p");System.out.println(str2);System.out.println(str3);}
}

因此我们可以看出来这个字符串中str2的内容是没有被改变的只是重新返回了一个字符串并赋值给了str3
字符串拆分
字符串的拆分是指将一个字符串中的某个字符作为分割字符从而将一个字符串拆分为多个子串。拆分的方法是split。我给大家演示一下
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd");String str2="https:editor.csdn.netmd?not_checkout=1&spm=1001.2014.3001.4503&articleId=136138248";String[] str3=str2.split("\\.");System.out.println(str2);for(String s:str3){System.out.println(s);}}
}
这里是以"."为分割符进行分割的。此外还有别的用法比如说你可以设定拆分几组
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd");String str2="https:editor.csdn.netmd?not_checkout=1&spm=1001.2014.3001.4503&articleId=136138248";String[] str3=str2.split("\\.",2);System.out.println(str2);for(String s:str3){System.out.println(s);}}
}
此外我们还可以多次拆分
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd");String str="zyf=icl,cl=izyf";String[] str2=str.split("\\,");for(int i=0;i<str2.length;i++){String[] str3=str2[i].split("=");System.out.println(str3[0]+" = "+str3[1]);}}
}
字符串截取
字符串截取一般都是用于我们想使用某个区间内的内容,所需要的函数是String substring(int beginIndex)
他的用法如下
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd");String str="zyf=icl,cl=izyf";String str2=str.substring(2);System.out.println(str2);}
}
当只输入一个参数的时候它表示从改下标一直到结尾位置。
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd");String str="zyf=icl,cl=izyf";String str2=str.substring(2,3);System.out.println(str2);}
}
当输入两个参数的时候他表示的是一个左闭右开的区间内容正如实例中会输出f一样表示的是左闭右开
字符串修改
上面我们讲过字符串是不可变的任何对于字符串的修改严格来说都是重新创建了一个对象在进行修改这使得字符串的修改效率非常的慢因此我们一般都是不对字符串的内容做修改的可是在实际开发中肯定是会遇到一些时候是需要对字符串的内容做修改的地方的那么这时候怎么办呢?
我们通常都是借助StringBuilder和StringBuffer
StringBuilder和StringBuffer
在先讲StringBuilder和StringBuffer之前呢我们先说一下来看一下下面这个代码
public class Main {public static void main(String[] args) {//String str=new String("abcd")String str=new String();for(int i=0;i<100;i++){str+=i;}System.out.println(str);}
}
这段代码就很简单就是每一次都在这个字符串后面拼接,那么这个效率低嘛?显而易见很低很低,那么这是为什么呢?因为我们上面说了因为他会创建新的对象那么创建新的对象创建的是什么对象呢?其实是StringBuilder对象,也就是说其实每一次 的改变都会创建一个StringBuilder对象来接受改变的字符串,那么我们如果直接使用StringBuilder实例化出一个对象然后再不断调用append方法效率会不会持续提升呢?很明显是肯定的。
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {public static void main(String[] args) {//String str=new String("abcd")String str=new String();StringBuilder stringBuilder=new StringBuilder();for(int i=0;i<100;i++){stringBuilder.append(i);}str=stringBuilder.toString();System.out.println(str);}
}
因为我们刚刚讲了为什么效率低下?因为总是创建新的对象那如何增高效率呢?很明显直接降低实列化对象的次数就好了,因此我们直接将StringBuilder定义出来并且直接使用StringBuilder去修改然后将StringBuilder赋值给String即可。
那么StringBuffer是什么呢
StringBuilder:
StringBuilder 是在 Java 5 中引入的,它是非线程安全的。
因为不需要考虑线程安全问题,所以 StringBuilder 的性能比 StringBuffer 更高。
StringBuilder 的方法不是线程安全的,如果在多线程环境中使用,可能会导致数据不一致或者其他问题。
StringBuffer:
StringBuffer 是在 Java 1.0 中引入的,它是线程安全的。
由于需要考虑线程安全性,StringBuffer 的性能通常比 StringBuilder 差一些。
StringBuffer 的方法是线程安全的,可以在多线程环境中安全地使用。
在大多数情况下,如果不需要考虑线程安全性,推荐使用 StringBuilder,因为它的性能更好。只有在需要在多线程环境中安全地操作字符串时才使用 StringBuffer。
学会向爱人妥协才能收获幸福的争吵少的生活,你和爱人是要一起面对生活的而不是你们在互相较劲。
相关文章:
String讲解
文章目录 String类的重要性常用的方法常用的构造方法String类的比较字符串的查找转化数字转化为字符串字符串转数字 字符串替换字符串的不可变性 字符串拆分字符串截取字符串修改 StringBuilder和StringBuffer String类的重要性 在c/c的学习中我们接触到了字符串,但…...
人群异常聚集监测系统-聚众行为检测与识别算法---豌豆云
聚众识别系统对指定区域进行实时监测,当监测到人群大量聚集、达到设置上限时,立即告警及时疏散。 旅游业作为国民经济战略性支柱产业,随着客流量不断增加,旅游景区和一些旅游城市的管理和服务面临着前所未有的挑战: …...
多模态基础---BERT
1. BERT简介 BERT用于将一个输入的句子转换为word_embedding,本质上是多个Transformer的Encoder堆叠在一起。 其中单个Transformer Encoder结构如下: BERT-Base采用了12个Transformer Encoder。 BERT-large采用了24个Transformer Encoder。 2. BERT的…...
图表示学习 Graph Representation Learning chapter2 背景知识和传统方法
图表示学习 Graph Representation Learning chapter2 背景知识和传统方法 2.1 图统计和核方法2.1.1 节点层次的统计和特征节点的度 节点中心度聚类系数Closed Triangles, Ego Graphs, and Motifs 图层次的特征和图的核节点袋Weisfieler–Lehman核Graphlets和基于路径的方法 邻域…...
OpenMVG(计算两个球形图像之间的相对姿态、细化重建效果)
目录 1 Bundle Adjustment(细化重建效果) 2 计算两个球形图像之间的相对姿态 1 Bundle Adjustment(细化重建效果) 数...
【QT+QGIS跨平台编译】之三十四:【Pixman+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
文章目录 一、Pixman介绍二、文件下载三、文件分析四、pro文件五、编译实践一、Pixman介绍 Pixman是一款开源的软件库,提供了高质量的像素级图形处理功能。它主要用于在图形渲染、合成和转换方面进行优化,可以帮助开发人员在应用程序中实现高效的图形处理。 Pixman的主要特…...
2.17学习总结
tarjan 【模板】缩点https://www.luogu.com.cn/problem/P3387 题目描述 给定一个 �n 个点 �m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。 允许多次经过一条边或者…...
Unity类银河恶魔城学习记录7-7 P73 Setting sword type源代码
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Col…...
安卓版本与鸿蒙不再兼容,鸿蒙开发工程师招疯抢
最近,互联网大厂纷纷开始急招华为鸿蒙开发工程师。这是一个新的信号。在Android和iOS长期霸占市场的今天,鸿蒙的崛起无疑为整个行业带来了巨大的震动。 2023年11月10日,网易更新了高级/资深Android开发工程师岗位,职位要求参与云音…...
《白话C++》第9章 泛型,Page842~844 9.4.2 AutoPtr
源起: C编程中,最容易出的问题之一,就是内存泄露,而new一个对象,却忘了delete它,则是造成内存泄露的主要原因之一 例子一: void foo() {XXXObject* xo new XXXObject;if(!xo->DoSomethin…...
服务流控(Sentinel)
引入依赖 <!-- 必须的 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><!-- sentinel 核心库 --> <dependency><groupId>com.ali…...
点亮代码之灯,程序员的夜与电脑
在科技的海洋里,程序员是那些驾驶着代码船只,穿梭于虚拟世界的探险家。他们手中的键盘是航行的舵,而那台始终不愿关闭的电脑,便是他们眼中永不熄灭的灯塔。有人说,程序员不喜欢关电脑,这究竟是为什么呢&…...
ClickHouse--07--Integration 系列表引擎
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Integration 系列表引擎1 HDFS1.1 语法1.2 示例: 2 MySQL2.1 语法2.2 示例: 3 Kafka3.1 语法3.2 示例:3.3 数据持久化方法 Integ…...
前端架构: 脚手架框架之yargs的11种基础核心特性的应用教程
脚手架框架之yargs的基础核心特性与应用 1 )概述 yargs 是脚手架当中使用量非常大的一个框架进入它的npm官网: https://www.npmjs.com/package/yargs 目前版本: 17.7.2Weekly Downloads: 71,574,188 (动态数据)最近更新:last month (github)说明这是一个…...
MySQL性能调优篇(6)-主从复制的配置与管理
MySQL数据库主从复制是一种常用的数据复制和高可用性解决方案。它允许将一个MySQL主服务器上的数据自动复制到多个从服务器上,从而提供了数据冗余备份、读写分离等优势。本文将详细介绍MySQL数据库主从复制的配置与管理。 1. 原理概述 MySQL主从复制是基于二进制日…...
Linux第49步_移植ST公司的linux内核第1步_获取linux源码
已知ST公司的linux源码路径: /home/zgq/linux/atk-mp1/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0 1、创建“my_linux”目录 打开第1个终端 输入“ls回车” 输入“cd linux/回车”,切换…...
怎样学习Windows下命令行编写
第一:Windows下命令行指的是cmd和powershell命令行编写 第二:必须要用好help或/?命令,这个命令是最基本的也是最常用的命令列表和语法查看命令 第三:cmd命令使用help查看命令列表或“一串带参数的命令 /?"(不…...
数据结构第十六天(二叉树层序遍历/广度优先搜索(BFS)/队列使用)
目录 前言 概述 接口 源码 测试函数 运行结果 往期精彩内容 前言 从前的日色变得慢,车,马,邮件都慢,一生,只够爱一个人。 概述 二叉树的层序遍历可以使用广度优先搜索(BFS)来实现。具体步骤如下&…...
6.s081 学习实验记录(八)Networking
文章目录 network driver network driver //TODO...
图解贝塞尔曲线生成原理
贝塞尔曲线是一种在计算机图形学中广泛使用的参数曲线,主要用于二维图形应用程序中。它是由法国工程师皮埃尔贝塞尔在1962年提出的,主要用于汽车车身设计。贝塞尔曲线的主要特点是,只要确定了控制点,就可以生成一条平滑的曲线。 …...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
