两个字符串⽐较⼤⼩
两个字符串⽐较⼤⼩:
⼀、可以⽤compareTo()⽅法,另外还有compareToIgnoreCase(String) 忽略⼤⼩写及 compareTo(object string)这些⽅法返回值是int,以compareTo()⽅法为例:
1 .如果字符串相等返回值为0,不等返回其他数值。
⽐较⽅法是先⽐较对应字符的⼤⼩(Ascall吗顺序),从第⼀个字母开始⽐较。
2.如果第⼀个字符和参数的第⼀个字符不等,结束⽐较,返回他们之间的差值(ascii码值)
(负值前字符串的值⼩于后字符串,正值前字符串⼤于后字符串)
equals()方法3.如果第⼀个字符和参数的第⼀个字符相等,则以第⼆个字符和参数的第⼆个字符做⽐较,
以此类推,直⾄⽐较的字符或被⽐较的字符有⼀⽅全⽐较完,这时就⽐较字符的长度.
例如:
1. String s1 = "abc";
2. String s2 = "abcd";
3. String s3 = "abcdfg";
4. String s4 = "1bcdfg";
5. String s5 = "cdfg";
6. System.out.println( s1pareTo(s2) ); // -1 (前⾯相等,s1长度⼩1)
7. System.out.println( s1pareTo(s3) ); // -3 (前⾯相等,s1长度⼩3)
8. System.out.println( s1pareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48)
9. System.out.println( s1pareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)
⼆、还可以⽤“==”和.equals()⽅法判断⼤⼩:
1.“==”是⼀个判断相等的运算符,如果两边是基本数据类型,它判断的是值;如果两边是复合型数据类型(类类型),它判断的是地址;地址相同,内容⼀定相同,地址不同,内容不⼀定相同。
例如:
1. String str1 = new String("hello");
2. String str2 = "hello";
3.
4. System.out.println("str1==str2: " + (str1==str2)); \\false
5. System.out.println("str1.equals(str2): " + str1.equals(str2)); \\true
当他们⽤(==)进⾏⽐较的时候,⽐较的是他们在内存中的存放地址,所以,除⾮是同⼀个new出来的对象,他们的⽐较后的结果为true,否则⽐较后结果为false。
但equals()在String中被重写过了,判断的是内容,不在是内存中的地址,所以是true。
但是String⽐较特殊,因为我们都知道jvm把内存分为3个区,分别是⽅法区,堆区和栈区。⽽在⽅法区中维护者⼀个String常量池,池中⽤来存放运⾏时产⽣的各种字符串,并且池中的内容不重复。⽽⼀般对象不在这个池中,对象放在堆⾥。这就需要分析String的创建⽅式:
1. 当使⽤任何⽅式来创建⼀个字符串对象str=“X”时,Java运⾏时(运⾏中JVM)会拿着这个X在String池中是否存在内容相同的字符串对象,如果不存在,则在池中创建⼀个字符串str,否则,不在池中添加。
2.Java中,只要使⽤new关键字来创建对象,则⼀定会(在堆区或栈区)创建⼀个新的对象。
3 .使⽤直接指定或者使⽤纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有就在池中创建⼀个,有则罢了!但绝不会在堆栈区再去创建该String对象。
4 使⽤包含变量的表达式来创建String对象,则不仅会检查维护String池,⽽且还会在堆栈区创建⼀个String对象。
例如:
1. String str2 = "hello";
2. String str3 = "hello";
3. System.out.println("str3==str2: " + (str3==str2)); \\true
4. System.out.println("str3.equals(str2): " + str3.equals(str2)); \\true
true的原因是hello都是从常量池中取出来的,但你new出来的不管常量池中有没有都会新建⼀个,地址就不⼀样了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论