天天看点

Java字符串相关类——String、StringBuffer、StringBulider类及相关方法1.String类2.StringBuffer类3.StringBuilder类

Java字符串相关类——String、StringBuffer、StringBulider类及相关方法

  • 1.String类
    • 1.1String常用方法
    • 1.2String类型与其他数据类型转换
  • 2.StringBuffer类
    • 2.1StringBuffer常用方法
  • 3.StringBuilder类

Java中与字符串相关的类有三个——String、StringBuffer、StringBulider类,本文对这三个类和他们的常用方法进行总结。

1.String类

String是一个final类,代表不可变的字符序列,其对象的字符内容是存储在一个字符数组char[]中的。创建String对象的方式有两种,一种是通过定义字面量的形式创建,另一种是通过调构造器的形式创建:

//字面量方式
String str = "hello";//相当于new char[]{'h','e','l','l','o'};
//构造器方式
String  str1 = new String(); //相当于new char[0]
String  str2 = new String(String str); 
String  str3 = new String(char[] a); 
String  str4 = new String(char[] a,int startIndex,int count);
           

这两种方式有什么区别呢?对于通过字面量形式定义的字符串都是存储在方法区的字符串常量池中,而通过构造器定义的字符串是存储在堆空间中的。例如:

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
           
Java字符串相关类——String、StringBuffer、StringBulider类及相关方法1.String类2.StringBuffer类3.StringBuilder类

其中字符串s1就存储在常量池中,并且在常量池中不会出现两个相同的字符串,因此字符串s1和s2的地址值是相同的,都指向常量池中的同一个字符串。只有新建的字符串在常量池中没有的时候,才会新存储一个字符串在常量池中。而s3首先指向堆空间中,然后再指向常量池的字符串。 String字符串的不可变性体现为:修改或替换原有字符串时,需要新指定内存区域去赋值,原有的字符串是不会变的,这是与StringBuffer和StringBuilder最大的区别。

1.1String常用方法

● 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个,如果超过了,剩下的全部都放到最后一个元素中。

1.2String类型与其他数据类型转换

🔺字符串 <----> 基本数据类型、包装类

● Integer包装类的public static int parseInt(String s):可以将由“数字”字 符组成的字符串转换为整型;

● 调用String类的public String valueOf(int n)可将int型转换为字符串 。

🔺字符数组 <----> 字符串

● 调用构造器String(char[]) 和 String(char[],int offset,int length) 分别用字符数组中的全部字符和部分字符创建字符串对象。

● public char[] toCharArray():将字符串中的全部字符存放在一个字符数组中。

● public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):将指定索引范围内的字符串存放到数组中。

🔺字节数组 <----> 字符串

● String(byte[]):通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的字符串。

● String(byte[],int offset,int length) :用指定的字节数组的一部分, 即从数组起始位置offset开始取length个字节构造一个字符串。

● public byte[] getBytes() :使用平台的默认字符集将此 String 编码为 byte 序列,并存储到一个 byte 数组中。

● public byte[] getBytes(String charsetName) :使用指定的字符集将此 String 编码到 byte 序列,并存储到一个 byte 数组中。

2.StringBuffer类

StringBuffer和String的相同点是底层都是通过char型数组存储的。不同点是StringBuffer代表可变的字符序列,可以对字符串内容进行增删,不会产生新的对象。StringBuffer是线程安全的。并且其对象必须使用构造器生成:

  1. StringBuffer():初始容量为16的字符串缓冲区
  2. StringBuffer(int size):构造指定容量的字符串缓冲区
  3. StringBuffer(String str):将内容初始化为指定字符串内容
StringBuffer  sb1 = new StringBuffer();//相当于new char[16];
StringBuffer  sb2 = new StringBuffer("abc");//相当于new char["abc".length() + 16];
           

虽然此时sb2底层char[]数组长度容量为19,但在调用sb2.length()时,返回的是字符串实际的长度。如果需要存储的数据超过了原有数组的容量,则需要扩容,默认扩容规则为:原有容量*2+2,并将原有数组中的数据复制到新的数组中。

2.1StringBuffer常用方法

● StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接 ● StringBuffer delete(int start,int end):删除指定位置的内容

● StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str

● StringBuffer insert(int offset, xxx):在指定位置插入xxx

● StringBuffer reverse() :把当前字符序列逆转

● public int indexOf(String str)

● public String substring(int start,int end)

● public int length() public char charAt(int n )

● public void setCharAt(int n ,char ch)

3.StringBuilder类

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样,唯一不同的是StringBuilder是线程不安全的,因此相较StringBuffer效率较高。

总结三个类的异同点:

异同点 String StringBuffer StringBuilder
底层存储 char型数组 char型数组 char型数组
字符序列 不可变字符序列 可变字符序列 可变字符序列
线程安全 线程安全 线程安全 线程不安全
效率

根据以上各个类的优缺点,我们在实际开发中优先使用StringBuffer、StringBuilder。如果不涉及线程安全问题,则优先选择StringBuilder;若涉及线程安全问题,则应该使用StringBuffer。

以上就是关于字符串相关类的总结,欢迎大家指正补充!