2016-05-05 12 views
1

Скажем, мне нужно сравнить некоторые строковые объекты в Java, и я должен сделать это, как миллион раз для программы с большим объемом. Строки будут либо полностью идентичными, либо не должны считаться совпадением. Какой метод более эффективен для использования, равен (равенство объекта) или соответствует (регулярное выражение)? Пример:Эффективность сопоставления строк, методы равных или совпадений

String a = "JACK", b = "JACK", c = "MEG"; 
a.equals(b);//True 
a.equals(c);//False 

a.matches(b);//True 
a.matches(c);//False 

Оба метода дают мне результаты, которые я хочу, но я хотел бы знать, какой из них будет более эффективным, учитывая высокий объем обработки.

+3

Покажите нам, как вы будете использовать 'matches' для сравнения двух строк' 'Ā' и b'. (Я говорю это, потому что я думаю, вы поймете, насколько больше работы над «равными», когда вы на самом деле пытаетесь использовать это). – weston

+0

Спасибо, я отредактировал вопрос, чтобы привести пример и сосредоточиться на аспекте эффективности. @Wiktor Stribiżew, можно ли удалить «дублированный» статус? Надеюсь, теперь ясно, что другой ответ не касается моего вопроса - я понимаю разницу между match() и equals(), но хочу знать, какой из них более эффективен. – Mattallica

ответ

4

Вы можете проверить это самостоятельно, взяв большой пул строк и сравнить их в цикле. До и после цикла вы берете текущее системное время, а затем получаете разницу между временем начала и окончания. См. Здесь: Runtime. Но вы должны быть осторожны, потому что результаты могут отличаться из-за вашего оборудования. Также важно знать об оптимизации, которые JVM может выполнять в фоновом режиме. Вот причина, почему вы должны сравнить много строк, и, возможно, сделать среднее значение

List<String> bigList = new List<String>(); // put many many values in this list 
String pattern = "pattern";  
long start = System.nanoTime(); 

for(int i=0;i<bigList.length;i++) { 
    bigList.get(i).equals(pattern); //in another program, check for matches(pattern) 
} 

long end = System.nanoTime(); 

System.out.println((end-start)/bigList.size()) // this is the average time 
+0

Хороший ответ, я попробовал что-то вроде этого, и метод equals выдувал спички из воды. – Mattallica

1

матчи, вероятно, будет медленнее, так как он использует java.util.regex.Pattern и java.util.regex.Matcher в фон. Оба равны и compareTo использовать простой цикл, и поэтому должны быть быстрее.

Ответ здесь: http://www.coderanch.com/t/487350/Performance/java/compare-strings

+0

Спасибо! Вы верны в соответствии с проведенным мной испытанием. – Mattallica