2013-11-14 5 views
-1

Я получаю значение как 9999912499 из базы данных. Я разделил его на две части 99999 и 12499 с помощью подстроки. Теперь я хочу проверить, равна ли 1-й строке 99999, тогда я делаю некоторую обработку иначе, чем что-то другое. Но контроль никогда не попадет в к, если петлямПроверка числа в переменной String

Ниже приводится снимок:

String strPscId = Long.toString(pscID); 
String convPscID = strPscId.substring(5, strPscId.length()); 
String checkNine = strPscId.substring(0,5); 
BigDecimal jpaIdObj = jeuParam.getJpaIdObj(); 
Long mod_id = modele.getModId(); 

log.info("outstrPscId == " +strPscId); 
log.info("outconvPscID == " +convPscID); 
log.info("outcheckNine == " +checkNine); 
log.info("outjpaIdObj == " +jpaIdObj); 
log.info("outmod_id == " +mod_id); 

if(checkNine == "99999") { <method-call> } 
else { <another - method - call> } 
+2

Форматирование кода. –

+0

Да. Люди вряд ли найдут время, чтобы помочь вам, если вы не можете потратить немного времени на форматирование своего сообщения, чтобы оно было читаемым. –

+0

Или сделать сообщение меньшего размера, содержащее только соответствующие материалы. – Ingo

ответ

1

По какой-то причине, люди, которые делают Java решили, что == не должна использоваться для сравнения строк, так что у вас есть использовать

checkNine.equals("99999"); 

Посмотрите на следующий код:

String str1 = "abc"; 
String str2 = str1; 

В первой строке создается и сохраняется новая строка в памяти вашего компьютера. str1 сам по себе не является строкой, а ссылкой на эту строку. Во второй строке str2 установлено равным str1. str2 есть, как str1, только ссылка на место в памяти. Однако, вместо создания совершенно новой строки, str2 является ссылкой на то же место в памяти, которое str1 является ссылкой на. == проверяет, соответствуют ли ссылки, но .equals() проверяет, соответствует ли каждый символ в строке тем же самым, что и соответствующий символ в другой строке.

boolean bool1 = (str1 == str2); 
boolean bool2 = str1.equals(str2); 

Если этот код были добавлены выше, что код, как bool1 и bool2 бы быть правдой.

String str1 = "abc"; 
String str2 = new String(str1); 
boolean bool1 = (str1 == str2); 
boolean bool2 = str1.equals(str2); 

В этом случае bool2 по-прежнему верно, но bool1 ложно. Это связано с тем, что str2 не был равен str1, так что ссылки не относятся к таким же образом место в памяти, которое str1 является ссылкой на. Вместо этого new String(str1) создает полностью новую строку, которая имеет значение str1. str1 и str2 являются ссылками на два разных места в памяти. Они содержат одно и то же значение, но в корне отличаются тем, что они хранятся в двух разных местах, и поэтому это две разные вещи. Если я заменил new String(str1) на "abc" или str1, bool1 будет правдой, поскольку без ключевого слова new JVM создает новую строку для хранения в памяти, если это абсолютно необходимо. new заставляет JVM создавать совершенно новую строку, независимо от того, имеет ли какое-либо место в памяти то же значение, что и новая создаваемая строка.

.equals() является медленным, но в целом более полезным, чем ==, что намного быстрее, но часто не всегда дает желаемый результат. Существует много раз, когда == может использоваться с тем же результатом, что и .equals(), но может быть трудно сказать, когда это время. Если вы не знающий программист, делающий что-то там, где скорость важна, я бы предположил, что вы всегда используете .equals().

+1

Если бы у меня был цент для каждого ответа, я бы получил ∞ cents теперь, еще больше. – Maroun

+1

У них была хорошая причина, почему бы не использовать '=='. – Maroun

+0

Если они реализовали сравнение значений для '==', тогда вам понадобится 'ReferenceEquals', как на C#, чтобы получить это поведение. более разумным, поскольку сравнение стоимости на сегодняшний день является более распространенным случаем использования. – Zong

-1
if(checkNine.equals("99999")) { 
    <method-call> 
} 
else { 
    <another - method - call> 
} 
+0

Не могли бы вы объяснить этот код (в вашем ответе)? Вы можете получить больше авансов таким образом! –

0

Вы должны использовать equals метод, а не == для сравнения строк.

Изменение от

if(checkNine == "99999") 

в

if(checkNine.equals("99999")) 
0

== Оператор используется для сравнения содержимого двух переменных. Это работает как ожидалось при использовании примитивных типов (или даже классов-оболочек из-за автоматического бокса). Однако, когда мы используем == со ссылкой на объект (например, checkNine), контент является ссылкой на объект, но не значением объекта. Здесь используется метод equals().

if("99999".equals(checkNine)){ 
    <method-call> 
} 
else { 
    <another - method - call> 
} 
+0

Извините, ребята. Я нажал пробел, когда думал, что набираю текстовую область. Но когда я нажал кнопку, нажала кнопку «Ответ на сообщение». –

-1
if (strPscId.startsWith("99999")) 
{ 
    bla bla 
} 
else 
{ 
    sth else than bla bla 
} 
+0

Не могли бы вы объяснить этот код (в вашем ответе)? Вы можете получить больше авансов таким образом! –

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