equals是堆中的内容相同 string a="a"它产生的对象只放在栈中 在堆中是没有的 为什么 b.equals(a)返回true?
string a="a"创建的一个对象放在栈中String b=new string("a")创建的两个对象分别放在栈和堆中 a==b为什么是错误的?b在栈中的
答案:5 悬赏:70 手机版
解决时间 2021-08-13 01:12
- 提问者网友:心如荒岛囚我终老
- 2021-08-12 16:29
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-08-12 17:28
你在创建一个string a="a"的时候,a就在指向在栈区开辟的值。
而String b=new string("a"),你实例化对象的时候,b就在堆区开辟空间。
a和b一个在栈区一个在堆区,你用==意思是比地址,他们两个的地址就不一样了,返回false.
而用equals的话是比的内容,返回true.
全部回答
- 1楼网友:孤独的牧羊人
- 2021-08-12 20:36
string a = "a";
string b = new String('a', 1);
Console.WriteLine(a == b);
Console.WriteLine(b.Equals(a));
Console.ReadLine();
=======================
输出结果是true,true
楼上是MVP么?string放栈里?汗一个
我们看看以上code的MSIL吧
IL_0000: nop
IL_0001: ldstr "a" // 在string pool开辟一块内存,用于存放"a"
IL_0006: stloc.0 // 当前线程堆栈中的第一个本地变量指向托管堆中存放"a"的地址
IL_0007: ldc.i4.s 97 // 读取 ASCII 97到线程堆栈中,具体指令意思差msdn吧.....
IL_0009: ldc.i4.1 // 这里是把构造函数的1存入线程堆栈
IL_000a: newobj instance void [mscorlib]System.String::.ctor(char,
int32)
// 很显然,用newobj就是在托管堆上创建了对象,在线程堆栈中的对象都用initobj,这里还invoke了 string的构造函数
IL_000f: stloc.1 //然后把以上托管堆中的内存地址赋给线程堆栈上的第二个本地变量
IL_0010: ldloc.0 //读取第一个本地变量的值
IL_0011: ldloc.1 //读取第二个本地变量的值
IL_0012: call bool [mscorlib]System.String::op_Equality(string,
string) //这个不用我多结束吧,调用了==操作符的方法
IL_0017: call void [mscorlib]System.Console::WriteLine(bool) //不解释
IL_001c: nop
IL_001d: ldloc.1 //这个也不解释
IL_001e: ldloc.0 //参考上边的注释
IL_001f: callvirt instance bool [mscorlib]System.String::Equals(string) //callvirt调用实例方法Equals
IL_0024: call void [mscorlib]System.Console::WriteLine(bool) //call是用来调用静态方法的
IL_0029: nop
IL_002a: call string [mscorlib]System.Console::ReadLine()
IL_002f: pop
IL_0030: ret
- 2楼网友:人類模型
- 2021-08-12 19:28
a==b是比较对象句柄的值,不是比较句柄所指向的内容。a.equals(b)才相等。因为new 开辟出了新空间,所以对象句柄指向的内存空间不一样,==就不成立。若是a="abc",b="abc";a==b;则因为没有开出新的内存空间,a和b所指向的内存地址都是“abc".则相等成立。
- 3楼网友:逃夭
- 2021-08-12 19:19
equals比较的是两个的值,而==比较的是两个的地址
- 4楼网友:慢性怪人
- 2021-08-12 17:46
string a="a"谁告诉你他放在栈里面的?stirng是引用数据类型,你应该知道,只要是引用数据类型都放在堆里~string a=”a“做的事情就是 string a = new string("a");”a“是放在堆里面的,而a是做了一个指向,也就是句柄。equals是用来比较值的……因为值都是"a"所以返回true==是判断地址,两个"a"的地址不是同一个,当然不想等
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯