Java中字符串String对象的比较

String被final关键字修饰,属于常量,一旦被创建后就不可以改变了。在创建字符串时有两种方式:
第一种方式是通过字面值赋值的方式创建,
如 String s1 = "abc" ;通过这种方式创建的字符串是维护在字符串池(String Pool)中的,JVM首先检查字符串池中有没有"abc"这个对象,如果没有就创建一个,然后返回该对象的地址给s1,如果已经有该对象,这直接返回这个对象的地址给s1,也就是说通过字面值赋值的方式创建字符串返回的是对象在字符串池中的地址,即s1指向字符串池中的对象;
第二种方式是通过new关键字来创建的,
如String s2 = new String("abc"); 通过这种方式创建的字符串,还是先要检查字符串池中有无该对象,没有则创建,同时,JVM还会在堆内存中创建同样的对象,并把堆内存中的地址返回给s2,也就是说通过new关键字创建字符串返回的是对象在堆内存中的地址,即字符串指向堆内存中的对象。
请看下面的例子:
String s1 = "abc";
String s2 = "abc";
那么 (s1 == s2) = true     因为都指向字符串池中的同一个对象
String s1 = new String("abc");
String s2 = new String("abc");
那么 (s1 == s2) = false    因为一个new对应一个对象所以指向的是堆内存中不同对象
String s1 = "abc";
String s2 = new String("abc");
那么(s1 == s2) = false    因为一个指向字符串池中的对象,一个指向堆内存中的对象
但是上面三个例子中的s1和s2所指向的对象的内容是相同的,应该按照相同的字符串来处理,若使用==来比较字符串,可能会返回错误结果,因此,对于字符串的比较要使用equals方法。equsla属于Object类中的一个方法,它比较的是调用它的引用与传进来的那个对象的引用是否一样,即两个引用是否指向同一个对象。


你可能感兴趣的:(java,String,equals)