完全用例子告诉你!不过首先你要清楚问题问的是什么?
首先,因该明白String是引用类型,是一个类,是一个不可变的类,并且有着特殊的作用。
String 只能复制一次!复制后不可改变!
String s = new String(“abc”);
s = new String(“cba”);
以上的代码并不是对s进行赋值,而是将“abc”的引用地址,从新赋给了s;
这个过程的内存是怎么分配的呢?
有几个问题要给大家说明一下:
1.String s = new String("abc");
//在运行时涉及几个String实例?
答案:两个,一个是字符串字面量"xyz"所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,另一个是通过new
String(String)创建并初始化的、内容与"xyz"相同的实例。
2.String s = new String("abc");//
涉及用户声明的几个String类型的变量?
答案:一个,就一个String s 。
3.String s = null;
Java里变量就是变量,引用类型的变量只是对某个对象实例或者null的引用,不是实例本身。声明变量的个数跟创建实例的个数没有必然关系。
4.String s = new String("abc");
//创建了几个String Object?
答案:两个,一个是“abc”——这是一个匿名对象;一个是指向“abc”的引用对象s——这个是将匿名对象的地址赋给了s。
下面我们来看一段代码:
public class text{
public static void main(String[] args){
//定义一个str
String str = new String("abc");
//定义一个str1
String str1 = "abc";
//定义一个str2
String str2 = "abc";
System.out.println(str1 == str);
System.out.println(str2 == str1);
}
}
运行结果是什么呢?
为什么第一个运行结果是false呢? 在这里"==" 其实比较的是他们在堆内存中的地址,因为str 和 str1 在堆内存中的地址不同的所以运行结果是false;
为什么第二个运行结果是true呢? 在这要说明一下,Sting是一个共享式输出类型,在内存中有一个String pool 用于存放String类型中相同的值。所以在给str2赋值的时候,JVM会在String pool中查找是否有与其所赋的值相等,如果相等就将相等的值的地址赋给str2,如果没有则在String pool中新开辟一块控件存放str2的内容。
这是我现在对String的一些理解,如果有错误,希望大家指出来,在这里谢谢大家了!
posted on 2010-10-16 23:51
tovep 阅读(372)
评论(4) 编辑 收藏