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年提出的,主要用于汽车车身设计。贝塞尔曲线的主要特点是,只要确定了控制点,就可以生成一条平滑的曲线。 …...

租房招聘|在线租房和招聘平台|基于Springboot的在线租房和招聘平台设计与实现(源码+数据库+文档)
在线租房和招聘平台目录 目录 基于Springboot的在线租房和招聘平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、房屋管理 2、招聘管理 3、平台资讯管理 4、平台资讯类型管理 四、数据库设计 1、实体ER图 六、论文参考 七、最新计算机毕设选题推荐 八、源…...

简单试验:用Excel进行爬虫
文章目录 Excel的版本具体操作实例从网站上爬取工商银行的汇率Excel的版本 office 2016,2019,365这几个版本都可以 具体操作 #mermaid-svg-NlIVMivGoJbdyWW0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NlIVMi…...

SQL 精讲-MySql 常用函数,MySQL语句精讲和举例
FORMAT(数值,保留位数) 四舍五入 SELECT *,FORMAT(score/3,2) from studentROUND(数值,保留位数) 四舍五入 SELECT ROUND(score/3,2) from studentCONCAT(字符串 1,字符串 2) 字符串拼接 SELECT CONCAT(customer_name, (,address,)) from mt_customerLEFT(字符串,长度) 截取…...

nlp中如何数据增强
在自然语言处理(NLP)中,数据增强是一种常用的技术,旨在通过对原始文本进行一系列变换和扩充,生成更多多样化的训练数据。这有助于提高模型的泛化能力和鲁棒性。下面是一些常见的数据增强方法在NLP中的应用:…...

python:xml.etree,用 xmltodict 转换为json数据,生成jstree所需的文件
请参阅:java : pdfbox 读取 PDF文件内书签 或者 python:从PDF中提取目录 请注意:书的目录.txt 编码:UTF-8,推荐用 Notepad 转换编码。 xml 是 python 标准库,在 D:\Python39\Lib\xml\etree pip install …...

C#log4net日志保存到Sqlserver数据库表(16)
要将log4net的日志保存到SQL Server数据库表中,你需要配置log4net使用一个数据库追加器(appender),通常是AdoNetAppender。以下是一个示例配置,展示如何将log4net的日志输出配置为写入SQL Server数据库表。 首先&…...

SpringCloud-Nacos集群搭建
本文详细介绍了如何在SpringCloud环境中搭建Nacos集群,为读者提供了一份清晰而详尽的指南。通过逐步演示每个关键步骤,包括安装、配置以及Nginx的负载均衡设置,读者能够轻松理解并操作整个搭建过程。 一、Nacos集群示意图 Nacos࿰…...

第十五届蓝桥杯全国软件和信息技术专业人才大赛个人赛(软件赛)软件测试组竞赛规则及说明
第十五届蓝桥杯全国软件和信息技术专业人才大赛个人赛 (软件赛)软件测试组竞赛规则及说明 目录...

【算法与数据结构】496、503、LeetCode下一个更大元素I II
文章目录 一、496、下一个更大元素 I二、503、下一个更大元素II三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、496、下一个更大元素 I 思路分析:本题思路和【算法与数据结构】739、LeetCode每日温度类似…...

当AGI遇到人形机器人
为什么人类对人形机器人抱有执念 人形机器人是一种模仿人类外形和行为的机器人,它的研究和开发有着多方面的目的和意义。 人形机器人可以更好地适应人类的环境和工具。人类的生活和工作空间都是根据人的尺寸和动作来设计的,例如门、楼梯、桌椅、开关等…...