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

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

有变量:创建,浪费内存

目录
相关文章
|
24天前
|
算法 搜索推荐 API
京东拍立淘图片搜索 API 接口使用指南:从原理到实践
京东拍立淘图片搜索API,基于先进图像识别技术,支持上传图片、URL或拍摄实物搜索相似商品。其特点包括:搜索便捷高效,用户可快速发起搜索;精准匹配结果,通过算法捕捉商品特征确保准确;数据覆盖广泛,依托京东海量商品资源满足个性化需求;智能推荐拓展,根据用户行为挖掘潜在需求,提升购物体验。
|
3月前
|
数据处理
鸿蒙开发:ArkTs字符串string
字符串类型是开发中非常重要的一个数据类型,除了上述的方法概述之外,还有String对象,正则等其他的用处,我们放到以后得篇章中讲述。
163 19
|
3月前
|
Java 程序员
课时16:String字符串
课时16介绍了Java中的String字符串。在Java中,字符串使用`String`类表示,并用双引号定义。例如:`String str = "Hello world!";`。字符串支持使用“+”进行连接操作,如`str += "world";`。需要注意的是,当“+”用于字符串与其他数据类型时,其他类型会先转换为字符串再进行连接。此外,字符串中可以使用转义字符(如`\t`、`\n`)进行特殊字符的处理。掌握这些基本概念对Java编程至关重要。
|
8月前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
324 57
|
7月前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
7月前
|
索引 Python
String(字符串)
String(字符串)。
146 3
|
8月前
|
NoSQL Redis
Redis 字符串(String)
10月更文挑战第16天
106 4
|
8月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
91 5
|
17天前
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
|
3月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
99 11