Строки в Java неизменны. Это означает каждый раз, когда Вы пытаетесь измениться/изменить строку, Вы получаете новый экземпляр. Вы не можете поменять исходную струну. Это было сделано так, чтобы эти строковые экземпляры могли кэшироваться. Типичная программа содержит много строковых ссылок, и кэширующий эти экземпляры может уменьшить объем потребляемой памяти и увеличить производительность программы.
При использовании == оператор для сравнения строк Вы не сравниваете содержание строки, но на самом деле сравниваете адрес памяти. Если они будут оба равны, то это возвратит истину и ложь иначе. Принимая во внимание, что равняется в строке, сравнивает строковое содержание.
, Таким образом, вопрос состоит в том, если все строки кэшируются в системе, каким образом ==
возвращает false, тогда как равняется, возвращают true? Ну, это возможно. При создании новой строки как String str = new String("Testing")
, Вы заканчиваете тем, что создали новую строку в кэше, даже если кэш уже содержит строку, имеющую то же содержание. В коротком "MyString" == new String("MyString")
будет всегда возвращать false.
Java также говорит о функциональном интерне (), который может использоваться на строке для создания его, часть кэша так "MyString" == new String("MyString").intern()
возвратит true.
Примечание: == оператор намного быстрее, чем равняется просто, потому что Вы сравниваете два адреса памяти, но необходимо быть уверены, что код не создает новые Строковые экземпляры в коде. Иначе Вы встретитесь с ошибками.
Почему бы просто не передать файл свойств в качестве аргумента вашему основному методу? Таким образом, вы можете загрузить свойства следующим образом:
public static void main(String[] args) throws IOException {
Properties props = new Properties();
props.load(new BufferedReader(new FileReader(args[0])));
System.setProperties(props);
}
Альтернатива: если вы хотите получить текущий каталог вашего jar-файла, вам нужно сделать что-нибудь неприятное, например:
CodeSource codeSource = MyClass.class.getProtectionDomain().getCodeSource();
File jarFile = new File(codeSource.getLocation().toURI().getPath());
File jarDir = jarFile.getParentFile();
if (jarDir != null && jarDir.isDirectory()) {
File propFile = new File(jarDir, "myFile.properties");
}
... где MyClass
это класс из вашего jar-файла. Однако я бы не рекомендовал это - что, если ваше приложение имеет несколько экземпляров MyClass
в пути к классам в разных файлах jar (каждый jar находится в другом каталоге)? т.е. вы никогда не можете действительно гарантировать, что MyClass
был загружен из банка, который, как вы думаете, был загружен.