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,那现在str1和str2都指向同一个内存空间地址,比如“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作业