1.String 类是不可改变的解析,例如:
String s = "Google"; System.out.println("s = " + s); s = "Runoob"; System.out.println("s = " + s);
输出结果为:
Google Runoob
从结果上看是改变了,但为什么门说String对象是不可变的呢?
原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。
2.length() 方法,length 属性和 size() 方法的区别:
- 1、length() 方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
- 2、length 属性是针对 Java 中的数组来说的,要求数组的长度可以用其 length 属性;
- 3、Java 中的 size() 方法是针对泛型集合说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!
这个例子来演示这两个方法和一个属性的用法:
public static void main(String[] args) { String []list={"ma","cao","yuan"}; String a="macaoyuan"; System.out.println(list.length); System.out.println(a.length()); List array=new ArrayList(); array.add(a); System.out.println(array.size()); }
输出的值为:
3 9 1
3.面试问题
面试题一:
String s1 = "abc"; // 常量池 String s2 = new String("abc"); // 堆内存中 System.out.println(s1==s2); // false两个对象的地址值不一样。 System.out.println(s1.equals(s2)); // true
面试题二:
String s1="a"+"b"+"c"; String s2="abc"; System.out.println(s1==s2); System.out.println(s1.equals(s2));
java 中常量优化机制,编译时 s1 已经成为 abc 在常量池中查找创建,s2 不需要再创建。
面试题三:
String s1="ab"; String s2="abc"; String s3=s1+"c"; System.out.println(s3==s2); // false System.out.println(s3.equals(s2)); // true
先在常量池中创建 ab ,地址指向 s1, 再创建 abc ,指向 s2。对于 s3,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到 abc ,再调用 toString() 转换得到的地址指向 s3。故 (s3==s2) 为 false。