String必知必会
String类型
一、相关概率
二、String字面量和new String()的区别
三、字符串常量拼接
四、字符串常量+字符串变量、字符串变量之间的拼接
五、String常用的方法
一、相关概率
- String声明为final,不可被继承
- String实现了Serializable接口 表示字符串是支持序列化。
- String实现了Comparable接口 表示String可以进行比较大小
- String内部定义了final char[] value用于存储字符串数据
- String代表不可变的字符序列。简称:不可变性(由于String对象的内容(
对象内存地址所存的内容
)是不能改变的,但String引用(变量)
是可以改变的,可以让其指向另外一个字符串。(不能修改字符串的内容,但可以修改字符串的引用
))
二、String字面量
String str1="abc";
String str2="abc";
赋值的过程是:
1.首先在编译期,JVM会去常量池来查找是否存在abc
如果有则str1
直接引用,如果没有则在字符串常量池创建abc
2.str2="abc"
同上原理 先去方法区中的字符串常量池中找是否有abc
如果有则str2直接引用,如果没有则在字符串常量池创建abc
总结:字符串常量池中不会存放相同内容的字符串
二、new String()
String str = new String("abc")
赋值的过程是:
1.先去在编译期,JVM会去常量池来查找是否存在abc
如果不存在就创建,存在的话直接引用地址
2.然后在运行时期,通过new String()在堆空间开辟了一块str
的空间,然后直接引用字符串常量池abc
的地址
三、字符串常量拼接
String str3 = "Hello"+" word";
String str4 = "Hello word";
System.out.println(str3 == str4); //true
上面是字符串常量拼接的例子:在编译时,JVM编译器对字符串做了优化,str3
就被优化成“Hello word”
,str3
和str4
指向字符串常量池同一个字符串常量,所以==比较为true
其实还有一种拼接方式可以使字符串与变量的拼接也去和常量池中的字符串比较:
String str1 = "Helloworld!";
final String str2 = "Hello";
String str3=str2+"world!";
System.out.println(str1 == str3); //true
上面是给str2变量加上了final修饰符,就是把变量变成了常量,所以==比较为true
四、字符串常量+字符串变量、字符串变量之间的拼接
String str5 = "Hello";
String str6 = " word";
String str7 = "Hello word";
String str8 = str5+" word";
System.out.println(str7 == str8); //false
String通过+号来拼接字符串的时候,如果有字符串变量参与,实际上底层会转成通过StringBuilder的append( )方法来实现,大致过程如下:
StringBuilder sb = new StringBuilder();
sb.append(str5);
sb.append(" word");
str8 = sb.toString();
StringBuilder的 toString( )方法底层new了一个String对象,所以str8在堆内存中重新开辟了新空间,而str7指向常量池,所以str7
== str8
为false。变量字符串拼接和常量字符串拼接结果是不一样的。因为变量字符串拼接是先开辟空间,然后再拼接
小知识点(加分点):
String str1="Hello";
String str2="World!";
String str3="HelloWorld!"
String str8 = (str1+str2).intern();
System.out.println(str8 == str3); //true
如果拼接的结果调用intern(),返回值就在常量池中
五、String常用的方法
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(Object obj) | 与equals相同,但忽略大小写 |
String concat(String str) | 将指定字符串连接到此字符串结尾。等价于用“+” |
int compareTo(String anotherString) | 比较两个字符串的大小 |
String subString(int beginIndex) | 返回一个新的字符串,他是从此字符串的beginIndex开始截取的 |
String subString(int beginIndex,int endIndex) | 返回一个新的字符串,他是从此字符串的beginIndex到endIndex截取的 //begin是包含的 end是不包含的 例如:String必知必会 取出Str 要这么取str.substring(0,3) |
int indexOf(String str) | 返回指定子字符串第一次出现的字符串内的索引 |
int lastIndexOf(String str) | 返回指定字符的最后一次出现的字符串中的索引 |
String replace(char oldChar, char newChar) | 用于替换字符串oldChar 要被替换的字符串 newChar 替换的字符串 也有使用正则替换的方法如replaceAll() replaceFirst() |
String[] split(String regex)` | 用于指定字符切割,返回切割后的数据用数组接收 |
String valueOf(int i) | 用于把int型数据转换成字符串 所有类型都可使用此方法转换数据 |
boolean endsWith(String suffix) | 测试此字符串是否是指定的后缀结束 |
boolean startsWith(String suffix) | 测试此字符串是否是指定的前缀开始 |
boolean startsWith(String suffix,int toffset) | 测试此字符串是否是指定索引开始的子字符串的前缀开始 |
boolean contains(CharSequence s) | 用于判断此字符串是否包含指定的数据 |
char[] toCharArray() | 用于把字符串转换成char类型数组 ,如果char[] 数组,想转字符串可以使用new String(char[] c) |
byte[] getByte() | 使用平台的默认字符集将此 String 编码为字节序列,将结果存储到新的字节数组中。也可以在构造器内改其他编码,例如str.getBytes("gbk"); 也可以使用new String(bytes,"gbk"); 对字节进行解码 |