老生常谈Java字符串进阶(必看篇)
作者:jingxian 发布时间:2023-11-12 21:19:35
前言
最常用的对字符串操作的类有三个,分别是String,StringBuilder,StringBuffer,下面将会详细的说说这三个类......
String
String类代表字符串,这个是最基本的对字符串的类,这个也是使用比较多的类,这里就不再详细介绍了
构造
new String(String str)
new String(StringBuilder str)
new String(StringBuffer str)
new String(byte[] bys,String charsetName) 通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。
常用方法
str charAt(int index) 返回指定索引处的字符
String concat(String str) 将指定字符串str连接到此字符串的结尾,返回连接成功后的字符,因此需要接受才能有效果
boolean contains(CharSequence s) 判断此字符串是否包含指定的char值序列,这里的 CharSequence是一个接口,可以直接使用它的子类作为参数(String,StringBuffer,StringBuild)
static String copyValueOf(char[] c) 将字符数组变成字符串并且返回
static String copyValueOf(char[] c,int off,int count) 将截取的字符数组变成字符串并且返回,off是开始截取的下标,count是截取的个数
boolean endWith(String s) 判断字符串是否是以s结尾
boolean equals(Object o) 用于比较
int indexOf(char c) 返回字符c在字符串中第一次出现的索引
int indexOf(char c,int fromIndex) 从指定索引处开始搜索,查找第一次出现的索引
int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(String str,int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
boolean isEmpty()
int length()
boolean matches(String regex) 是否匹配正则表达式
trim() 返回字符串的副本,忽略前导空白和尾部空白。
String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。
String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。
char[] toCharArray() 将此字符串转换为一个新的字符数组。
byte[] getBytes(Charset charset) 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组
注意
上面的new String(byte[] bys,String charsetName)这个构造方法很重要,它可以改变字符串的编码集(和byte[] getBytes(Charset charset))配合着使用,下面我们来看一个例子,代码如下:
/*
* InputStreamReader实现了将字节流FileInputStream转换为字符流,然后使用转换来的字节流创建高效流,从而实现高效的读写
*/
/*
* 编码集(我的eclipse编辑器默认的是utf-8
* 下面将中文字符串的编码集变为GBK写入a.txt文件,因为a.txt默认的是utf-8的因此这里在文件中显示的是乱码
* 然后我们读出来的还是GBK的,因为我们写入的是GBK编码集的,但是我的eclipse是utf-8的编码集,因此在控制台上输出的还是乱码
* new String(byte[] bys,String
* charsetName)使用这个构造方法将byte数组改变编码集并且转换为utf-8格式的,那么这次在控制台上输出的就不乱码了
*/
// 将GBK格式的中文写入a.txt文件
File file = new File("src/a.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
String str = "中";
byte[] by = str.getBytes("GBK"); // 将字符串改为GBK编码集
fileOutputStream.write(by);
fileOutputStream.close();
//从a.txt文件中读取中文
FileInputStream fileInputStream = new FileInputStream(file);
int len;
byte[] bys = new byte[4];
while ((len = fileInputStream.read(bys)) != -1) {
System.out.println(new String(bys, "GBK"));
}
fileInputStream.close();
StringBuffer
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。当然最重要的一点就是线程安全,我们可以从它的源码中可以看出,对于一些操作(append,insert..)都是使用了线程控制块来实现同步,适合与多线程下的使用,源代码如下:
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
public synchronized StringBuffer delete(int start, int end) {
super.delete(start, end);
return this;
}
/**
* @throws StringIndexOutOfBoundsException {@inheritDoc}
* @since 1.2
*/
public synchronized StringBuffer deleteCharAt(int index) {
super.deleteCharAt(index);
return this;
}
构造
new StringBuffer(StringBuilder str)
new StringBuffer(String str)
常用的方法
StringBuffer append(str)将指定类型的str追加到此字符串的后面(String,char,char[],int,double,float,long,StringBuffer,StringBuilder)
StringBuffer insert(int offest, str) 将指定类型的str插入到此序列中,offest表示开始插入的位置的索引,类型有 String,char,char[],int,double,float,long,StringBuffer,StringBuilder
String delete(int fromIndex,int endIndex) 移除此序列中的字符串并且返回新的缓冲字符串
StringBuffer reverse() 反转字符串
String substring(int start) 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
String substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含的字符子序列。
StringBuffer deleteCharAt(int index) 移除此序列指定位置的 char。
int length() 长度
String toString() 返回此序列中数据的字符串表示形式。
StringBuilder
建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。但是这个类不是线程安全的,只适合单线程,如果使用多线程推荐使用StringBuffer,当然使用这个也行,不过需要自己实现同步
构造方法
new StringBuilder(String str)
常用方法
这个类的常用方法和StringBuffer的一样,这里就不再一一列举了,参照上面的即可使用


猜你喜欢
- 1. 背景从JDK1.5开始,Java支持个数可变的形参,类似:public class ParamDemo { public static
- 好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了。这次就跟着之前的问题,继续总结下Spring MVC中的小知识。u
- 使用JAVA工程管理越来越多的jar包,担心导错了,多导了,漏导了怎么办?换一个IDE项目后项目会不会出一堆BUG,看的头皮发麻?自己写的代
- 本文实例讲述了C#警惕匿名方法造成的变量共享。分享给大家供大家参考,具体如下:匿名方法匿名方法是.NET 2.0中引入的高级特性,“匿名”二
- 1.委托delegate委托delegate也是一种类型,在任何可以声明类的地方都可以声明委托,它将方法当做另一个方法的参数进行传递,这样就
- 牛逼!IDEA不愧为神器,结合Groovy脚本,简直天下无敌,如今, 有许许多多的插件或者编辑器都支持根据数据表自动生成数据实体类了, 比如
- 1、加载节点SpringBoot启动时,会执行这个方法:SpringApplication#run,这个方法中会调prepareContex
- 本文实例为大家分享了Android实现系统日历同步日程的具体代码,供大家参考,具体内容如下1、权限<uses-permission a
- 简介Android Studio升级到3.0后,有不少的改动和新特性,先贴出官方的迁移说明。本文会持续收集与总结本人在使用Android S
- 1、这个方法在GpsNET.JT809Core里来源:https://www.cnblogs.com/cnsend/p/12197982.h
- Spring Security登录表单配置1.引入pom依赖创建一个Spring Boot工程,引入Web和Spring Security依
- 本文实例讲述了android编程实现sd卡读取数据库的方法。分享给大家供大家参考,具体如下:先在 Manifest 里添加权限:<us
- 一、创建web项目1、打开idea软件,点击界面上的Create New Project2、进入如下界面。选中 java Enterpris
- Scala异常处理Scala是一种多范式的编程语言,支持面向对象和函数式编程。Scala也支持异常处理,即在程序运行过程中发生意外或错误时,
- Consumer消费者Demo示例<?xml version="1.0" encoding="UTF-8
- 本文调用android的媒体播放器实现一些音乐播放操作项目布局:<LinearLayout xmlns:android="h
- 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种:第一种:通过注解@PostConstruct 和 @
- java 中编写 GUI 有两中工具包,分别为 AWT、Swing。Swing 是 AWT 的拓展,Swing 具有比 AWT 丰富的组件和
- 本文实例讲述了java实现的RSA加密算法。分享给大家供大家参考,具体如下:一、什么是非对称加密1、加密的密钥与加密的密钥不相同,这样的加密
- jmap:Java内存映像工具jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文