0

我是一个相当新的程序员,作为我正在做的几个项目的一部分,我正在使用子字符串。在所有这些中,我都遇到了 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();
               }

}

我觉得我错过了一些非常明显的东西,但我一直在寻找一些东西,但没有发现任何像这样的东西。帮助将不胜感激。

4

6 回答 6

2
randomsubstring.equals(should_be_randomsubstring)

您正在比较 String 对象引用。

于 2013-03-14T05:48:49.127 回答
2
randomsubstring.equals(should_be_randomsubstring)

或者

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

代替

randomsubstring==should_be_randomsubstring)

每当您比较字符串使用.equals().equalsIgnoreClas()

于 2013-03-14T05:50:40.180 回答
2

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

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

使用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);
       }
     }
}
于 2013-03-14T05:53:18.217 回答
1

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

根据您的平均代码更改:

if(should_be_randomsubstring.equals(randomsubstring)){
      System.out.println("Failure")  
}else{ 
     System.out.println("Success");   
}
于 2013-03-14T06:11:55.737 回答
0

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

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

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

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

String ref4= new String("Test");

ref1 不等于 ref,== 运算符将返回 false,因为这两个对象在堆内存中的存在不同。

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

Imp 注意子字符串中的内存泄漏

还要深入研究子字符串方法,memory leak如果我们不明智地使用它会导致。字符串的子字符串方法使用旧字符串的value[]数组对象来存储子字符串。
前任。你有一个字符串,比如 1 GB,如果用 500 MB 创建一个子字符串,那么它将返回 500 MB 字符集和 1 GBvalue[]数组对象。这意味着您仍然有 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
于 2013-03-14T07:06:12.333 回答