/** * String s1 = "a"; * 编译器会先检查常量池中是否已经有"a": * 如果没有,则在常量池先创建,后引用. * 如果有,则直接引用; * 所以执行该语句,会产生0个或1个对象. * 这里,会创建1个对象. */ String s1 = "a"; /** * String s2 = new String("a"); * 编译器先在堆中创建一个对象,然后去常量池中检查是否已有"a": * 如果没有,则先在常量池创建,然后将堆中的引用指向常量池的对象; * 如果有,则直接将堆中的引用指向常量池中的对象; * 所以执行该语句,会产生1个或2个对象. * 这里,会创建1个对象. */ String s2 = new String("a"); System.out.println(s1==s2); //false
以上代码,在jvm简单内存图可简述为:
而以上==比较的会是对象的地址,所以结果为false
时间: 2024-11-05 21:57:47