比较String字符串时候注意看是用什么去创建的字符串 注意:字符串对象之间的比较不用“==” 用equals方法
1.字面量创建(如果是字面量创建,那么可以用==,但还是建议用equals方法比较)
package com.bjpowernode.javase.string; public class StringTest02 { public static void main(String[] args) { String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); // true // == 双等号比较的是变量中保存的内存地址 // 对于s2来说,因为在执行s1时候已经创建了hello所以"hello"是存储在方法区的字符串常量池当中 // 所以这个"hello"此时不会新建。(因为这个对象已经存在了!)
2.new关键字创建(必须用equals)
public class StringTest02 { public static void main(String[] args) { String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); // true String x = new String("xyz"); String y = new String("xyz"); // == 双等号比较的是变量中保存的内存地址 System.out.println(x == y); //false所以字符串对象之间的比较不能使用“==”,应该调用String类的equals方法
但是注意在调用时候出现的空指针异常
// "=="不保险。应该调用String类的equals方法。 // String类已经重写了equals方法,以下的equals方法调用的是String重写之后的equals方法。 System.out.println(x.equals(y)); // true String k = new String("testString"); //String k = null;当k为空时候去使用下面两个写法(注意区分写法) // "testString"这个字符串可以后面加"."吗? // 因为"testString"是一个String字符串对象。只要是对象都能调用方法。 //有两个写法,注意区分写法 //第一种 System.out.println("testString".equals(k)); // 建议使用这种方式,因为这个可以避免空指针异常(把为空的引用写在后面,写前面就是表示null去调用,一个空的去调用会出现空指针异常) //第二种 System.out.println(k.equals("testString")); // 存在空指针异常的风险。不建议这样写。 } } //当然,如果String k = null不为空的话,这两个都不存在风险
在讲字符串比较前,必须要了解 == 与equals的区别: 因为java所有类都继承于Object基类,而Object中equals用来实现,所以equals与双等号是一样的,都是比较对象地址, java api里的类大部分都重写了equals方法,包括基本数据类型的封装类、String类等。 对于String类==比较的是两个String对象的地址,equals则用于比较两个String对象的内容(值)