对于String类的相关知识梳理与总结

简介: String类是Java语言中最普遍最常用的一个类,而且其用法非常广泛,非常有必要了解其中的实现原理,本文主要介绍了String类常用的一些相关知识。

String与char的区别与联系
char 为基本数据类型,字符类型;

 定义char类型变量时,必须使用单引号'',且只能有一个字符;
 char占用2个字节,采用16位Unicode字符(即UTF16)编码,表示范围:0~65535;一个中文占据2个字节,所以char可存储一个汉字。

如下:

char c = 'c';
char c = '中';

// 自动类型提升,根据ASCII码表,自动向上转型为int类型
char x = 'x'+65415; //x 在ASCII编码表中十六进制编码为:120
char d = 'd'+65435; //d 在ASCII编码有中十六进制编码为:100
char d = 'd'+65436; //d Hex= 100 出现错误提示,100+65436=65536超出了char的能力表示范围

String 为引用数据类型,字符串类型;它是以 final 修饰的一个对象,所以不能被继承。定义String类型变量时,必须使用双引号""。

public String() {
    this.offset = 0;
    this.count = 0;
    this.value = new char[0];
}

String类型可以与char[]进行相互转换。String底层也是基于char实现。它提供了构造函数 new String(char[]) 用于将char转换为String类型,toCharArray()方法用于将String转换为char[]类型。

char[] ch = {'a','b','c'};
String str = new String(ch);
System.out.print(ch);
// 输出:abc

char[] tc = str.toCharArray();
for(int i=0;i<tc.length;i++){
   System.out.print("-"+tc[i]);
}
// 输出 -a-b-c

new String[]{}与String[] str={}的区别
String[] policyOrderStatus = new String[]{ "0", "1", "2" };
String[] policyOrderStatus = { "0", "1", "2" };
String[] str = new String[]{}与String[] str={} 区别:
第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"0", "1", "2",
如果没有,则将"0", "1", "2"存放进栈,并令str指向"0", "1", "2",如果已经有"0", "1", "2" 则直接令str指向"0", "1", "2"。

new String(bytes)与byte[].toString()的区别

String byt = "Convert byte Content";
byte[] bytes = byt.getBytes();
System.out.println("bytes: "+bytes);
System.out.println("bytes to String: "+bytes.toString());
String s = new String(bytes);
System.out.println("bytes to new String: "+s);

Java 中数组的 toString() 方法返回的并非数组内容,它返回的实际上是数组存储元素的类型以及数组在内存的位置的一个标识。new String(bytes) 返回的则是实际数组内容。

String、StringBuilder与StringBuffer的区别
String是不可变的类。String包括各种字段如长度,但在这些字段中的值不能改变。
StringBuilder 与 StringBuffer可变的,这两个类都继承了AbstractStringBuilder类。

AbstractStringBuilder实现原理:使用AbstractStringBuilder就是为了提高java中字符串连接的效率,如果直接使用+进行字符串连接,jvm会创建多个String对象,造成很大的性能开销。

AbstractStringBuilder中采用一个char数组来保存需要append的字符串,char数组有一个初始大小,当append的字符串长度超过当前char数组容量时,则对char数组进行动态扩展,即重新申请一段更大的内存空间,然后将当前char数组拷贝到新的位置;由于重新分配内存并拷贝的带来的空间开销比较大,所以每次重新申请内存空间都是采用申请大于当前需要的内存空间的方式,一般是2倍的大小。

相关文章
|
1月前
|
索引 Python
模拟实现一个简单的string类
这个示例中,定义了一个简单的 `MyString`类,包含了常用的字符串操作,比如初始化、字符串拼接、长度获取、索引访问、大小写转换、相等判断等功能。请根据需求进行适当的修改和扩展。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
22 5
|
2月前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
45 0
|
6天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
18 1
|
4天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
4天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
10 0
|
4天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
14 0
【C++】string学习 — 手搓string类项目
|
6天前
|
C++
【C++】string类(介绍、常用接口)
【C++】string类(介绍、常用接口)
17 2
|
19天前
|
存储 网络协议 Java
Java String类
Java String类
11 0
|
23天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
25天前
|
存储 Java 编译器
Java String 类
4月更文挑战第14天