A while
применяется к выражению или блоку после while
.
У вас нет блока, поэтому ваше время заканчивается выражением dog=al.get(i);
while(dog.getId()!=id && i<length)
dog=al.get(i);
Все после этого происходит только один раз.
Нет никаких оснований для создания собаки, так как вы никогда не используете собаку, которую вы новичок; вы немедленно присваиваете Dog из массива для ссылки на вашу собаку.
И если вам нужно получить значение для ключа, вы должны использовать карту, а не массив.
Редактировать: почему это было не так ?? 1015 *
Комментарий от ОП:
Еще один вопрос, касающийся того, что нет необходимости делать новый экземпляр собаки. Если я просто вынимаю копии объектов из списка массивов, как я могу затем вынуть их из списка массивов, не имея объекта, в который я их помещаю? Я также заметил, что я не заключил в скобки время цикла.
Ссылка на Java и объект, на который она ссылается, это разные вещи. Они очень похожи на ссылку и объект C ++, хотя ссылку на Java можно перенаправить, как указатель C ++.
В результате Dog dog;
или Dog dog = null
дает вам ссылку, которая не указывает ни на один объект. new Dog()
создает объект, на который можно указать.
После этого с dog = al.get(i)
означает, что ссылка теперь указывает на ссылку собаки, возвращаемую al.get(i)
. Поймите, в Java объекты никогда не возвращаются, только ссылки на объекты (которые являются адресами объекта в памяти).
Указатель / ссылка / адрес собаки, которую вы обновили, теперь утерян, так как ни один код не ссылается на нее, поскольку референт был заменен референтом, который вы получили от al.get()
. В конце концов Java-сборщик мусора уничтожит этот объект; в C ++ вы бы «вытекли» из памяти.
В результате вам нужно создать переменную, которая может ссылаться на Dog; вам не нужно создавать собаку с new
.
(На самом деле вам не нужно создавать ссылку, поскольку то, что вы действительно должны делать, это возвращать то, что Map возвращает из своей функции get (). Если Map не параметризована для Dog, например, так: Map<Dog>
, тогда вам нужно будет привести результат из get, но вам не понадобится ссылка: return (Dog) map.get(id);
или, если карта параметризована, return map.get(id)
. И эта одна строка - вся ваша функция, и она в большинстве случаев это будет быстрее, чем итерация массива.)