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


猜你喜欢
- XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。为了使
- Java内置GUI Frame类Frame概述* 事件处理 * 事件: 用户的一个操作* 事件源: * 作的组件*
- 基于Java的简单的企业员工管理系统,供大家参考,具体内容如下首先创建了一个员工类定义员工应有的属性:工号、姓名、性别、职位、年龄、工资、部
- 在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载。所以自己写了一个压缩文件的工具类。该工具类支持单个文件和文件夹压缩。放代码:
- 泛型与类型擦除泛型,JDK 1.5新特性,本质是参数化类型(Parametersized Type) 的应用,即所操作的数据类型被指定为一个
- 没人会喜欢空指针异常!有什么方法可以避免它们吗?或许吧。。本文将讨论到以下几种技术1.Optional类型(Java 8中新引入的)2.Ob
- 前面关于spring Boot的文章已经介绍了很多了,但是一直都没有涉及到数据库的操作问题,数据库操作当然也是我们在开发中无法回避的问题,那
- @Bean修饰的方法参数的注入方法参数默认注入方式为Autowired,即先根据类型匹配,若有多个在根据名称进行匹配。1:复杂类型可以通过@
- 预加载bean在springBoot启动过程中就完成创建加载在AbstractApplicationContext的refresh方法中//
- 输入一个数组,然后颠倒次序进行输出,这种算法在程序开发
- 斗地主小游戏之洗牌发牌任务描述编写一个斗地主发牌洗牌的程序,要求按照斗地主的规则完成洗牌发牌的过程,牌面由花色色和数字(包括J,Q,K,A字
- 注:如果没有 root 权限也是可以试试,一般情况下,都需要 root 权限,才能连接成功。1.需要确保你的开发 PC 和 Android
- \r与\n到底有何区别,编码的时候又应该如何使用,我们下面来了解一下。区别:\r:全称:carriage return (carriage是
- 本文为大家分享了java门禁系统面向对象程序设计,供大家参考,具体内容如下下面是对门禁系统的介绍:需求1、某公司安装了电子门,要设计门禁系统
- 由于MediaPlayer占用资源较多,且不支持同时播放多个音频,所以Android还提供了另一个播放音频的类-----SoundPool。
- 上一篇中说到了 Expression 的一些概念性东西,其实也是为了这一篇做知识准备。为了实现 EFCore 的多条件、连表查询,简化查询代
- 一、什么是状态管理大到整个app的状态,用户使用app是登录状态,还是游客状态;小到一个按钮的状态,按钮是点击选中状态还是未点击状态等等,这
- 目录前言hibernate-validator基本使用引入依赖编写需要验证对象验证对象属性是否符合要求验证规则空/非空验证bool时间数学字
- 1. 通过设置采样率压缩res资源图片压缩 decodeResource public Bitmap decodeSampled
- 一、构造方法概述构造方法是一种特殊的方法作用:创建对象Student stu = new Student();格式:pucli class