a "对应一个字符串对象,
String a = "a ";
只是让变量a引用到这个对象。而
String a = new String( "a ");
以这个已有的对象 "a "为样本,构造出一个内容完全相同的另一个对象,然后让变量a引用到它。
但是字符串的驻留优化机制是这样实现的:
当我们创建一个string对象的时候,JIT编译器会将该字符串的值写进一张哈希表里面,如果再有新的字符串对象被创建,就会与哈希表里面的值进行对比,如果你所创建的对象已经存在与哈希表内,就把该指针指向表里面的那个对象,不会再新建对象,这样就实现了共享。
到底该怎么说String a="a";和String a=new String("a");的区别是什么.
求解释。
String a = "a ";
只是让变量a引用到这个对象。而
String a = new String( "a ");
以这个已有的对象 "a "为样本,构造出一个内容完全相同的另一个对象,然后让变量a引用到它。
但是字符串的驻留优化机制是这样实现的:
当我们创建一个string对象的时候,JIT编译器会将该字符串的值写进一张哈希表里面,如果再有新的字符串对象被创建,就会与哈希表里面的值进行对比,如果你所创建的对象已经存在与哈希表内,就把该指针指向表里面的那个对象,不会再新建对象,这样就实现了共享。
到底该怎么说String a="a";和String a=new String("a");的区别是什么.
求解释。
解决方案 »
- 项目工程无法编译通过
- C#的数据类型有?
- C#如何在运行的时候找到一个对象的所有的引用,即引用这个对象的所有的对象
- 求PDF阅读控件
- 开发布局管理器
- 没办法,出100分征求答案:ExecuteScalar得到的object,等于0时无法强制转成int
- 请问谁有installshield 10.01 express版的注册码,先行谢谢了................
- 读取带参数网页内容的问题
- 对于接口,有些不明白........不知道的程序中需要使用接口吗??????????
- 我想在textBox(Windows.Form)中限制客户只能输入数字,怎么设定?
- VS2005怎么给C#程序加个盾牌?不知道怎么加manifest
- WPF tabcontrol控件SelectionChanged事件问题
这句能编译过么?
这个是Java才有的写法再来说说这段话内容的含义。 当我们创建一个string对象的时候,JIT编译器会将该字符串的值写进一张哈希表里面,如果再有新的字符串对象被创建,就会与哈希表里面的值进行对比,如果你所创建的对象已经存在与哈希表内,就把该指针指向表里面的那个对象,不会再新建对象,这样就实现了共享。实际上 当你声明出一个 "a" 对象的时候,它在内存当中会占用一个位置存放它自己 我们假设内存是一个九宫格,他能存9个对象,坐标分别为[align=center][1,1] [1,2] [1,3]
[2,1] [2,2] [2,3]
[3,1] [3,2] [3,3][/align]
这样的一个盒子String str1 = "a";
假设str1的坐标为[1,1]
这个时候你声明一个str2 而str2的值还是"a"
String str2 = "a";
那么计算机就认为"a"已经存在 str2的坐标也应该是[1,1]注意:在.net中"=="已经被重载为比较对象了,如果你要比较引用的话必须用Object.ReferenceEquals(obj1,obj2)这个方法。
用上述方法可以得到str1和str2的引用是一样的 结果是true这时你也许会产生一个疑问,当改变str2的值的时候str1岂不是也变了。
str2 = "b";
执行这句话的时候,和上面是等效的。计算机会在这个九宫格里面找"b"没有发现的话,就会在其他的格子里面放进去一个"b" 假设这个对象存在[1,2]格子里面。那么此时str2指向的就是[1,2]了,和str1一点关系都没有。String strA=new String('a',1);
String strB=new String('a',1);
A和B的引用是两个,说明new String是直接开辟一个新内存具体可以自己尝试一下,记得比较引用用Object.ReferenceEquals(obj1,obj2)这个方法,不要用“==”