String的一些问题

1、String类不可被继承,因为String类是final类。
源代码:public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {...}
2、String str = "hello";
   str = str + "world";原始的String对象内容到底改变了没有?
   没有改变,这是str不在指向原来的对象,而是指向另外一个对象。StringBuffer没有改变。
3、 String类型有两种内存方式:
     (1) String str = "string"; //是将变量值存放到常量池
     (2) String str2 = new String("string");//是在堆内存中
  如果再创建String str3 = "string";//这时常量池中存在变量值"string"
  将直接把"string"的引用值传给str3

4、String.intern()方法的理解

            public class StringEqualsTest {
                public static void main(String[] args) {
                    /*
                     * intern()遵循以下规则:对于任意两个字符串 s 和 t,
                     * 当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
                     *
                     * 1、new String()都是在堆内存中创建对象的,当调用intern()方法时,编译器会将字符串添加到常量池中,
                     * 并返回该常量的引用
                     * 2、通过字面量赋值创建字符串(String str=""abc)时,会先在常量池中查找是否存在相同的字符串,
                     *    如果存在,将会把栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串
                     * JDK1.7之后,intern()方法还是会先去查询常量池中是否已经存在,
                     *    如果存在,则返回常量池的引用;
                     *    如果不存在,则不再是复制一个副本放到常量池,而是将堆上的地址引用复制到常量池
                     */
                    String s1 = "programming";
                    String s2 = new String("programming");
                    String s3 = "program";
                    String s4 = "ming";
                    String s5 = "program" + "ming";
                    String s6 = s3 + s4;
                    String intern = s6.intern();
                    String intern2 = s2.intern();
                    System.out.println(s1 == s2);//false
                    System.out.println(s1 == s5);//true
                    System.out.println(s1 == s6);//false
                    System.out.println(s1.equals(s6));//true
                    System.out.println(s1 == s6.intern());//true
                    System.out.println(s1.intern() == s1);//true
                    System.out.println(s2 == s2.intern());//false
                    System.out.println(s1 == intern);//true
                    System.out.println(intern == intern2);//true
                }
            }

//可以看收藏里面的 文章https://blog.csdn.net/soonfly/article/details/70147205

5、String中“+”的重载底层原理

public class TestSimplePlus {
	public static void main(String[] args) {
		String s = "abc";
		String ss = "ok" + s +"xyz" + 5;
		System.out.println(ss);
	}
}

猜你喜欢

转载自blog.csdn.net/fighting_mjtao/article/details/81208547