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

news2024/9/21 22:45:19

字符串和相关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.coloradmin.cn/o/1702366.html

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

相关文章

JSON-RPC跨域通信:Python服务器端解决方案与Js客户端 Mozilla扩展程序

问题背景 构建一个 Mozilla 扩展程序,与远程服务器上的 Python 应用程序进行通信以发送和接收数据。Python 应用程序可以通过 Python 控制台使用 xml-rpc 调用。尝试设计一个 JSON-RPC 来联系同一个应用程序。开发 Python 服务器端,可以通过 python 控制…

SEC批准以太坊ETF了吗?

原创 | 刘教链 隔夜BTC击穿了5日均线,回落至67k一线。凌晨传来美SEC批准以太坊ETF的消息,但是ETH上下插针,杵在3.8k,微微下跌。定睛仔细一看,SEC批准了,但又没完全批准,这特么是薛定谔的批准哈&…

【多线程】线程安全

目录 1.观察线程不安全 2.线程不安全的原因 2.1 随机调度 2.2 修改共享数据 2.3 原子性 2.4 内存可见性 2.5 指令重排序 3.synchronized 加锁操作 3.1 synchronized是什么? 3.2 synchronized的特性 1) 互斥 2) 可重入 3.3 synchronized使用示例 3.3.1 针…

安卓手机APP开发__平台的架构

安卓手机APP开发__平台的架构 目录 概述 安卓软件栈 Linux内核 硬件抽象层(HAL) 安卓运行时 原生的C/C代码库 Java API框架 系统APP 概述 安卓是一个开源的,基于Linux的软件栈,它创建一个设备和形式因素的很宽的矩阵。 下图展示了安卓平台的所有…

MyBatis-Plus 从入门到精通

MyBatis-Plus 从入门到精通 前言快速入门创建一个SpringBoot项目导入依赖配置数据库创建一个实体类创建一个mapper接口在SpringBoot启动类上配置mapper接口的扫描路径在数据库中创建表编写一个SpringBoot测试类 核心功能注解CRUD接口Mapper CRUD接口Service CRUD 接口条件构造器…

C字符串和内存函数介绍(二)——长度不固定的字符串函数

前面我们一起学习了strlen,strcpy,strcmp,strcat的使用以及它们的模拟实现,它们的特点是你传参的时候,传过去的是数组首元素的地址,然后无论是计算长度,实现拷贝,相互比较还是进行追…

布局、基本控件

一、as布局 布局文件 layout drawable 设置背景的文件 新建drawable-xhdpi文件 — 放一些item或图片 values: theme app风格,string 字符串(相当于宏定义,可以引用),colors颜色配置(可以引用…

新闻稿推广策略有哪些?建议收藏

新闻稿推广是一种有效的公关工具,它可以帮助企业或组织传递信息、提升品牌知名度、建立权威形象,并最终促进销售。新闻稿推广策略有哪些?接下来伯乐网络传媒就来给大家分享一下。 确定目标受众:在撰写新闻稿之前,明确你…

MATLAB导入导出Excel的方法|读与写Excel的命令|附例程的github下载链接

前言 前段时间遇到一个需求:导出变量到Excel里面,这里给出一些命令,同时给一个示例供大家参考。 MATLAB读/写Excel的命令 在MATLAB中,可以使用以下命令来读写Excel文件: 读取Excel文件: xlsread(filen…

文件加密软件排行榜前十:好用的文件加密软件推荐

文件加密软件是企业保护数据安全的有效手段。 选择文件加密软件时,不仅要考虑加密强度,还要兼顾易用性、兼容性及是否满足特定需求。 下面小编将推荐几款好用的文件加密软件,比如以下十款软件排行榜。 以下十款软件各有所长,有…

全能集成开发平台Team·IDE

三甲医院的床位太难等了。反正也是小手术,老苏周五在附近找了家二甲医院,幸运的是,门诊迅速为我开具了入院证。周六早晨就接受了手术,周日挂了一天水,周一下午就出院了。准备在家先休息两天。 2~4 周之后把支架取出来…

数据挖掘实战-基于余弦相似度的印度美食推荐系统

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

机器人非线性控制系统:相关知识点整理

机器人控制系统本质上是一个非线性系统。引起机器人非线性因素很多,机器人的结构、传动件、驱动元件等都会引起系统的非线性。 机器人控制系统是由多关节组成的一个多变量控制系统,且各关节间具有耦合作用。具体表现为某一个关节的运动,会对…

全球AI新闻速递527

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇

历史文章(文章累计500) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

机器人回调接口完善

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 免责声明:该工具仅供学习使用,禁止使用该工具从事违法活动,否则永久拉黑封禁账号!!!本人不对任何工具的使用负责&am…

京东面试:SpringBoot同时可以处理多少请求?

面试题大全:www.javacn.site Spring Boot 作为 Java 开发中必备的框架,它为开发者提供了高效且易用的开发工具,所以和它相关的面试题自然也很重要,咱们今天就来看这道经典的面试题:Spring Boot 同时可以处理多少个请求…

拥塞控制的自适应 AQM 探索

拥塞控制面临的几类问题: 网络拥塞时,大象流如何为微突发让路;网络拥塞时,如何只惩罚造成拥塞的流量;网络拥塞时,如何确保小流量不受影响。 既然不想在 host 将流按照大小分类,嫌没意义&#…

内存泄漏案例分享4-异步任务流内存泄漏

案例4——异步任务内存泄漏 异步任务,代指起子线程异步完成一些数据操作、网络接口请求等,通常会使用以下API: Runnbale,Thread,线程池RxJavaHandlerThread 而这些异步任务很有可能操作内存泄漏,下面我们以Rxjava为…

SaaS增长三大策略:从用户获取到留存转化的全链路解析

在SaaS(软件即服务)行业中,增长是企业成功的关键。然而,要实现持续增长并非易事,需要一套从用户获取到留存转化的全链路策略。 首先,用户获取是SaaS增长的第一步。 这要求企业明确目标用户群体&#xff0…