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

简介: 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之后:先预估字符串拼接后总大小,再放入数组产生新的字符串

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

有变量:创建,浪费内存

目录
相关文章
|
11月前
|
存储 安全 Java
String StringBuffer StringBuilder 区别详解与对比分析
本文详细解析了Java中String、StringBuffer和StringBuilder的区别,从可变性、线程安全性和性能三个方面进行对比,并结合具体应用场景分析了三者的适用范围。通过性能测试示例展示了它们在字符串拼接时的效率差异,同时提供了实际代码案例帮助理解。总结指出,String适合少量操作或线程安全场景,StringBuffer适用于多线程环境,而StringBuilder则在单线程下性能最优。开发者应根据需求选择合适的类以优化程序性能。文末还附有相关面试资料供参考。
1310 2
|
12月前
|
算法 搜索推荐 API
京东拍立淘图片搜索 API 接口使用指南:从原理到实践
京东拍立淘图片搜索API,基于先进图像识别技术,支持上传图片、URL或拍摄实物搜索相似商品。其特点包括:搜索便捷高效,用户可快速发起搜索;精准匹配结果,通过算法捕捉商品特征确保准确;数据覆盖广泛,依托京东海量商品资源满足个性化需求;智能推荐拓展,根据用户行为挖掘潜在需求,提升购物体验。
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
375 11
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
692 57
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
206 5
|
API 索引 Python
|
7月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。