创建一个字符串变量有两种方式:
String str1="123";
String str2=new String("123");
第一种方法JVM在执行双引号操作符的时候,会自动的去String对象池中搜索该字符串是否已经被创建,如果已经被创建则返回一个引用,如果没有就先创建再返回引用。
第二种方法,new语句会直接创建一个新的String对象,并把引用返回。
JVM在启动的时候会实例化9个对象池,分别用来存储8中基本数据类型的包装类对象和String对象,主要是为了效率问题。Java的字符串String对象有一个特性,就是不变性,它只能被创建不能被修改。
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
str1.equals(str2)返回true
str1==str2返回true,因为当定义str2时,String对象池中已经有了“abc”,所以直接返回引用,即str1和str2是对同一个对象的引用
str1.equals(str3)返回ture
str1==str3返回false,因为new运算符会直接创建一个新的对象
equals方法比较的是对象的值是否相同,==用于比较两个对象是不是同一个对象或者两个基本数据类型变量值是否相等。
因为String对象的不变性,Java提供了StringBuffer和StringBuilder类来进行字符串的拼接等操作,但是StringBuffer不是线程安全的,StringBuilder是线程安全的。