在Java中,经常需要比较两个字符串,这里总结一下。
1.判断字符串是否相等
在Java中,可以使用“==”来进行判断字符串是否相等。
示例:
String s1="Hello";
String s2="Hello";
//输出返回值
System.out.println(s1==s2);
这时,我们如果运行一下,会发现会输出
“true”。
换一种赋值方式再试试。
String s1="Hello";
String s2=s1;
//输出返回值
System.out.println(s1==s2);
这是,运行一下程序,输出的值为
“true”。
但是我们知道,字符串的初始化有两种方式:
直接等号赋值与用new初始化,直接等号赋值放入内存池,其它变量也可以引用;new初始化分配内存空间,不可引用;
因此,我们用new初始化的方式试一试。
String s1=new String("Hello");
String s2=new String("Hello");
//输出返回值
System.out.println(s1==s2);
这时,输出的结果会变成
false
。
为什么会有这样的结果呢?这和内存中的常量池有关。
常量池属于方法区的一部分,当运行到s1创建对象时,如果常量池中没有,就在常量池中创建一个对象”Hello”,第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。而对于两个基本数据类型,“==”比较的是两个对象的值是否相等;
而对于引用类型,“==”比较的是两个对象的地址是否相等。
也就是说,对于引用类型,当两个对象的地址相等,即
指向同一个地址时,才会相等。
因此前两次的结果都是false。
再回到第三次的比较的赋值语句,
String s1=new String("Hello");
String s2=new String("Hello");
上文中提到,new初始化分配内存空间,不可引用;也就是说,上面的“System s1=new String(“Hello”)”,相当于创建了两次对象,一次是在常量池中创建了对象”Hello”,一次是在堆内存中创建了对象s1。下一个语句也是同理。因此s1、s2的地址不一样,因此这输出false。所以使用“==”判断的时候需要注意的地方比较多。
那么想要毫无顾虑地判断引用类型是否相等该怎么办呢?
这时候equals()方法就派上用场了。
为什么这么说呢?
这和equals()方法的重写有关
。在equals()方法存在于Object类中,因为Object类是所有类的直接或间接父类,也就是说所有的类中的equals()方法都继承自Object类,而通过源码我们发现,Object类中equals()方法底层依赖的是==号,那么,
在所有没有重写equals()方法的类中,调用equals()方法其实和使用==号的效果一样,也是比较的地址值
,然而,Java提供的所有类中,绝大多数类都重写了equals()方法,
重写后的equals()方法一般都是比较两个对象的值,即比较两个对象的内容
。
因此,想要比较两个对象的值是否相等,可以通过equals()方法来完成。
示例:
string s1="Hello";
string s2="Hello";
//输出返回值
System.out.println(s1.equals(s2));
string s1="Hello";
string s2=s1;
//输出返回值
System.out.println(s1.equals(s2));
string s1="Hello";
string s2="He";
//输出返回值
System.out.println(s1.equals(s2));
这时,因为前两个比较语句,s1和s2相等,因此会输出两个true,最后一个比较语句由于s1和s2不相等,因此会输出一个false。
2.比较字符串的大小
在Java中,我们用compareTo()方法来比较字符串的大小。该方法属于
java.lang.String
包下,是Java提供的一个字符串比较的方法。
CompareTo()返回值:
int它是先比较对应字符的大小(ASCII码顺序),返回值类型分别有三种,小于0,等于0,大于0, 1. 如果字符串相等返回值0; 2. 如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值前字符串的值小于后字符串,正值前字符串大于后字符串); 3. 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度。
语法示例:
String s1 = "abc";
String s2 = "abcd";
String s3 = "abcdf";
String s4 = "1bcdf";
String s5 = "c";
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,此时比较字符串的长度,s1长度小1,因此输出-1)
System.out.println( s1.compareTo(s3) ); // -2(前面相等,此时比较字符串的长度,s1长度小2,因此输出-2)
System.out.println( s1.compareTo(s4) ); // 48 (第一个字符不相等,此时比较第一个字符的ASCII码,"a"的ASCII码是97,"1"的的ASCII码是49,所以返回48)
System.out.println( s1.compareTo(s5) ); // -2 (第一个字符不相等,此时比较第一个字符的ASCII码,"a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)
以上就是Java中如何比较字符大小以及判断字符串是否相等的方法,如果大家发现了文章里的错误或者有更好的方法,欢迎留言评论,大家一起学习呀。