String类、StringBuffer类与StringBuilder类
一、三者的区别
[Java中的String,StringBuilder,StringBuffer三者的区别 - 酥风 - 博客园]
- String 类 :不可变字符序列
- StringBuffer 类:可变字符序列 -- 线程安全,做线程同步检查,效率低
- StringBuilder 类:可变字符序列 -- 线程不安全,不做线程同步检查,因此效率较高 (推荐使用)
1、String 类的常用方法:
int length():返回字符串的长度: return value.length
char charAt(int index): 返回某索引处的字符return value[index]
boolean isEmpty():判断是否是空字符串:return value.length == 0
String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大
小写
String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从
beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字
符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的
子字符串是否以指定前缀开始
boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列
时,返回 true
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出
现处的索引,从指定的索引开始
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后
一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1
String replace(char oldChar, char newChar):返回一个新的字符串,它是
通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):使
用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此
字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。[原文链接][https://blog.csdn.net/bjfu170203101/article/details/109386466]
常用方法可查看 api 文档 -- [JDK 1.8 -API 文档] [Java Platform SE 8]
2、StringBuffer类、StringBuilder类 常用方法列表:
重载的
public StringBuilder append(…)方法 --
可以为该StringBuilder
对象添加字符序列,仍然返回自身对象。方法
public StringBuilder delete(int start,int end) --
可以删除从start
开始到end-1
为止的一段字符序列,仍然返回自身对象。方法
public StringBuilder deleteCharAt(int index) --
移除此序列指定位置上的char
,仍然返回自身对象。重载的
public StringBuilder insert(…)方法 --
可以为该StringBuilder 对象在指定位置插入字符序列,仍然返回自身对象。方法
public StringBuilder reverse() --
用于将字符序列逆序,仍然返回自身对象。方法
public String toString() --
返回此序列中数据的字符串表示形式。和 String 类含义类似的方法:
public int indexOf(String str) public int indexOf(String str,int fromIndex) public String substring(int start) public String substring(int start,int end) public int length() char charAt(int index)
3、测试 StringBuffer/StringBuilder基本用法 :
public class TestStringBufferAndBuilder{public static void main(String[ ] args) {/**StringBuilder*/StringBuilder sb = new StringBuilder();for (int i = 0; i < 7; i++) {sb.append((char) ('a' + i));//追加单个字符}System.out.println(sb.toString());//转换成String输出sb.append(", I can sing my abc!");//追加字符串System.out.println(sb.toString());/**StringBuffer,下面的方法同样适用StringBuilder*/StringBuffer sb2 = new StringBuffer("北京欢迎你");sb2.insert(0, "爱").insert(0, "我");//插入字符串System.out.println(sb2);sb2.delete(0, 2);//删除子字符串System.out.println(sb2);sb2.deleteCharAt(0).deleteCharAt(0);//删除某个字符System.out.println(sb2.charAt(0));//获取某个字符System.out.println(sb2.reverse());//字符串逆序}
}
测试结果:
4、String使用的陷阱
String一经初始化后,就不会再改变其内容了。对String字符串的操作实际上是对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。比如:
String s ="a"
; 创建了一个字符串
s = s+"b"
; 实际上原来的a
字符串对象已经丢弃了,现在又产生了另一个字符串s+"b"
(也就是ab
)。 如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的时间和空间性能,甚至会造成服务器的崩溃。
相反,StringBuilder和StringBuffer类是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝或者产生少量的副本。因此可以在循环中使用。
package com.menghuan.常用类;
// @date:2022年03月12日0:09/*** 效率测试:* 字符串序列的陷阱 -- 时间和空间效率测试* String -- 不可变字符串序列,每一个新的字符串都会创建一个对象* StringBuffer 和 StringBuilder 可变字符串序列 , 只会产生一个对象*/
public class TestString04 {public static void main(String[] args) {//使用String 进行字符串的拼接String str1 = "";long num1 = Runtime.getRuntime().freeMemory(); // 获取系统剩余内存空间long time1 = System.currentTimeMillis(); // 获取系统的当前时间for (int i = 0; i < 5000; i++) {str1 = str1 + i; // 相当于产生了5000个对象}long num2 = Runtime.getRuntime().freeMemory(); // 获取系统剩余内存空间long time2 = System.currentTimeMillis(); // 获取系统的当前时间System.out.println("String占用内存 :"+ (num2 - num1));System.out.println("String占用时间 :"+ (time2 - time1));/** 使用StringBuilder 进行字符串的拼接 */StringBuilder sb1 = new StringBuilder("");long num3 = Runtime.getRuntime().freeMemory();long time3 = System.currentTimeMillis();for (int i = 0; i < 5000; i++) {sb1.append(i); // 末尾添加单个字符}long num4 = Runtime.getRuntime().freeMemory();long time4 = System.currentTimeMillis();System.out.println("StringBuilder占用内存 :"+ (num4 - num3));System.out.println("StringBuilder占用时间 :"+ (time4 - time3));}
}
String类、StringBuffer类与StringBuilder类相关推荐
- String、StringBuffer、与StringBuilder的区别
原文:http://www.cnblogs.com/sevenlin/p/sevenlin_StringBuffer_StringBuilder20150806.html String.StringB ...
- Java中String,StringBuffer都是final类
Java中String和StringBuffer同时final类,它们的区别在哪里 ? final 表示这个类不能再被继承.String不可变是说String中用一个final 的char数组priv ...
- 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照
本文主要介绍String类.StringBuffer类.StringBuilder类的差别 : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...
- C#OOP之十五 String类StringBuilder类
String类的概述 初次看到String这个词,大家应该都很熟悉.有的同学就会想到:它不就是C#中的一个关键字吗?我们已经接触过了啊,它就是一个数据类型而已,能有何大用?也有细心的同学会发现:这个S ...
- C#笔记2__Char类、String类、StringBuilder类 / 正则表达式 /
Char类 String类 字符串的格式化:String类的Format方法 StringBuilder类 以上:百度 or 查手册..... 转载于:https://www.cnblogs.com/ ...
- 第三次学JAVA再学不好就吃翔(part58)--String和StringBuffer分别作为参数传递
学习笔记,仅供参考 文章目录 StringBuilder类 String和StringBuffer分别作为参数传递 String作为参数传递 StringBuffer作为参数传递 StringBuil ...
- c++string 加引号_一文带你了解Java字符串处理(String,StringBuffer,StringBuild)
前言 本文篇幅较长,但都是满满的干货,请大家耐心观看,相信会有不小的收获.本人在总结的过程中也收获了很多的知识,也希望大家可以一起借鉴学习下,希望大家最后都能有所收获! 再言 字符串的分类在java. ...
- Java基础篇——字符串处理(String,StringBuffer,StringBuild)
提前说明本次的文章很长但是很有用,有耐心看完的必定不是凡人,必定会有很大的收获.本人在总结的过程中也收获了很多的知识,希望我们可以一起学习.写下这篇文章完全是抱着可以帮助到他人的态度. 虽然要写出很高 ...
- 重温java中的String,StringBuffer,StringBuilder类
不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...
- [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类
引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...
最新文章
- Error: Discrete value supplied to continuous scale
- Solaris10之SVM简析
- 前向传播和反向传播_深度学习的地基模块:模型、参数、非线性、前向传播、反向偏微分
- 十分钟成为 TiDB Contributor,还送限量版马克杯
- 哲学家就餐问题linux源代码,Linux下实现哲学家就餐问题
- VTK修炼之道55:图形基本操作进阶_表面重建技术(等值面提取)
- 北京昌平计算机职业高中学校,北京职业学校2021中专
- WPF中通过AForge实现USB摄像头拍照
- java基础集合简介Map(三)下
- 浅析设计模式(三)——抽象工厂模式
- 庖丁解牛获取连接状态数的awk数组命令
- iOS 4中禁止程序退出后保留在后台的方法
- JS实现静默发送邮件功能(选择填报提交后发送、数据查询后发送参考前者)
- python身份证号码计算年龄
- SONY索尼摄像机Z280断电KLV.RSV.MXF视频打不开数据恢复成功
- 10家不错的iphone编程资源站
- java excel 超链接_Java 添加超链接至Excel文档
- react学习笔记(二)
- 技术总监做技术经理的工作,技术经理做研发的工作是怎么回事?
- 使用TMS320F28335控制四位共阳数码管