new String()和new String(“”)都是申明一个新的空字符串,是空串 不是null;
String s = new String(“abc”);如果常量池已经有”abc”就是创建一个对象,如果没有就是创建两个对象。
String是不可变的
StringBuffer和StringBuilder是可变的
StringBuffer线程安全,
StringBuilder线程不安全
String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+”“+”ans”;
就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill“存在内存中,最后又和生成了”kvillans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的
关于equals()和==:
对于基本数据类型(byte,short,char,int,long,float,double,boolean)之间数值的比较,一般用 “==”
对于复合数据类型(String)
用“==”比较的是 他们在内存中的地址值
String s0 = “asdf”;
String s1 = “asdf”;
//System.out.println(s0==s1); –>true
String s2 = new String(“asdf”);
//System.out.println(s0==s2); –>false
//System.out.println(s0.equals(s2)); –>true
String s3 = “a” + new String(“sdf”);
//System.out.println(s0==s3); –>false
//System.out.println(s2==s3); –>false
关于intern()方法:
String s0 = “asdf”;
String s1 = new String(“asdf”);
s1 = s1.intern();
System.out.println(s0==s1); –>true
没错 当调用intern()方法时:Java先检查常量池中是否存在相同的字符串常量,如果存在 返回其地址;
否则:
System.out.println(“asdf”.intern()); –>asdf
equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。
在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。