zoukankan      html  css  js  c++  java
  • 两个字符串比较大小

    两个字符串比较大小:
        一、可以用compareTo()方法,另外还有compareToIgnoreCase(String) 忽略大小写及 compareTo(object string)这些 方法返回值是int, 以compareTo()方法为例:
         1 .如果字符串相等返回值为0,不等返回其他数值。
    比较方法是先比较对应字符的大小(Ascall吗顺序),从第一个字母开始比较。
         2.如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)
                   (负值前字符串的值小于后字符串,正值前字符串大于后字符串)
         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( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1)
    7. System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3)
    8. System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48)
    9. System.out.println( s1.compareTo(s5) ); // -2 ("a"的ASCII码是97,"c"的ASCII码是99,所以返回-2)

    二、还可以用“==”和.equals()方法判断大小:

    1.“==”是一个判断相等的运算符,如果两边是基本数据类型,它判断的是值;如果两边是复合型数据类型(类类型),它判断的是地址;地址相同,内容一定相同,地址不同,内容不一定相同。

    2..equals() 方法只能判断复合型数据类型,由于继承Object类,默认判断的是两边在内存的地址,判断结果和“==”一样,但在一些其他的类库中equals()被重写,例如String,Integer,Data等类中有其自身的实现,比较内容就不是地址了。

    例如:

    1. String str1 = new String("hello");
    2. String str2 = "hello";
    3. System.out.println("str1==str2: " + (str1==str2)); \false
    4. 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出来的不管常量池中有没有都会新建一个,地址就不一样了。
  • 相关阅读:
    Analysis Services features supported by SQL Server editions
    Azure DevOps to Azure AppServices
    Power BI For Competition
    Win10开机“提示语音”以及”随机播放音乐”
    Azure DevOps
    Allow Only Ajax Requests For An Action In ASP.NET Core
    Mobile CI/CD 101
    Configure SSL for SharePoint 2013
    AWS Step Function Serverless Applications
    Cordova Upload Images using File Transfer Plugin and .Net core WebAPI
  • 原文地址:https://www.cnblogs.com/jpfss/p/9842317.html
Copyright © 2011-2022 走看看