java的基本数据类型:
String提要 1.string对象一旦创建就就不会修改。一味的修改String对象的值会创造垃圾,应该用StringBuffer来做修改。 例1 String str1="hello";//创建一个对象hello,不会变; System.out.println(str1); str1+=" world!";//两个字符串对象粘粘,系统其实创建了一个新的对象,把Str1的指向改了,指向新的对象;hello就 //变成了垃圾; System.out.println(str1); //如果一直这样创建会影响系统的效率;要频繁的改变字符串对象的值就用StringBuffer来描述; StringBuffer sb=new StringBuffer("["); sb.append("hehe"); sb.append("]");//append();不会制造垃圾,真正在改sb的值; System.out.println(sb); String两种创建方法比较 使用String str1 = new String(“abc”)方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。 例2 String str1 = new String("abc"); /*jvm 在堆上创建一个String对象 jvm 在strings pool中找不到值为“abc”的字符串,因此在堆上创建一个String对象,并将该对象的引用加入至strings pool中*/ Stirng str2 = "abc"; //并没有创建对象,因为对象池里已经有"abc" 了 if(str1 == str2){ System.out.println("str1 == str2"); }else{ System.out.println("str1 != str2"); } //打印结果是 str1 != str2,因为它们是堆上两个不同的对象,一个是引用,一个指向堆。 String str3 = "abc"; //此时,jvm发现strings pool中已有“abc”对象了,因为“abc”equels “abc” //因此直接返回str2指向的对象给str3,也就是说str2和str3是指向同一个对象的引用 if(str2 == str3){ System.out.println("str2 == str3"); }else{ System.out.println("str2 != str3"); } //打印结果为 str2 == str3 String intent String.intern():再补充介绍一点,存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern() 方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;看例3就清楚了。 例3 String s0= "kvill"; String s1=new String("kvill"); String s2=new String("kvill"); System.out.println( s0==s1 ); System.out.println( “**********” ); s1.intern(); s2=s2.intern(); //把常量池中"kvill"的引用赋给s2 System.out.println( s0==s1); System.out.println( s0==s1.intern() ); System.out.println( s0==s2 ); 结果为: false ********** false //虽然执行了s1.intern(),但它的返回值没有赋给s1 true //说明s1.intern()返回的是常量池中”kvill”的引用 true-关于toString 如果想要StringBuffer在屏幕上显示,要先调用toString()方法转化为字符串常量,因为printStream的print方法不接受StringBuffer.