String
当我们对String类型进行操作时,往往都会用到equal()方法比较两个字符串的内容是否相等,那么问题来了,为什么我们能不能用"=="判断2个字符串内容是否相等呢?
实践是检验真理的唯一标准
代码
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="aaa";
String str_01="aaa";
System.out.println(str==str_01);
System.out.println(str.equals(str_01));
String str_02="bbb";
System.out.println(str==str_02);
System.out.println(str.equals(str_02));
String str_03=new String("aaa");
System.out.println(str==str_03);
System.out.println(str.equals(str_03));
}
结果
分析
通过上述代码,我们可以发现str= =str_01和 str= =str_03的值截然不同,前者为true 后者为false,但两者的内容都是aaa,这是为什么呢?而调用equals()方法得到的两次结果都是true,这又是为什么呢?equals()方法与==在判断字符串是否相等时,究竟有何区别?
其实,这涉及到堆栈区以及字符串池的知识。
堆栈和字符串池
当str=“aaa” 代码被执行时,str的变量名存储在栈区,在字符串池中就会开辟一个空间存储aaa字符串的地址(内容),当str_01=“aaa"该行代码被执行时,也会在字符串池中存储"aaa”,但是字符串池首先会判断当前池中是否已经存在str_01需要存储的内容(排斥),很显然,已经存在,则不会再开辟空间让str_01存储,而是直接使用之前的存储值(地址).
所以显而易见,此时 str和str_01都共同指向一个地址 ,所以str和str_01可以理解为同一个东西,因此无论用==还是调用equal方法 肯定都为true,毕竟不可能自己都不是自己吧,哈哈。
再看该图片,因为str=“bbb"代码执行时,“bbb"在字符串池中没有对应的字符串,因此新开辟一个空间存储字符串bbb。所以,很明显的可以看出,str和str_02指向了不同的地址,所以当使用”= =“判断是否相等时候,结果当然为false,毕竟一个是用玻璃杯装的水,另一个是用塑料杯装的酒,材料都不一样,怎么可能相等。当然equals()方法也为false,毕竟一个装水,另一个装酒,总不能说酒是水吧。
str_03=new String(“aaa”)改行代码的执行过程其实分为两步,第一步会先在字符串池中存储"aaa”(蓝色部分),当然也遵循之前讲的规律,因为已存在,所以不再开辟空间存储。第二步:因为使用了new关键字,依次最后会在堆区开辟一个空间存储字符串"aaa”,从而str_03指向堆区,很明显str和str_03指向了不同地址,因此“= =”的结果肯定为false,那equlas()是true还是false呢?当然为true,因为它只需要管str和str_03中装的是什么东西,不管他们是由什么制作的。
创建了几个字符串对象?
对于创建了几个字符串对象,最简单的方法就是我们只需要看字符串池和堆中有几个字符串即可,例如下面图中则有3个字符串对象
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="aaa";
String str_01=new String("bbb");
System.out.println(str==str_01);
System.out.println(str.equals(str_01))
}
初学String类,若有错误,还望谅解并给予指出,谢谢。