String不是基本数据类型
String是不可变对象:不可变的原因是因为String内部通过char数组来保存字符串,而这个char数组被声明为:final
Java中是否可以继承String类?
不可以,因为String类有修饰符,而final修饰的类是不能被继承的
区分对象和对象引用
对于java初学者,对于String是不可变对象总是存在疑惑
例子:String s=”aaaa”;
System.out.println(“s=”+s);
s=”bbbb”;
System.out.println(“s=”+s);
打印结果为:
S=aaaa
S=bbbb
根据结果貌似String是可变的,其实这里存在一个误区,s只是String对象的一个引用而不是对象本身。当执行 s=”bbbb”;时,又创建了一个新的对象,s又指向了这个新的对象
StringBuffer是线程安全的
StringBuilder不是线程安全的
==和equals
==是比较地址值是否相等,equals比较对象值是否相等
例一:
String s= “hello”
String t=”hello”
Char c[]={‘h’,’e’,’l’,’l’,’o’};
下列选项中返回false的语句是:
(A) s.equals(t) (B)t.equals(c) (C)s==t (D)t.equals(new String(“hello”))
c在是一个数组,也是一个对象,存在堆里面。t存在常量池里。地址不一样,所以会报错
例二:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2));//true
String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true
s3--hello放在堆里。s4--hello放在常量池里,地址不一样,所以s3==s4会报错。
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6); //true
System.out.println(s5.equals(s6));//true