2011-12-01 4 views
13

Мне просто интересно, есть ли лучший способ сделать это. я чувствую, что это может быть неэффективно. Проблема заключается в причине БД, мне нужно сравнить строки, которые иногда могут быть нулевыми или нет.Лучший способ сравнить строки, которые могут быть нулевыми

public static boolean compareStrings(String str1, String str2){ 

    if(str1 == null && str2 == null) return true; 

    if(str1 != null && str2 != null){ 
     if(str1.equals(str2)) 
      return true; 
    } 

    return false; 
} 
+0

мигрируют в HTTP: //codereview.stackexchange.com/...? –

+0

так жаль, спасибо, сделают это в будущем – Maurycy

ответ

46

Обычная идиома это:

return (str1 == null ? str2 == null : str1.equals(str2)); 
+19

Я хотел бы просто добавить, что я делал это для android и TextUtils.equals (a, b); делает именно это – Maurycy

1

Этот код будет только неэффективен, если это вызывает узкое место во время нормального выполнения программы. Единственный способ узнать, так ли это, - запустить вашу программу через профилировщик. Пока вы это сделаете и не увидите, что эта функция вызывает проблемы с производительностью, я бы не стал беспокоиться об этом.

+0

Это может быть немного придирчиво для меня, чтобы беспокоиться об этом, особенно без профилирования. Обычно я не использую профилировщики, если не сталкиваюсь с утечками памяти. Я более или менее задавался вопросом, была ли лучшая реализация, чем разработка статического метода. Спасибо – Maurycy

29

Вы говорите, что они потенциально происходят из базы данных. Если честно, любая неэффективность вокруг нескольких тестов на недействительность совершенно незначителен по сравнению с затратами на запросы к базе данных. Я бы сосредоточился на удобочитаемости.

С этой целью, я бы начать использовать Guava и его Objects класс:

boolean equal = Objects.equal(a, b); 

Я бы ожидать, что будет осуществляться в соответствии с кодом Taymon, в основном - но приятно иметь его в один место ,

EDIT: Для Java 7+ вам не нужен Guava. Вы можете просто использовать java.util.Objects.equal(a, b).

+0

Что касается «удобочитаемости» ... это действительно заставляет меня думать о 'object.ReferenceEquals', что не очень хорошо :( –

+0

@pst: Это должно заставить вас думать о статическом' object.Equals' метод, который уже является эквивалентом, уже встроенным в .NET. –

+11

Для тех, кто сталкивается с этим совсем недавно, то же самое происходит сейчас в Java 7: [Objects.equals] (http://docs.oracle.com/javase/7 /docs/api/java/util/Objects.html#equals%28java.lang.Object,%20java.lang.Object%29) –

4

Если вы открыты для использования Apache Commons StringUtils, то они имеют равные, которая сравнивает две строки нуля-безопасной

Смежные вопросы