==
тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).
.equals()
тесты для равенства значений (независимо от того, являются ли они логически «равными»).
Objects.equals () проверяет наличие null
перед вызовом .equals()
, поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).
String.contentEquals () сравнивает содержимое String
с содержимым любого CharSequence
(доступно с Java 1.5).
Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals()
.
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
Вы почти всегда хотите использовать Objects.equals()
. В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==
.
Из JLS 3.10. 5. Строковые литералы :
Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса
String
. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя методString.intern
.. Подобные примеры также можно найти в JLS 3.10.5-1 .
Кажется, что -Wl, -rpath здесь не эффективен.
blockquote>Вероятно, что ваш обновленный компоновщик испускает динамический тег
DT_RUNPATH
, в котором исходит старый компоновщикDT_RPATH
. (Возможно также, что ваш старый компоновщик был GNU-ld, а новый - Gold.)Предпочтительнее
DT_RUNPATH
, а также влияет на путь поиска самого двоичного файла, но не любая из зависимых библиотек.
DT_RPATH
имеет глобальный эффект, подобно добавлению каталога в переменную средыLD_LIBRARY_PATH
.Вы можете проверить это с помощью:
readelf -d a.out | grep 'R.*PATH'
.Если вы видите разницу
RPATH
противRUNPATH
и фактически используете Gold, вы можете заставить «старое» поведение с-Wl,--disable-new-dtags
(GNU ld
также--disable-new-dtags
добавлен к нему недавно, поэтому он должен работать для любого линкера).
RUNPATH
вместоRPATH
появляется в ELF. В моем случае,RPATH
- это то, что мне нужно. – Kun Ren 12 November 2017 в 01:13ld
, поставляемое с Ubuntu 16.04, отличается от поведения с Ubuntu 17.10. Я смотрю на оба места, на которые указывает/usr/bin/ld
, оба указывают наx86_64-linux-gnu-ld
, но с другой версией. Это одинGNU-ld
и другойGold
или просто разрыв версии? – Kun Ren 12 November 2017 в 04:3716.04
из17.10
. Вы можете запуститьld --version
. GNU-ld будет выглядеть так:GNU ld (GNU Binutils for Ubuntu) ...
. Золото будет выглядеть так:GNU gold (GNU Binutils for Ubuntu ...)
– Employed Russian 12 November 2017 в 04:47RUNPATH
для каждой из транзитивных зависимостей является способом достижения этого. – Employed Russian 12 December 2017 в 16:24