Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.
При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.
Итак, вопрос в том, что все строки кэшируются в системе, как получается ==
возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing")
, вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString")
всегда будет возвращать false.
Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern()
вернет true.
Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.
Обычно, это не имеет значения, если у вас есть X.X.X.001 или .01 или .1 для последнего октета. См. Мои результаты пинга на 192.168.0.1 и .01 и .001 => все они приводят к .1
Это почти полностью зависит от реализации вашего ping
, но наиболее вероятной причиной является то, что 08
трактуется как восьмеричное число , потому что оно начинается с 0
.
И, поскольку действительные восьмеричные цифры ограничены 0..7
, предполагается, что это не числовой IP-адрес, а вместо этого имя , которое нужно искать (в DNS для пример).
Это восьмеричное поведение может быть подтверждено (под Windows) следующей расшифровкой:
C:\Users\Pax> ping 192.168.1.061
Pinging 192.168.1.49 with 32 bytes of data:
Reply from 192.168.1.61: Destination host unreachable.
:
061
, по-видимому, считалось восьмеричным из первой строки выходных данных, поскольку 618 (6x8+1) = 4910
, Последующие строки, хотя они утверждают, что проверяет адрес .61
, являются ложными. Это потому, что это мой фактический аппарат, и, если я делаю это без начального нуля, он работает нормально:
C:\Users\Pax>ping 192.168.1.61
Pinging 192.168.1.61 with 32 bytes of data:
Reply from 192.168.1.61: bytes=32 time<1ms TTL=128
:
Если восьмеричный бит содержит не восьмеричную цифру, это , когда он начинает жаловаться на сам хост, а не просто на недоступность (или, что еще хуже, пинг не на том компьютере):
C:\Users\Pax>ping 192.168.1.61
Pinging 192.168.1.61 with 32 bytes of data:
Reply from 192.168.1.61: bytes=32 time<1ms TTL=128
:
C:\Users\Pax>ping 192.0168.1.61
Ping request could not find host 192.0168.1.61.
Please check the name and try again.