Day07-String类
String
String类型的概述
String:字符串,使用一对""引起来表示
-
String声明为final的,不可被继承
-
String实现了Serializable接口:表示字符串是支持序列化的
实现了Comparable接口:表示String可以比较大小
-
String在内部定义了final char[] value用于存储字符串数据
-
String代表一个不可变的字符序列.简称:不可变性
体现:1. 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
2. 当对现有的字符串进行连接操作时,也需要重新指定内存区赋值,不能使用原有的value进行赋值 3. 当调用String的replace()方法修改指定的字符或字符串时,不能使用原有的value进行赋值
-
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
-
字符串常量池中是不会存储相同内容的字符串的
String不同类型实例化方式的对比
//方式一:通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中
String s1="javaEE";
String s2="javaEE";
//方式二:通过new+构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟以后对应的地址值
String s3=new String(original:"javaEE")
String s4=new String(original:"javaEE")
System.out.println(s1==s2);//ture
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
System.out.println(s3==s4);//false
person p1 = new Person(name:"Tom",age:"12");
person p2 = new Person(name:"Tom",age:"12");
System.out.println(p1.name.equals(p2.name));//ture
System.out.println(p1.name == p2.name);//ture
p1.name = "Jerry";
System.out.println(p2.name);//Tom
面试题: String s= new String("abc");方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,,另一个是char[]队形的常量池中的数据:"abc"
String不同拼接方式的对比
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;
final String s8= "javaEE";//加了final,s8是常量
String s9= s8+"hadoop";
System.out.println(s3==s4);//ture
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
System.out.println(s3==s9);//ture
String s8 = s5.intern();//返回值得到的s8使用的常量池中已经存在的"javaEEhadoop"
System.out.println(s3==s8);//ture
结论:常量与常量的拼接结果在常量池.且常量池中不会存在相同的常量
只要其中有一个是变量,结果就在堆中
如果拼接的结果调用intern()方法,返回值就在常量池中
String常用方法
String常用方法1
- int length(): 返回字符串的长度: return value.length
- char charAt(int index): 返回某索引处的字符return value[index]
- boolean isEmpty(): 判断是否是空字符串: return value.length == 0
- String toLowerCase(): 使用默认语言环境,将Sting中的所有字符转换为小写
- String toUpperrCase(): 使用默认语言环境,将Sting中的所有字符转换为大写
- Stirng trim(): 返回字符串的副本,忽略前导空白和尾部空白
- boolean equals(Object obj):比较字符串的内容是否相同
- boolean equalsIgoreCase(String anotherString):与equals方法类似,忽略大小写
- String concat(String str): 将指定字符串连接到此字符串的结尾.等价于用"+"
- int compareTo(String anotherString):比较两个字符串的大小
- String substring(int beginIndex): 返回一个新的字符串,它是此字符串的从beginEndex开始截取到最后的一个子字符串
- String substring(int beginIndex,int endIndex): 返回一个新的字符串,它是此字符串的从beginEndex开始截取到endIndex(不包含)的一个字符串
String常用方法2
-
boolean endsWith(String suffix): 测试此字符串是否以指定的后缀结束
-
boolean startsWith(String suffix): 测试此字符串是否以指定的前缀开始
-
boolean startsWith(String suffix,int toffset): 测试此字符串从指定索引开始的子字符串是否以指定前缀开始
-
boolean contain(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常用方法3
-
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 替换此字符串匹配给定的正则表达式的第一个子字符串。 jt
-
boolean matches(String regex) :告知此字符串是否匹配给定的正则表达式。
-
String[] split(String regex) :根据给定正则表达式的匹配拆分此字符串。
-
String[] split(String regex, int limit) :根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
String和其他结构之间的转换
String 与基本数据类型\包装类之间的转换
String - - > 基本数据类型\包装类:调用包装类的静态方法parseXxx(str)
基本数据类型\包装类 - - > String:调用String重载的valueOf(xxx)
String str1 = "123";
int num = Integer.parseInt(str1);
String str2 = String.valueOf(num);//"123"
String 与字符数组转换
String - - > char[]:调用String的toCharArry()
char[] - - > String:调用String的构造器
String str1 = "123";
char[] charArray = str1.tocharArray();
for(int 1 = 0;i < charArray.length;i++){
System.out.println(charArray[i]);
}
char[] arr = new char[]{'h','e','l','l','o'};
String str2 = new String(arr);
System.out.println(str2);//hello
String str2 = String.valueOf(num);//"123"
String 与字节数组转换
String - - > byte[]:调用String的getBytes()
byte[] - - > String:调用String的构造器
编码:字符串 - - > 字节( - - >看不懂的二进制数据)
解码: 字节 - - > 字符串(看不懂的二进制数据 - - >看得懂)
String str1 = "abc123中国";
byte[] byes = str1.getBytes();//使用默认的字符集,进行编码(UTF-8)
System.out.println(Arrays.toString(bytes));//[97,98,99,49,50,51,-28,-72,-83,-27,-101,-67]
String str2 = "abc123中国";
byte[] gbks = str1.getBytes(charsetName:"gbk");//使用gbk,进行编码
System.out.println(Arrays.toString(gbks));//[97,98,99,49,50,51,-42,-48,-71,-6]
new str3 = new String(bytes);//使用默认的字符集,进行解码(UTF-8)
System.out.println(str3);//abc123中国