String的特性
String底层源码
1、String声明为final,不可被继承
2、String实现了Serializable接口:表示字符支持序列化
实现了Comparable接口:表示String可以比较大小
3、String内部定义了final char[] value用于存储字符串
4、通过字面量的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中。
5、字符串常量池不会存储相同内容的字符串。
6、String:代表不可变的字符序列。简称:不可变性。
体现:
1.当对字符串重新定内存区域赋值,不能使用原有的value赋值。
2.当对现有的字符串连接操作时,也需要重新指定内存区域赋值,不能使用原有的value赋值。
3.当调用String的replace()修改字符或字符串时,也需要重新指定内存区域赋值。
String的实例化对比
方式一:通过字面量定义
String s1 = "abc";
方式二:通过new+构造器
String s2 = new String("abc");
两种方式的区别
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);//false
解析:
s1存储的是常量池中abc的地址值。
s2存储的是堆中String对象的地址值,此对象存储的才是常量池中abc的地址值。
字符串对象是如何存储的
Person p1 = new Person("Tom",12);
Person p2 = new Person("Tom",12);
System.out.println(p1.name == p2.name);//true
解析:
通过字面定义的String都定义在常量池中,p1,name,p2.name地址值指向的是同一个name,同一个地址,所以是true。
Sting拼接操作对比
结论
1、常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2、只要其中一个是变量,结果就在堆中。
3、如果拼接的结果调用inter(),返回值就在常量池中。
String s1 = "abc";
String s2 = "123";
String s3 = "abc123";
String s4 = "abc" + "123";
String s5 = s1 + "123";
String s6 = "abc" + 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 s8 = s5.intern();
System.out.println(s3 == s8);//true
final String s9 = "abc";//final修饰,此为常量。
String s10 = s9 + "123";
System.out.println(s3 == s10);//true
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 | 返回字符串的副本,忽略前导空白和尾部空白 |
String equals(Object obj) | 比较字符串内容是否相同 |
boolean equalslgnoreCase(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) | 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索 |
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个,如果超过了,剩下的全部都放到最后一个元素中 |
String与其他结构之间的转换
String与基本数据类型、包装类之间的转换
String——>基本数据类型、包装类
调用包装类的静态方法:parseXxx(str)
String str1 = "123";
int num = Integer.parseInt(str1);
基本数据类型、包装类——>String
调用String重载的valueOf(xxx)
String str2 = String.valueOf(num);
String与char[]之间的转换
String——>char[]:
调用String的toCharArray()
String str1 = "abc123";
char[] charArray = str1.toCharArray();
char[]——>String:
调用String的构造器
char[] arr = new arr[]{'h','e','l','l','o'};
String str2 = new String(arr);
String与byte[]之间的转换
String——>byte[] (编码,字符串–>字节):
调用String的getBytes()
String str1 = "abc123中国";
byte[] bytes = str1.getBytes();//使用默认字符即,进行转换
System.out.println(Arrays.toString(bytes));
byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码
System.out.println(Arrays.toString(gbks));
byte[]——>String(解码,字节–>字符串):
调用String构造器
String str2 = new String (bytes);//使用默认字符集,进行解码
System.out.println(str2);
String str3 = new String(gbks);
System.out.println(str2);//出现乱码
//原因:编码字符集时UTF-8,解码字符集时GBK。编码解码需要相同。