Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Сравнение стрингов


Автор: kren 22.10.2006, 13:21
В обшем есть метод, возврашяюшия "extention" файла. 

Код

    protected String getExtention(String fileName) {

        int l = fileName.lastIndexOf('.');
        if (l > 0 && l < fileName.length() - 1) {

            String a = fileName.substring(l + 1).toLowerCase();
            fileType = a;
            
            return fileType;
            
        } else {
            
            fileType = "File";
            
            return fileType;
            
        }
    }


Ну и вроде все работает, но когда я пытаюсь сравнить стринги, ничего не выходит.
Код

if (fileType == "mp3") {
 ... //doesn't work
} else if (fileType == "File") {
... //work fine
}


В чем могла бы быть проблема?

Автор: powerOn 22.10.2006, 13:29
Строки надо сравнивать через метод equals(). 
== сравнивает ссылки (т.е. адреса строк).

Автор: kren 22.10.2006, 14:00
Точно, вот  smile , совсем из головы вылетело.
Спасибо.  smile 

Автор: Се ля ви 22.10.2006, 14:51
Цитата(powerOn @  22.10.2006,  13:29 Найти цитируемый пост)
Строки надо сравнивать через метод equals(). 
== сравнивает ссылки (т.е. адреса строк). 

Строго говоря, это утверждение не совсем верно. Всё зависит от того, как создавались эти строки. В данном случае это так, но, скажем, если вы напишете следующее:

Код
String s1 = "гыгыгы";
String s2 = "гыгыгы";

System.out.println(s1 == s2);

Код выведет "true" smile А вот если написать new String ("гыгыгы") - уже будет "false".

Но для надёжности в общем случае, лучше, конечно, использовать equals(), если только производительность не критична или использовать этот трюк не получается...

Автор: Nicholas_S 22.10.2006, 14:55
 smile ну не ударжался - хорошее название темы  smile 

PS: извините  smile 

Автор: powerOn 22.10.2006, 16:36
Цитата(Се ля ви @  22.10.2006,  15:51 Найти цитируемый пост)
Всё зависит от того, как создавались эти строки. В данном случае это так, но, скажем, если вы напишете следующее:


Вот этот пример, как раз и относится к  
Цитата(powerOn @  22.10.2006,  14:29 Найти цитируемый пост)
== сравнивает ссылки (т.е. адреса строк). 


Компилятор оптимизирует инициализации строковых переменных, поскольку эти строки все равно неизменны, выделять лишнюю память нет необходимости. Поэтому и s1 и s2 будут ссылками на одну и тут же строку в памяти.
 

Автор: JUncle 22.10.2006, 17:19
Цитата(powerOn @  22.10.2006,  16:36 Найти цитируемый пост)
Компилятор оптимизирует инициализации строковых переменных, поскольку эти строки все равно неизменны, выделять лишнюю память нет необходимости. Поэтому и s1 и s2 будут ссылками на одну и тут же строку в памяти.

Да, верно, и, насколько я знаю, это на совести компилятора.
Для полной уверености:
Код


public String intern()
Returns a canonical representation for the string object. 
A pool of strings, initially empty, is maintained privately by the class String. 

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned. 

It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true. 

All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language Specification 


Returns:
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.

--------------------------------------------------------------------------------


Автор: COVD 22.10.2006, 17:20
можно применить метод compareTo()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)