Java字符串比较:深入理解compareTo()、==和equals()的区别与用法
怎么比较两个字符串的大小
比较两个字符串的大小:
1.可以使用CompareTo()方法,还有忽略大小写的CompareToIgnoreCase(String)和int类型的CompareTo(ObjectString)方法,以CompareTo()方法为例:
1。
如果字符串相等,则返回值为0,如果不相等,则返回其他值。
比较方法首先涉及从第一个字母开始比较相关字符的大小(Escal顺序)。
2.如果第一个字符不等于参数的第一个字符,则结束比较并返回它们之间的差值(ascii代码值)(负值之前)字符串的值小于后面的字符串,并且为正值。
前面的字符串大于后面的字符串)
3.如果第一个字符等于参数的第一个字符,则将第二个字符与参数的第二个字符进行比较,依此类推,直到被比较的字符或要比较的字符中的一个字符被比较。
例如:对于:
Strings1='abc';
Strings2='abcd';
Strings3='abcdfg';
字符串s4='1bcdfg';
Strings5='cdfg';
System.out.println(s1.compareTo(s2));//-1(等于第一个,s1长度从1较小
System.out.println(s1.compareTo(s3));//-3(前面等于,s1的长度小于3)
System.out.println(s1.compareTo(s4));//48('a'的ASCII码是97,'1'的ASCII码是49,所以返回48)
System.out.println(s1.commpareTo(s5));//-2('a'的ASCII码是97,'c'的ASCII码是99,所以返回-2)
2使用“==”,.equals()方法确定大小:
1。
“==”是判断相等的运算符,如果双方都是原生数据类型,则判断值;如果双方都是复合数据类型(类类型),则判断地址;相同,内容应该相同,但如果不同,内容也可能不一样。
2..equals()方法只能判断复合数据类型,因为它继承了Object类,它默认判断的是两边的内存地址”,但是类中已经重写了一些其他类比如String、Integer等类都有自己的实现,比较内容不知道。
对于:
Stringstr1=newString('hello');
Stringstr2='hello';
System.out("str1==str2:"+(str1==str2));\false
systemm.out.println("str1.equals(str2):"+str1.equals(str2));\true
当使用(==)进行比较时与内存中的存储地址进行比较,因此除非是同一个新对象,否则比较结果为true,否则比较结果为false被重写为字符串,并且计算的是内容,而不是地址。
但是字符串比较特殊,因为我们都知道JVM把内存分为三个区域,即方法区、堆区和栈区。
方法区中维护着一个字符串常量池。
池用于存储运行时生成的各种字符串,池中的内容不重复。
但普通对象不在这个池中,对象被放在堆中。
为此有必要分析一下字符串的构造方法:
1.当使用任何方法创建字符串对象str='X'时,Java运行时(运行JVM)会将其保留在池中创建字符串,否则不要将其添加到池中。
2.在Java中,只要使用new关键字创建一个对象,就一定会创建一个新的对象(在堆或栈区域)。
3.如果使用直接规范创建字符串对象或者使用纯字符串串联,只会检查并维护字符串池中的字符串,如果池中没有字符串,则创建一个池,如果有,就这样。
!但字符串对象永远不会在堆栈区域中创建。
4.使用包含变量的表达式创建字符串对象,不仅会检查和维护字符串池,还会在堆栈区创建字符串对象。
例如:
Stringstr2='Hello';
Stringstr3='Hello';
System.out.println(''str3==str2:"+(str3==str2));\true
system.out.println("str3.equals(str2):"+str3.equals(str2));\正确
扩展信息:字符串用法。
1.StringStrs
生成空字符串
2.String(str)
复制字符串str
>3.strings(str,stridx)
将从str开始的字符串str转换为初始值的一部分
5.strings(cstr)
作为字符串s的初始值使用c_string类型cstr
6.strings(cstr,char_len)使用c_string类型cstr的前char_len个字符作为字符串s的初始值。
7.strings(num,c)
创建一个包含c个字符的字符串
8.strings(strs,beg,end)
使用区间[beg,end]中的字符作为字符串s的初始值。
执行
示例
#include
#include
usingnamespacestd;
intmain()
{
stringstr('12345678');
charch[]='abcdefgh';
stringa;//定义一个空字符串
stringstr_1(str);//全部copy
stringstr_2(str,2,5);//从字符串str的第二个元素开始,复制5个元素到str_2
stringstr_3(ch,5);//赋值将字符串ch的前5个元素转换为str_3
stringstr_4(5,'分配以在end()上指定5个'X'组合do);//将str所有元素复制到str_5中