对于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倍的大小。

相关文章
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
38 0
java基础(13)String类
|
3月前
|
API 索引
String类下常用API
String类下常用API
44 1
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
55 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
28天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
24 2
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
50 4
|
2月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
24 2
|
1月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
34 4
|
1月前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
63 2

热门文章

最新文章