1、String类表示字符串,理解为不可变的字符序列
2、String类声明为final,不可被继承
3、String类实现了Serializable接口:表示字符串是支持序列化的(序列化:可将java对象转变为二进制文件,从而传输这个java对象)
4、String类实现了 Comparable接口:表示字符串可以比较大小
5、底层用final char[] value存储
String s1="abcd"
该方式首先在栈空间里声明了一个String类型变量s1,然后在方法区中的常量池里存储abcd,将存储地址值(Ox0001)赋给s1,使s1指向abcd
String s2=new String(“abcd”);
该方式首先在栈空间里声明了一个String类型变量s2,然后在堆空间开辟一片空间,将该空间的地址值(Ox1111)赋给s2,使s2指向它。在方法区中的常量池里存储abcd,将存储地址值(Ox0001)赋给value属性,使它指向abcd
图中所示地址值均为假设地址值
其余类创建对象只有构造器方式
1、str="aaa"+"bbb"
字符串常量和字符串常量连接后依然存在于常量池中,而常量池中相同的数据只存在一份。
因此若连接后的数据(aaabbb)已经在常量池中存在,就将该地址赋给接收它的变量(str)
若不存在,将在常量池中开辟空间存储连接后的数据(aaabbb),将新开辟的地址赋给接收它的变量(str)
2、str=s1+"bbb"
字符串变量和字符串常量连接后,先在堆空间new一个对象,将该对象的地址赋给接收它的变量(str),再让该对象指向常量池。因此,无论连接后的数据是否在常量池中存在,连接后的变量(str)指向的都是堆空间中对象的地址
2、str=s1+s2
字符串变量和字符串变量的连接,同2。
代码示例:
public class StringTest { public static void main(String[] args) { String s1="aaa"; String s2="bbb"; String s3="aaabbb"; String s4="aaa"+"bbb"; System.out.println(s3==s4);//true,常量池中相同的数据只存在一份,因此s4被赋上的是s3的地址 String s5=s1+"bbb"; System.out.println(s3==s5);//false,只要有一个是变量,就相当于在堆空间new了一个对象,该对象再指向常量池。因此s5被赋上的是堆空间中new出来的对象的地址 String s6=s1+s2; System.out.println(s5==s6);//false,两个都是变量,就相当于在堆空间new了一个对象,该对象再指向常量池。因此s6被赋上的是堆空间中new出来的对象的地址 System.out.println(s3==s6.intern());//true,intern()方法返回常量池中的存储地址 } }
public class StringTest2 { public static void main(String[] args) { String str="Hello World"; System.out.println("该字符串的长度是:"+str.length());//包括空格 System.out.println("下标为1的字符是:"+str.charAt(1)); System.out.println("该字符串是否为空:"+str.isEmpty()); System.out.println("全部转换为小写:"+str.toLowerCase()); System.out.println("全部转换为大写:"+str.toUpperCase()); str=" Hello World "; System.out.println("去掉首尾空格:"+str.trim()); String s1="Hello World"; String s2=new String("Hello World"); System.out.println("s1和s2的地址值是否相同:"+(s1==s2));//==比较地址值 System.out.println("s1和s2的内容是否相同:"+s1.equals(s2));//equals比较内容 } }
equalsIgnorCase(object anObject):忽略大小写之后比较字符串内容是否相同
concat(String str):拼接字符串
compareTo(String anotherString):比较字符串大小
substring(int beginIndex):从指定索引处截取子串
startsWith(String prefix):是否以指定子串开始
endsWith(String suffix):是否以指定子串结束
contains(String str):是否包含子串
indexOf(int ch):返回子串第一次出现的索引,没有出现过返回-1
lastIndexOf(int ch):返回子串最后一次出现的索引,没有出现过返回-1
replace(char oldChar,char newChar):用新字符代替旧字符
matches(String regex):按正则表达式进行匹配
split(String regex):按正则表达式将字符串拆分成字符串数组
Integer.parseInt(str)
String.valueOf(i) 或 i+""