字符串的创建
String类代表字符串,Java中所有的字符串文字都是此类的实例
Java程序中所有的双引号字符串都是String的对象
字符串的特点
-
字符串长度不可变,他们的值在创建后不可被更改
-
虽然字符串的值是不可变的但是它们可以被共享
-
字符串效果上相当于字符串数组(char[])但是底层逻辑是字节数组
字符串的常用基本构造方法
public String();
package dayhou40.day43; public class Stringtest { public static void main(String[] args) { String s1 = new String(); s1="123"; System.out.println("s1:"+s1); } }
public String(char[]); 根据字符数组来创建字符串对象
package dayhou40.day43; public class Stringtest { public static void main(String[] args) { char[] c= {'a','b','c'}; String s1 = new String(c); System.out.println("s1:"+s1); } }
public String(byte[]); 根据字节数组来创建字符串对象
package dayhou40.day43; public class Stringtest { public static void main(String[] args) { byte[] b= {97,97,97}; String s1 = new String(b); System.out.println("s1:"+s1); } }
String="";直接赋值的方式创建字符串对象
String对象的特点
-
通过new创建的字符串每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同
-
下面的代码JVM会首先创建一个字符串数组,然后再每次new对象的时候都会有一个新的地址只不过s1和s2的值一样
package dayhou40.day44; public class Stringtest { public static void main(String[] args) { char[] c= {'a','b','c'}; String s1 = new String(c); String s2 = new String(c); System.out.println(s1==s2); } }
在内存中的情况如下
-
通过""创建出来的字符串,只要字符序列相同(顺序和大小写一样),无论代码出现多少次JVM都会创建一个String对象,并在字符串池中维护
-
对下面的代码JVM会建立一个String对象放在字符串池中
package dayhou40.day44; public class Stringtest { public static void main(String[] args) { String s1="abc"; String s2="abc"; System.out.println(s1==s2); } }
字符串的比较
package dayhou40.day44; public class Stringtest { public static void main(String[] args) { char[] c ={'a','b','c'}; String s1="abc"; String s2="abc"; String s3 = new String(c); String s4 = new String(c); System.out.println(s1==s2); System.out.println(s1==s3); System.out.println(s1==s4); System.out.println("==================="); System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); System.out.println(s1.equals(s4)); } }
由此可见虽然地址不同但是值是相同的