(Java)如何判断字符串是否相等以及比较字符串的大小

在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中如何比较字符大小以及判断字符串是否相等的方法,如果大家发现了文章里的错误或者有更好的方法,欢迎留言评论,大家一起学习呀。

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/82865361