用eclipse运行这个代码为什么第一个用==来判断a和b得出的结果也是true,不应该是false吗。String类型不是应该和数组一样,创建的String类型的对象a只是充当一个管理者的身份吗?所以a和b虽然内容一样,但是他们是两个不同的对象。求解答。
首先==比较的是内存中的地址值,第二,java中有个String缓冲池,当直接String a = "hello"时会先判断缓冲池中是否有"hello",如果没有会创建一个"hello"并将它放到缓冲池中,如果有则直接将a指向缓冲池中的"hello", 所以在次定义String b = "hello"时缓冲池中已经有"hello", 会将b也指向将"hello", 故==比较时是相等的。如果用String b = new String("hello")时,遇到new关键字时会强制堆中创建一个对象(此时不管缓存池中有没有"hello"), 所以这个a和b指向的是不同的堆对象,==比较是不相等的
对象a,b指向同一个常量。
Java为了加快程序的执行速度,把隐式创建的字符串对象放在栈中一个特殊区域—字符串池(String Pool)中,相同内容的字符串对象只保留一份,用引号新产生字符串对象时先从字符串池中寻找是否已经存在,若已经存在就取出来直接使用。
a==b 比对的是存储地址是否一样
equals比对的是值