JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解

字符串和相关API

java不会字符串即凉一半 学好字符串很重要

API 为应用程序编程接口

获得字符串对象

1.直接赋值

空参构造

string s1=“abc”;

s1 记录的是串池里的地址

2.用new的方式

string s2=new string();

new(在堆内存里开辟空间,再把地址给栈内存里的对象)

equals关键字

equals 比较字符串 返回值为布尔类型

equalslgnoreCase 比较字符串 不过是忽略大小写

boolean result =s1.equals.s2

直接用 == 比较 是比较地址值

string中的字符串方法

1.根据索引返回字符

public char charAt(int index)

2.返回字符串长度

public int length()

3.截取字符串

方法重载

String str="abcdef";
System.out.println(str.substring(1,3));
//截取字符串2,3索引处的字符串
//即为bc
String str="abcdef";
System.out.println(str.substring(1));
//返回字符串1索引往后的字符串
//即为bcdef

4.判断是否包含字符

Scanner sc=new Scanner(System.in);String str="abcdef";System.out.println(str.contains("abc"));

返回布尔类型数值

5.用正则表达式拆分字符串

String str="abc,de,f";String x[]=str.split(",");for(String i:x){System.out.print(i);}

输出 abcdef

6. 返回指定内容在字符串中第一次出现处的索引

如果存在返回索引首索引

如果不存在返回-1

 String str="abcdefc";System.out.println(str.indexOf("de"));

返回值为3

遍历字符串

String str =sc.next();
char c=str.charAt(i) i为字符串的索引
sout(c)

char类型在判断时会转化为int类型 根据ASCII码表

StringBuilder类

查表法 变量只在所属{}内有效

StringBuilder sb=new StringBuilder("abc");
sb.append()		添加元素
sb.reserve()	容量内数据翻转
sb.length()		获得长度
sb.tostring()	转化为字符串
sb.capacity()	容量
sb.length()		长度

StringBuilder

默认容量为16(byte)(字节)

录入ASCII值

扩容

第一次:16*2+2=34

第二次:以实际容量为准

StringBuilder的底层实现可以被看作是一个动态数组。它使用一个可变长度的字符数组来存储字符串内容,并随着需要动态地调整数组的大小。

当创建一个StringBuilder对象时,会初始化一个初始容量为16的字符数组。然后,当我们对StringBuilder对象进行字符串追加、插入、删除等操作时,如果当前字符数组的容量不足以容纳新的字符,StringBuilder会自动进行扩容。

在扩容时,StringBuilder会创建一个新的更大容量的字符数组,并将原有的字符复制到新数组中。这种动态调整数组大小的能力使得StringBuilder类具有动态数组的特性。

通过动态数组,StringBuilder能够高效地处理字符串的修改,避免了频繁创建新的字符串对象带来的性能开销。因此,它适用于需要频繁修改字符串的场景,提供了一种高效的方式来构建和操作字符串。

链式编程

我们在调用一个方法时,不需要用变量接收结果,可以继续调用其他方法

int a=getString().subString(1).replace(“A”,“Q”).length();
截取字符串的索引1到末尾然后替换A为Q在求长度赋值给a
StringBuilder sb =new StringBuilder;result=new StringBuilder().append(str).reverse.to String;

StringJoiner类

StringJoiner sj=new StringJoiner("---");
sj.add("a").add("b")

输出为:a---b

即指定中间间隔符号

开始标记 间隔 开始 结束

字符串的存储原理

直接赋值的字符串会复用字符串常量池中的

new出来的字符串不会复用,而是开辟一个新空间

字符串池

Java字符串池(String Pool)是一个存储字符串的缓存区域,它位于堆内存中,用于提高字符串的使用效率和节约内存空间。

在Java中,字符串属于不可变对象,即一旦创建就不能修改。因此,为了避免重复创建相同的字符串对象,Java提供了字符串池机制,将相同的字符串对象缓存到字符串池中,供后续使用。当需要创建新的字符串对象时,会首先在字符串池中查找是否已存在相同内容的字符串,如果存在则直接返回该对象的引用,否则创建新的字符串对象并放入字符串池中。

Java中的字符串池有两种形式:常量池和运行时常量池。其中,常量池是字节码文件中的一部分,用于存储编译期间产生的字符串常量。而运行时常量池则是在程序运行过程中动态生成的,用于存储运行期间产生的字符串常量。

等于运算符号== 比较的是什么

基本数据类型比较的是数据值

应用数据类型比较的是地址值

字符串拼接

JDK8之前:用StringBuilder类中的append方法

JDK8之后:先预估字符串拼接后总大小,再放入数组产生新的字符串

没有变量:复用串池中的字符串

有变量:创建,浪费内存

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

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

相关文章

数据安全革命:Web3带来的隐私保护创新

随着数字化时代的发展,数据安全和隐私保护问题日益突出。传统的中心化数据存储和管理方式已经无法满足日益增长的数据安全需求,而Web3作为下一代互联网的新兴力量,正以其去中心化、加密安全的特性,引领着一场数据安全革命。本文将…

pyinstaller打包提示“文件所在的卷已被外部更改,因此打开的文件不再有效。”

环境 anaconda : 24.1.2python : 3.7.13pyinstaller : 5.13.0 问题描述 之前使用pyintaller执行spec文件打包都是能成功,今天打包报了“文件所在的卷已被外部更改,因此打开的文件不再有效。”的错误 Traceback (most recent call last):File "C…

想提升,应该学PMP还是NPDP?

NPDP(新产品开发专业认证)是由美国产品开发与管理协会(PDMA)发起的国际认证,涵盖新产品开发的理论、方法和实践,为公司提供全方位的知识体系支持。通过考试获得NPDP认证证书,能够提升个人工作能…

粒子爱心特效||轻松实现浪漫效果||完整代码

关注微信公众号「ClassmateJie」有完整代码以及更多惊喜等待你的发现。 简介/效果展示 你是否曾经想过,在特殊的日子里给你的爱人一个惊喜?或者在朋友的生日派对上,给他们展示一个充满爱意的特效?今天,我要分享一个我…

VUE3-form表单保存附件与基本信息

element-ui代码 <el-dialog :title"上传附件" v-model"dialogAdds.visible" width"500px" append-to-body> <el-form-item label"唯一标识"> <dict-tag v-if"form.groupId" :options"unique_identifica…

性能怪兽!香橙派 Kunpeng Pro 开发板深度测评,带你解锁无限可能

性能怪兽&#xff01;香橙派 Kunpeng Pro 开发板深度测评&#xff0c;带你解锁无限可能 文章目录 性能怪兽&#xff01;香橙派 Kunpeng Pro 开发板深度测评&#xff0c;带你解锁无限可能一、背景二、香橙派 Kunpeng Pro 硬件规格概述三、使用准备与系统安装1️⃣、系统安装步骤…

【C++】浅论(cin和cout)的解锁、缓冲区的理解、CC++输入方法汇总和详解

一、cin,cout解锁 1.1&#xff1a;cin,cout解锁以及why 首先cin和cout是在c中为了提供类型安全和易用性设计的&#xff0c;它兼容了c语言的输入和输出&#xff0c;以上几点导致它在性能行&#xff08;读取和输出速度)远不如传统c语言的输入和输出。 在看到一些代码里面&…

Python 脚本化 Git 操作:简单、高效、无压力

前言 如何判定此次测试是否达标&#xff0c;代码覆盖率是衡量的标准之一。前段时间&#xff0c;利用fastapi框架重写了覆盖率统计服务&#xff0c;核心其实就是先获取全量代码覆盖率&#xff0c;然后通过diff操作统计增量代码覆盖率&#xff0c;当然要使用diff操作&#xff0c…

Java中Stack的使用详解

Stack是一种运算受限的线性表&#xff0c;其特点在于仅允许在表的一端&#xff08;即表尾&#xff09;进行插入和删除操作。这一端被称为栈顶&#xff0c;而相对的另一端则称为栈底。向一个栈插入新元素的操作称为进栈或入栈&#xff0c;它将新元素放到栈顶元素的上面&#xff…

从杂乱无章到井井有条——五款笔记软件,重塑工作与生活

记得刚入职场那会&#xff0c;我总是被各种繁杂的信息和任务搞得焦头烂额。会议记录、项目计划、灵感闪现……这些都需要我随时记录和整理。 然而&#xff0c;我的桌面总是堆满了便签纸和草稿本&#xff0c;手机相册里充斥着各种截图和备忘录&#xff0c;每次需要查找资料都像…

【数据结构】红黑树——领略天才的想法

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树 红黑树概述 性质详解 效率对比 旋转操作 元素操作 代码实现 二叉搜索树 【数据结构】二叉搜索树-CSDN博客 AVL树 【数据结构】AVL树——平衡二叉搜索…

深度学习实战-yolox训练ExDark数据集(附全过程代码,超详细教程,无坑!)

跳转:数据集获取以及前期准备工作 本人在深度学习实战-yolov5训练ExDark数据集(附全过程代码,超详细教程,无坑!)的数据基础上实现yolox的训练,所以先跳转到该文章下去获取数据集,再继续接下来操作过程。 一、VOC格式数据集制作 1.前期工作 2.转变成voc格式 在datase…

Latex:newcommand

参考文献&#xff1a; latex中自定义的命令———\newcommand-CSDN博客LaTeX技巧924&#xff1a;详解newcommand的参数和默认值 - LaTeX工作室 (latexstudio.net) 文章目录 (re)newcommand自定义的一些命令 (re)newcommand ”定义命令“ 的定义&#xff1a; \newcommand{<…

[每周一更]-(第98期):PHP版本的升级历程

文章目录 大致历程PHP/FI (PHP 1.0)PHP 2.0PHP 3.0PHP 4.0PHP 5.0PHP 5.3 - 5.6PHP 7.0PHP 7.1 - 7.4PHP 8.0PHP 8.1 - 8.2 参考 PHP&#xff0c;即“超文本预处理器”&#xff08;Hypertext Preprocessor&#xff09;&#xff0c;是广泛应用于web开发的服务器端脚本语言。自19…

什么是独特摆动交易策略?fpmarkets1分钟讲清楚

摆动交易策略想必各位投资者都已经接触过了&#xff0c;但是什么是独特摆动交易策略&#xff1f;各位投资者知道吗&#xff1f;其实很简单&#xff0c;这是一种基于斐波纳契工具的独特摆动交易策略。下面fpmarkets1分钟讲清楚&#xff0c;趋势总会经历调整&#xff0c;而这些调…

【机器学习】Python中的决策树算法探索

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Python中的决策树算法探索引言1. 决策树基础理论1.1 算法概述1.2 构建过程 2. P…

数据集003:猫类识别-12种猫分类数据集 (含数据集下载链接)

数据集简介&#xff1a; 训练集共有2160张猫的图片, 分为12类. train_list.txt是其标注文件 测试集共有240张猫的图片. 不含标注信息. 训练集图像&#xff08;部分&#xff09; 验证集图像&#xff08;部分&#xff09; 标签 部分代码&#xff1a; # 定义训练数据集 class T…

eNSP华为模拟器-DHCP配置

拓扑图 要求 PC1通过DHCP获取192.168.1.1地址PC2和PC3通过DHCP接口地址池方式获取IP地址配置静态路由使其ping通 配置 配置主机名及接口IP地址 # AR1 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sys AR1 [AR1]int g0/0/0 [AR1-Gigabit…

去重复记录和排序——kettle开发09

一、去除重复记录 去除重复记录&#xff0c;就是将数据流中的数据进行字段比较&#xff0c;从而去掉重复值的过程。去除重复记录的前提是需要将数据流中的数据进行排序&#xff0c;然后再进行去重操作。 去除重复记录的逻辑是&#xff0c;如下图&#xff0c;我们将需要比较的…

基础使用-SQL-图形化界面工具DataGrip

一、连接mysql &#xff08;1&#xff09;选择加号&#xff0c;再选择添加一个数据源&#xff08;Data Source&#xff09;&#xff0c;然后选择MySQL &#xff08;2&#xff09;接下来就需要去配置MySQL的连接信息&#xff0c;并且去下载它的驱动&#xff0c;安装驱动时可能要…