String 一些问题

来源:互联网 发布:mysql front 注册码 编辑:程序博客网 时间:2024/06/05 12:50

前言:

等号“==”对于基本类型,比较的是值,对于引用类型,比较的是内存地址。


1.在对象池中创建,如果常量池中已经存在则返回常量池中已经有的。

private static void test1() {String s1 = "jiaozi";String s2 = "jiaozi";System.out.println("1       " + (s1 == s2));}
结果:true

2.一个在String pool中,一个在堆中。

private static void test2() {String s1 = "jiaozi";String s3 = new String("jiaozi");// 参数是池中(如果没有则创建一个)的,但是s3指向的是堆中的数据System.out.println("2       " + (s1 == s3));}
结果:false

3.编译以后,s4="jiaozi".

private static void test3() {String s1 = "jiaozi";String s4 = "jiao" + "zi";System.out.println("3       " + (s1 == s4));}
结果:true

4.intern方法返回Strng pool中的对象,另外对于字符串a.equals(b),那么a.intern() == b.intern(),反之亦然。

private static void test4() {String s1 = "jiaozi";String s6 = new String("jiaozi");String s5 = s6.intern();// 返回的是池中的数据System.out.println("4       " + (s1 == s5));}
结果:true

5.只要有new存在就会在堆中生成一个对象

private static void test5() {String s3 = new String("jiaozi");// 参数是池中的,但是s3指向的是堆中的数据String s6 = new String("jiaozi");// 又是在堆中创建。System.out.println("5       " + (s6 == s3));}
结果:false
6.同第3个

private static void test6() {String s7 = "jiaozi1";String s8 = "jiaozi" + 1;System.out.println("6       " + (s7 == s8));}
结果:true

7.对于字符串的相加,内部使用StringBuilder类的append,和toString()来实现,toString()中调用了构造函数,会在堆中生成一个对象。

private static void test7() {String ab1 = "ab";String b = "b";String ab2 = "a" + b;System.out.println("7       " + (ab1 == ab2));}
结果:false