收藏 | 万字长文彻底搞懂 String(二)

简介: 哈喽,大家好,我是指北君。java.lang.String 类可能是大家日常用的最多的类,但是对于它是怎么实现的,你真的明白吗?不知道不要紧,善解人意的指北君写下了这篇文章,包你一看就明白了。


9、indexOf(int ch) 和 indexOf(int ch, int fromIndex) 方法


indexOf(int ch),参数 ch 其实是字符的 Unicode 值,这里也可以放单个字符(默认转成int),作用是返回指定字符第一次出现的此字符串中的索引。其内部是调用 indexOf(int ch, int fromIndex),只不过这里的 fromIndex =0 ,因为是从 0 开始搜索;而 indexOf(int ch, int fromIndex) 作用也是返回首次出现的此字符串内的索引,但是从指定索引处开始搜索。69.png


10、split(String regex) 和 split(String regex, int limit) 方法


split(String regex) 将该字符串拆分为给定正则表达式的匹配。split(String regex , int limit) 也是一样,不过对于 limit 的取值有三种情况:

①、limit > 0 ,则pattern(模式)应用n - 1 次


70.png

②、limit = 0 ,则pattern(模式)应用无限次并且省略末尾的空字串

71.png

③、limit < 0 ,则pattern(模式)应用无限次

72.png

下面我们看看底层的源码实现。对于 split(String regex) 没什么好说的,内部调用  split(regex, 0) 方法:

73.png


重点看 split(String regex, int limit) 的方法实现:74.png75.png


11、replace(char oldChar, char newChar) 和 String replaceAll(String regex, String replacement) 方法


①、replace(char oldChar, char newChar) :将原字符串中所有的oldChar字符都替换成newChar字符,返回一个新的字符串。

②、String replaceAll(String regex, String replacement):将匹配正则表达式regex的匹配项都替换成replacement字符串,返回一个新的字符串。


12、substring(int beginIndex) 和 substring(int beginIndex, int endIndex) 方法


①、substring(int beginIndex):返回一个从索引 beginIndex 开始一直到结尾的子字符串。76.png

②、 substring(int beginIndex, int endIndex):返回一个从索引 beginIndex 开始,到 endIndex 结尾的子字符串。


13、常量池


在前面讲解构造函数的时候,我们知道最常见的两种声明一个字符串对象的形式有两种:

①、通过“字面量”的形式直接赋值

String str = "hello";

②、通过 new 关键字调用构造函数创建对象

String str = new String("hello");

那么这两种声明方式有什么区别呢?在讲解之前,我们先介绍 JDK1.7(不包括1.7)以前的 JVM 的内存分布:  

77.jpg

①、程序计数器:也称为 PC 寄存器,保存的是程序当前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。线程私有。


②、虚拟机栈:基本数据类型、对象的引用都存放在这。线程私有。

③、本地方法栈:虚拟机栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。在JVM规范中,并没有对本地方法栈的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和虚拟机栈合二为一。

④、方法区:存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。注意:在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

⑤、堆:用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的)。

相关文章
|
6月前
|
C++
C++初阶(十二)string的模拟实现
C++初阶(十二)string的模拟实现
39 0
|
1月前
|
存储 编译器 程序员
深度剖析C++string(上篇)(2)
深度剖析C++string(上篇)(2)
36 0
|
1月前
|
存储 Linux C语言
深度剖析C++string(上篇)(1)
深度剖析C++string(上篇)(1)
32 0
|
6月前
|
存储 C++ 容器
【C++从练气到飞升】09---string语法指南(二)
【C++从练气到飞升】09---string语法指南(二)
|
6月前
|
存储 Linux C语言
【C++从练气到飞升】09---string语法指南(一)
【C++从练气到飞升】09---string语法指南(一)
|
存储 Java 编译器
JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
JDK8中String的intern()方法详细解读【内存图解+多种例子+1.1w字长文】
|
算法 安全 NoSQL
Java新人易错:当修改遇到唯一(万字长文)
Java新人易错:当修改遇到唯一(万字长文)
|
存储 编译器 C++
【C++】一文带你吃透string的模拟实现 (万字详解)(上)
【C++】一文带你吃透string的模拟实现 (万字详解)(上)
112 0
【C++】一文带你吃透string的模拟实现 (万字详解)(上)
|
编译器 C语言 C++
【C++】一文带你吃透string的模拟实现 (万字详解)(下)
【C++】一文带你吃透string的模拟实现 (万字详解)(下)
【C++】一文带你吃透string的模拟实现 (万字详解)(下)