1,在这里"=="只会去比较应用变量的内存地址计算出来的hash码值,由于String s3=new String("abc")这段代码总共有三个对象,一个是"abc"真实值存在栈中,二是new String()对象该对象是在堆内存中属于无名的对象,最后是s3对象也是在堆内存中,所以用"=="来比较的话当然是false了
2,equals()方法的比较实现原理是首先将两个对象的内存地址进行比较,如果相同的话说明是同一个对象就会立即返回true,如果地址不同的话再将两个对象的真实值进行比较(也就是引用栈中的变量值)如果相等的话也会返回true否则返回false,所以s3.equals(s4));和s2.equals(s3);是会返回true的.
3,"=="如果比较的是基本数据类型的话只比较基本数据类型的值,而不再比内存地址.在这里是比String引用类型所以不必栈中的值只比内存地址看是否是同一个对象. |