文章目录
- 1. String
- 1.1 String的特性
- 1.2 String的不可变的特性理解
- 1.3 String不同实例化方式的对比
- 1.4 *String中的常用方法
- 1.5 String与其他类型之间的转换
- 1.5.1 String与基本数据类型、包装类之间的转换
- 1.5.2 String与字符数组(char[])之间的转换
- 2. StringBuffer类
- 2.1 String、StringBufer、StringBuild异同
- 2.2 StringBuffer类的常用方法(StringBuild同)
1. String
1.1 String的特性
- String类:代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。
- String是一个final类,代表不可以被继承,是一个不可变的字符序列。
- 字符串是常量,用双引号引起来表示。它们的值在创建后不能更改。
- String对象的字符内容是存储在一个char型数组value[]中的。
- String实现了serializable接口:表示字符串是支持序列化的。
- String实现了Comparable接口:表示String可以比较大小
private final char value[];
1.2 String的不可变的特性理解
String:代表不可变的字符序列。简称:不可变性。
体现:
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能对原有的value进行赋值
- 当对现有的字符串进行连接操作(s3 +=“def”)时,也需要重新指定内存区域赋值,不能d对原有的value进行赋值
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域,不能对原有的value进行赋值
理解1:当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
package junit;
import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.util.*;
public class Test01 {
@Test
public void test(){
//通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
//字符串常量池中是不会存储相同内容的字符串的。
String s1 = "abc";//字面量的定义方式
String s2 = "abc";
System.out.println(s1 == s2);//true,比较的是s1和s1的地址值
s1 = "hello";
System.out.println(s1);//hello
System.out.println(s2);//abc
System.out.println("***********");
String s3 = "abc";
s3 += "def";
System.out.println(s3);//abcdef
String s4 = "abc";
String s5 = s4.replace('a','m');
System.out.println(s4);//abc
System.out.println(s5);//mbc
}
}
1.3 String不同实例化方式的对比
理解:
理解:
理解:
面试题:String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
答:两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据: “abc”
理解:不同字符串的拼接操作
1.4 *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): 与jequals方法类似,忽略大小写
- String concat(String str):将指定字符串连接到此字符串的结尾。等价于用“+”
- int compareTo(String anotherString):比较两个字符串的大小(例:“abc”和“abe”比较结果为-2,是直接用ascii码减)),涉及到字符串排序,结果为正数则前面字符串大,结果为负数则后买你字符串大,结果为0则两个字符串相等
- String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginlndex开始截取到最后的一个子字符串。
- String substring(int beginIndex, int endIndex):返回一个新字符串,它是此符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
普通:
- boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
- boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
- boolean startsWith(String prefix,int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
String s1 = "hello";
System.out.println(s1.startsWith("ll",2));//true
- 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):告知此字符串是否匹配给定的正则表达式。
- Stringsplt(String regex):根据给定正则表达式的匹配拆分此字符串。
- Stringsplit(String regex,int limit):根据匹配给定的正则表达式来拆分此·字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
1.5 String与其他类型之间的转换
1.5.1 String与基本数据类型、包装类之间的转换
package junit;
import org.junit.jupiter.api.Test;
public class Test01 {
@Test
public void test(){
String s1 = "123";
//String -->基本数据类型、包装类:调用包装类的静态方法: parseXxx( str)
int a = Integer.parseInt(s1);
System.out.println(s1);
System.out.println(a);
//基本数据类型、包装类--> string: 调用String重载的valueof(xxx)
String s2 = String.valueOf(a);
//法2:将基本数据类型与空字符串相加
String s3 = a + "";
}
}
1.5.2 String与字符数组(char[])之间的转换
public class Test01 {
@Test
public void test(){
String str1 = "123";
//string --> char[]:调用String的toCharArray()
char[] c = str1.toCharArray();
//char[] --> String :调用String的构造器
char[] c1 = new char[]{'h','e','l','l','o'};
String str2 = new String(c1);
//或String的valueOf();
for (int i = 0; i < c1.length; i++) {
String s3 = String.valueOf(c1[i]);
System.out.print(s3);
}
}
}
2. StringBuffer类
2.1 String、StringBufer、StringBuild异同
- java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
- 很多方法与String相同。
- 作为参数传递时,方法内部可以改变值。
String. stringBuffer. stringBuilder三者的异同?
String:不可变的字符序列;底层使用char型数组(char[])存储
stringBuffer:可变的字符序列;线程安全的,效率低;底层使用char型数组(char[])存储
StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
三者的效率排列:StringBuild > StringBuffer > String
从源码看不同:
package junit;
import org.junit.jupiter.api.Test;
public class Test01 {
@Test
public void test(){
String str = new String();//调用空惨构造器new :char[] value = new char[0];
String str1 = new String( "abc" );//调用带参构造器new:char[] value = new char[]{ 'a','b','c' };
StringBuffer sb1 = new StringBuffer(); //调用空惨构造器new: char[] value = new char[16];底层创建了一个长度为16的数组
sb1.append('a');//value[0] = 'a';
sb1.append('b');//value[1] = 'b';
StringBuffer sb2 = new StringBuffer("abc");//char[] value = new char["abc".length +16]
}
}
/问题1.System.out.printLn( sb2.length());//3
//问题2.扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量的2倍再+2,同时将原有数组中的元素复制到新的数组中。
2.2 StringBuffer类的常用方法(StringBuild同)
- 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():把当前字符序列逆转
当append和linsert时,如果原来value数组长度不够,可扩容。
如上这些方法支持方法链操作。 - public int indexof(String str):返回指定子字符串在此字符串中第一次出现处的索引
- public string substring(int start,int end):返回一个从start开始到end结束的左闭右开区间的字符串
- public int length()//返回字符串的长度
- public char charAt(int n) //返回某索引处的字符
- public void setCharAt(int n,char ch)//将指定位置的字符改为新的字符