String类
一、String类概述
- String类:代表字符串。
- String类是一个final类,代表其实不能被继承的,也是不可变的字符序列。
- String对象的字符内容是存储在一个字符数组value[]中的。
二、String类的使用
1. 不可变性的体现
2. 对象的创建的两种方式及存储结构
public void test2(){
String s1="javaEE";//存储在常量池中
String s2="javaEE";
//底层是以数组的方式存在的,表示数组中存储了hello,存储在堆中
String s3=new String("javaEE");
String s4=new String("javaEE");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
System.out.println(s3==s4);//false
}
- 当用第二种方式创建对象时,相当于创建了两个对象:一个是在对堆空间中new的结构,一个是char[]对应的常量池中的数据“abc”
2. 两种不同的连接方式的对比
public void test3(){
String s1="javaEE";
String s2="hadoop";
String s3="javaEEhadoop";
String s4="javaEE"+"hadoop";
String s5=s1+"hadoop";
String s6="javaEE"+s2;
String s7=s1+s2;
System.out.println(s3==s4);//true
System.out.println(s3==s5);//false
System.out.println(s3==s6);//false
System.out.println(s3==s7);//false
System.out.println(s5==s6);//false
System.out.println(s5==s7);//false
System.out.println(s6==s7);//false
}
- 结论:常量与常量的拼接结果在常量池中。只要有一个是变量(对象),则结果在堆中,堆中不同的对象有不同的地址。
但是String中有一个方法可以直接在常量池中生成数据
public void test3(){
//使用此方法之后,将强制让s8的数据在常量池中生成
String s8=s5.intern();
System.out.println(s3==s8);//true
}
三、String类和其他类的转换
1. 和基本数据类型包装类的转换
- 将String类型—>基本数据类型,调用包装类的静态方法:parsexxx(str);
//两个都是表示将String型转换为基本数据
String str1="123";
int num=Integer.parseInt(str1);
String str2="123.0";
int num=Double.parseDouble(str2);
//其他基本数据类型类似
- 将基本数据类型—>String类型,
//两个都是表示将整型数据转换为String型
String str=String.valueOf(10);
String s=" "+10;
//其他基本数据类型类似
2. 和char[]类型的转换
- String类型—>char[]类型,调用 对象.toCharArray()方法
public void test4() {
String s1="javaEE";
char[] charArray=s1.toCharArray();
for (int i = 0; i < charArray.length; i++) {
System.out.println(charArray[i]);// 结果为:j a v a E E
}
}
- char[]类型—>String类型,直接调用构造器即可
char[] arr =new char[]{'h','e','l','l','o'};
String str=new String(arr);
3. 和byte[]类型的转换
- String类型—>byte[]类型,也叫编码(将字符串转换为字节流),不同的字符集有不同的编码规则。
String s1="javaEE";
byte[] byte=s1.getBytes();//使用默认的字符集进行转换
- char[]类型—>String类型,直接调用构造器即可,注意编码解码的字符集应保持一致,不然会出现乱码。
四、 String类中的常用方法
- String 类中的一些常用方法
方法 | 作用 |
---|---|
int Length() | 返回字符串的长度: return value.Length |
char charAt(int index) | 返回某索引处的字符return value[index] |
boolean isEmpty() | 判断是否是空字符串: return value.Length == e |
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(不包含)的一个子字符串。 |
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) | 根据给定正则表达式的匹配拆分此字符串。 |
Stringsplit(String regex,int limit) | 根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。 |
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