Java有哪些操作字符串的类?区别在哪?
作者:Lf_MrF 发布时间:2021-06-02 14:50:54
操作字符串的类都有哪些?区别是什么?
操作字符串的类主要用三个,分别是String类,StringBuffer类和StringBuilder类.
不可变字符串
String类
public class StringTest {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2);// true
System.out.println(s2 == s3);// false
s2 = "abc" + "def";
System.out.println(s1 == s2);// false
String s4 = "abcdef";
System.out.println(s4 == s2);// true
}
}
1.当使用=
对String类初始化的时候,会在常量池创建对象,将引用s1指向常量池中的地址.
2.创建s2的时候,会先在常量池中检查是否有"abc"
的对象,如果有则直接将s2指向常量池中的"abc"
.所以s1和s2指向的是相同的对象.
3.使用new
关键字创建String对象的时候,会在堆空间中开辟一块内存,然后在堆中对s3进行初始化,s3指向的是堆内存空间中的一块区域.
4.当我们对s2进行修改的时候,其实是在常量池中添加了新的对象"abcdef"
,此时我们创建新的对象s4会和创建s2的步骤相同.s4在常量池中找到了"abcdef"
,所以直接指向这个对象.
当我们对String类型的变量进行操作的时候,其实每次改变都是创建除了新的对象.
可变字符串
StringBuffer和StringBuilder类中都提供了增删字符串的方法,下面展示一个在原始对象上增加新的字符的示例.
public class StringTest2 {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb1.hashCode());// 460141958
System.out.println(sb2.hashCode());// 1163157884
sb1.append("def");
sb2.append("def");
System.out.println(sb1.hashCode()); // 460141958
System.out.println(sb2.hashCode()); // 1163157884
}
}
通过这个例子我们能清晰看到,s1和s2在增加元素前后仍旧是同一个对象.
StringBuffer和StringBuilder都继承了AbstractStringBuilder
类.
StringBuffer类
和StringBuilder类对比发现,StringBuffer类中的方法没有使用synchronized
关键字进行修饰.
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuilder类
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
AbstractStringBuilder类的append方法
扩容方法:调用ensureCapacityInternal()方法检查初始char[] value
空间是否足够,如果不够的话,就进行扩容操作.
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
// 查看空间是否足够
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
// 如果空间不够就重新开辟一块新的空间
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
copyOf方法:重新创建一个新的char数组然后将原数组数据拷贝到新数组去.
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
小结
Java操作字符串的类主要有三个,分别是String类,StringBuffer类和StringBuilder类.这三个类的底层都是以char[]
形式保存字符串对象的.他们之间的区别主要体现在:
1.String类型进行修改操作之后相当于重新创建对象,StringBuffer和StringBuilder进行增删操作都是针对同一个对象.
2.StringBuffer中的大部分方法都没有使用synchronized关键字修饰,所以性能更高(我刷题的时候也都是写这个).单线程情况下首选使用StringBuffer类,多线程环境下需要使用StringBuilder类保证线程安全.
3.如果字符串声明之后不需要进行改动,则直接声明String类是最好的选择,不使用new关键字声明String对象时,它不会再堆内存中开辟空间,而是直接指向String常量池.这样可以实现复用,降低资源消耗.
扩展阅读
Java基础系列第一弹之方法重载和方法重写的区别
Java基础系列第二弹之Java多态成员访问的特点
来源:https://blog.csdn.net/Lf_MrF/article/details/117625495
猜你喜欢
- 前言当你编写一个应用时,你通常都会希望用户能够定制化他们和应用交互的方式,以及应用与系统进行交互的方式。这种方式通常被称为 &ldq
- 在项目中经常要用到将字符串解析成Locale,但是没有一个比较好用的类。java本身提供了3个构造函数,但是实际使用过程中,需要自己解析,比
- 本文实例为大家分享了javaweb多文件上传及zip打包下载的具体代码,供大家参考,具体内容如下项目中经常会使用到文件上传及下载的功能。本篇
- 一、概述无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果。例如:线程
- java语言里包含了许多对设计模式的直接支持,如command模式,agent模式,observer模式等。虽然java提供的对
- 一、递归的思路一个方法在执行时,调用自身被称为“递归”。递归相当于数学归纳法,有一个起始条件,有一个递推公式。递归可以分为:单路递归和多路递
- 在项目中遇到try...catch...语句,因为对Java异常处理机制的流程不是很清楚,导致对相关逻辑代码不理解。所以现在来总结Java异
- JAVA简单写学生信息管理系统,实现学生信息的输入、查询、修改、删除操作package Week;import jdk.internal.u
- synchronized原理在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。当我们调用某对象的synchr
- 如下所示:Synchronized是内置的java关键字,Lock是一个java类。Synchronized无法判断是否获取到了锁,Lock
- 网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。package day05; import java.io.Buffered
- 前言Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util
- 快速排序过程没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”!光听这个名字是不是就觉得很高端呢。假设我们现在对“52 39 67
- 在上篇文章给大家介绍了WebService教程详解(一)使用工具的原因:1、 使用工具可以更好的了解WebService请求的过程 2、 使
- springboot配置文件中属性变量引用@@这种属性应用方式是field_name=@field_value@。两个@符号是springb
- 先要把word或ppt转换为pdf; 以pdf的格式展示,防止文件拷贝。转换方法1、安装Word、Excel、PowerPoint组件注意:
- 1. 定义TreeMap的排序方法使用Comparator对象作为参数需要注意的是:排序方法是针对键的,而不是值的。如果想针对值,需要更麻烦
- 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。对于文件上传,浏览器在上
- 普通校验导入依赖:默认的报错:没有提示具体的属性设置自己的错误信息提示:创建 ValidationMessages.properties内容
- 本文为大家分享了使用静态关键字实现单例模式的具体代码,供大家参考,具体内容如下单例模式:只能获得某个类的唯一一个实例单例模式,不管什么时间点