【问题标题】:Substrings and if statements in Java [duplicate]Java中的子字符串和if语句[重复]
【发布时间】:2013-03-14 05:47:46
【问题描述】:

我是一个相当新的程序员,作为我正在做的几个项目的一部分,我正在使用子字符串。在所有这些中,我都遇到了 if 语句的问题。假设我有两个变量,一个是其他字符串的子字符串,另一个应该与第一个子字符串等效。如果我尝试在 if 语句中检查它们是否相等(它们应该是),它会返回 false 和 == 检查。这里有一些代码来演示。

public class Substringproblem{

    static void method(){

                String random="somestring";

                String randomsubstring=random.substring(0,3);

                String should_be_randomsubstring="som";

               if(randomsubstring==should_be_randomsubstring){
                     System.out.println("Success");
               }else{
                     System.out.println("Failure");
                             System.out.println(randomsubstring);
               }
               }
               public static void main(String[] args) {
                         method();
               }

}

我觉得我错过了一些非常明显的东西,但我一直在寻找一些东西,但没有发现任何类似的东西。非常感谢您的帮助。

【问题讨论】:

  • 如果要检查以某个字符串开头的字符串,可以使用startsWith 方法。无需遍历所有substring
  • Awhh....还有很多其他问题解释相同...:\
  • 尽快阅读《Head First Core Java》一书。用equals方法代替==
  • 好的,这行得通。感谢所有给出答案的人。

标签: java substring


【解决方案1】:
randomsubstring.equals(should_be_randomsubstring)

randomsubstring.equalsIgnoreCase(should_be_randomsubstring)(If you want to ignore cae use this)

而不是

randomsubstring==should_be_randomsubstring)

当您比较字符串时,请使用 .equals().equalsIgnoreClas()

【讨论】:

    【解决方案2】:
    randomsubstring.equals(should_be_randomsubstring)
    

    您正在比较字符串对象引用。

    【讨论】:

      【解决方案3】:

      使用 String.equals(String anotherString) 函数比较字符串,而不是 == 运算符。该函数检查字符串的实际内容,== 运算符检查对对象的引用是否相等。

      public class SubstringProblem {
      
      
          public static void main(String[] args) {
              method();
          }
      
           static void method() {
               String random = "somestring";
               String randomsubstring = random.substring(0,3);
               String should_be_randomsubstring = "som";
      
               if (randomsubstring.equals(should_be_randomsubstring)) {
                   System.out.println("Success");
               } else {
                   System.out.println("Failure");
                   System.out.println(randomsubstring);
             }
           }
      }
      

      【讨论】:

        【解决方案4】:

        在java中比较两个字符串总是使用equals()方法。 您的代码应如下所示:

        if(randomsubstring.equals(should_be_randomsubstring)){
                     System.out.println("Success");
               }else{
                     System.out.println("Failure");
                             System.out.println(randomsubstring);
        
        • ‘==’运算符不比较字符串对象中存在的文本的内容。它只比较 2 个字符串指向的引用,即对象引用。因此,在您的情况下,它将返回 false。
        • equals() 方法用于当您需要比较 String 对象中存在的文本内容时。当两个 String 对象包含相同的内容时,此方法返回 true。

        【讨论】:

          【解决方案5】:

          您应该使用 equals 来比较 String 对象。

          根据您的平均代码更改:

          if(should_be_randomsubstring.equals(randomsubstring)){
                System.out.println("Failure")  
          }else{ 
               System.out.println("Success");   
          }
          

          【讨论】:

            【解决方案6】:

            假设你在堆内存中有一个 String 对象,那么你可以有多个引用变量指向同一个对象。

            Ex. String ref1 = "Test"; 
                String ref2 = ref1;
                String ref3 = ref1;
            

            所以字符串 ref1、ref2 和 ref3 指向同一个字符串"Test"。因此,要检查这些引用是否相等,我们必须使用 == 运算符。这将返回相应的值。
            (equals 也将返回 true,但目的不同)

            String 的Equals 方法检查String 对象的实际内容。 所以在上述情况下,如果我创建

            String ref4= new String("Test");
            

            ref1 不等于 ref,== 操作符会返回 false,因为这两个对象在堆内存中存在不同。

            如果我通过equals 方法比较两个对象,那么它将返回true,因为内容为真。

            子字符串内存泄漏提示

            如果我们不明智地使用它,还会深入研究导致memory leak 的子字符串方法。 字符串的子字符串方法使用旧字符串的value[]数组对象来存储子字符串。
            前任。你有一个字符串,比如 1 GB,如果用 500 MB 创建一个子字符串,那么它将返回 500 MB 字符集和 1 GB value[] 数组对象。这意味着您仍然有 1 GB value[] 数组对象,其中包含 500 MB 数据。所以导致内存泄漏。
            如何避免?

            String some1 = new String(some2.substring(5)); // use such call 
            String someStr = some2.substring(5); //don't use this way
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-12-06
              • 1970-01-01
              • 1970-01-01
              • 2017-06-06
              • 1970-01-01
              • 2015-11-13
              • 2014-04-12
              相关资源
              最近更新 更多