posts - 0,comments - 0,trackbacks - 0
1.String 类中的内容一旦声明则不可改变
2.String有两种赋值方式(直接赋值和用new开辟空间)
3.String是Java中共享模式的一种应用

在这里举一个例子:
public class Text{
          public static void main(String[] args){
            String st="abc";
            System.out.println("abd".equals(st));
       }
}
其中“abc”就是String的匿名对象,String类中的内容一旦声明则不可改变。比如:
public class Text{
          public static void main(String[] args){
            String str1="abc";
            str1+="def";
            System.out.println(str1);
       }
}
        运行结果为abcdeg,过程如下:String str1="abc",证明栈内存中有个str1,在堆内存中的内容是str1+="def";首先是先有“def”在堆内存中开辟空间;然后再进行str1+"def"运算所得的字符串“abcdef”又在堆内存开辟一个空间。原来str1所占的堆内存空间,现在str1+"def"运算所得的字符又赋给str1,所以str1先断开指向“abc”的连接,最后就指向“abcdef”新的空间与其建立连接。
        虽然以上显示String的内容改变了,但是实际上而言,String改变的只是其内存地址的指向,而其本身的内容没有被改变。所以说这样写代码影响程序的性能。

问题:只要是字符串就是一个String匿名对象吗?
            在String类中如果一个字符串已经明确了一个对象的指向,则以后其他的String对象如果声明的内容是一样的,则自动指向同一个空间。
比如:
public class Text{
          public static void main(String[] args){
            String str1="abc";
            String str2="abc";
            System.out.println(str1==str2);
       }
}

  原来的abc有没被引用到,我们知道原来的abc已经被str1引用, 那么就不可能再生成另外一个abc, 只会将原来的abc地址指向str2,那现在str1str2都指向同一个内存空间地址,比如abc内存空间地址为0x1000哈,我们进行System.out.println(str1==str2);
代码中进行==比较时得到的运算结果就是true了, 所以说如果内存中已经有相同内容的地址话,我们就不要再开辟新的空间了,如果没有的话,那我们就要重新声明开辟新的空间。
 
String str1 = new String(abc) ;代码中我们知道abc是匿名对象,那么在堆内存中就会有块空间是abc,紧接着new String("abc") 使用new在堆内存中又开辟了一个空间abc,最后String str1 = new String("abc") ;代码将最后生成的abc内存地址指向str1,早的一个abc就没使用上。

posted on 2010-10-17 22:22 和贝贝 阅读(98) 评论(0)  编辑  收藏 所属分类: 关于Java作业