Java中String类是final类型,不可被继承,String有两种赋值的方式,一种是通过String s1=”abc”,一种是通过String s2 =new String(“abc”);
第一种赋值的方式是直接用对象是指向堆内存中的abc(内存中已经存在了abc的情况下),在编译的时候已经确定其再内存中所指向的地址,而在使用一个新的Strings3=”abc”的话,这里的abc依旧是s1所指向的那个abc的地址。所以使用s1==s3的时候显示的是true;
第二种赋值方式是使用new开辟了新的堆内存,其中abc这个字符串只属于s2拥有,并且是在程序运行的时候才会分配空间,考虑到new方式是开辟新的内存空间,故使用String s4=new String(“abc”);这里使用s2==s4返回的却是false,是因为这里的两个abc都是属于“私有“的。下面看一个实例:
public void Stringfortest() {
String s1 = new String("abc");
String s2 = "abc";
String s3 = "abc";
String s4 = new String("abc");
System.out.println("the first result:" + (s1 == s2));
System.out.println("the sec result:" + (s2 == s3));
System.out.println("the th result:" + (s1 == s4));
System.out.println("the fourth result is:" + s2.equals(s4));
}
输出结果是:
the first result:false
the sec result:true
the th result:false
the fourth result is:true
String类重写了equals方法,其中equals和==的区别是:
==比较的是两个变量的值是否相等,也就是比较内存中所存储的变量值是否相同,即是比较两个变量的引用是否相等。Equals强调的是两块内存,即使对象是一块内存,变量也是一块内存,使用equals是比较两个独立对象的内容是否相同。
既然讲到了String,java中提供了另外一个操作字符串的类,StringBuffer类
它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(newString(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(newStringBuffer(“abc”)的结果为false。String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。