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

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

有变量:创建,浪费内存

目录
相关文章
|
3月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
64 1
|
2月前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
1月前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
33 5
|
21天前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
14 0
|
2月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
3月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
146 0
|
3月前
|
API 开发者 Python
API接口:原理、实现及应用
本文详细介绍了API接口在现代软件开发中的重要性及其工作原理。API接口作为应用程序间通信的桥梁,通过预定义的方法和协议实现数据和服务的共享。文章首先解释了API接口的概念,接着通过Python Flask框架示例展示了API的设计与实现过程,并强调了安全性的重要性。最后,本文还讨论了API接口在Web服务和移动应用程序等领域的广泛应用场景。
|
3月前
|
Kubernetes 负载均衡 API
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
在K8S中,api-service 和 kube-schedule 高可用原理是什么?
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
38 0
java基础(13)String类
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
51 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性

热门文章

最新文章