Эта статья в основном изучает проблему создания объектов в строке Java, следующим образом.
Прежде всего, нам нужно понять две концепции: ссылки на переменные и объекты. Объекты обычно создаются в куче через новую, а строка - это просто эталонная переменная.
Все строки являются строковыми объектами. Из -за большого количества использования констант струн, чтобы сэкономить время на Java, на стадии компиляции все константы строки будут размещены в пуле String Constrate. Одним из преимуществ постоянного пула строки является то, что та же самая строка может быть объединена и заняла пространство.
Хотя адрес переменной не может быть напрямую получен в Java, вы можете использовать ==, чтобы определить, указывают ли две эталонные переменные на адрес, то есть объект.
| Стек -память | Куча память |
|---|---|
| Основной тип, ссылка на объект (адрес памяти) | Объекты и массивы, созданные новыми |
| Быстрая скорость доступа | Медленная память, чем стек |
| Размер данных должен быть определен во время цикла объявления | Отделенная память управляется автоматическим коллекционером мусора Java. Динамически распределенный размер памяти |
| Общие функции, если в стеке есть строка, она будет ссылаться напрямую; Если нет, откройте новое место для хранения значения | Каждый новый генерирует новый объект в памяти кучи. Не существует повторного использования |
пакет com.demo.test; import java.lang.reflect.field; открытый класс stringdemo {public static void main (string [] args) {// сначала Посмотрите, существует ли этот объект строки в памяти. Если он существует, укажите на этот строковый объект; String str1 = "abc"; String str2 = "abc"; /* public String toString () {вернуть это; } */ String str3 = "abc" .toString (); // Независимо от того, существует ли этот объект строки в памяти, будет создан новый объект. String str4 = new String ("ABC"); String str5 = new String ("ABC"); String str6 = str5; String str7 = "a" + "b" + "c"; String str8 = "a" + "b" + new String ("c"); // Строка является неизменным объектом String, StringBuilder и StringBuffer-это переменные объекты строки (длина массива символов внутри является переменной), StringBuffer-это потока, stringBuilder не является потоком SFE-string str9 = new StringBuilder (). Append («A»). Приложение («B»). Append ("c"). String str10 = new StringBuffer (). Append ("a"). Append ("b"). Append ("c"). ToString (); System.out.println ("---------> =="); System.out.println ("---> 1"); System.out.println (str1 == str2); // true system.out.println ("---> 3"); System.out.println (str3 == str1); // true system.out.println ("-> 4"); System.out.println (str4 == str1); // false System.out.println (str4 == str3); // false system.out.println (str4 == str5); // false system.out.println (str4 == str6); // false system.out.println ("---> 7"); System.out.println (str7 == str1); // true system.out.println (str7 == str3); // true system.out.println (str7 == str4); // false system.out.println ("---> 8"); System.out.println (str8 == str1); // false System.out.println (str8 == str3); // false system.out.println (str8 == str4); // false system.out.println (str8 == str7); // false system.out.println (str8 == str7); System.out.println (str9 == str1); // false System.out.println (str9 == str3); // false system.out.println (str9 == str4); // false system.out.println (str9 == str7); // false system.out.println (str9 == str8); System.out.println (str10 == str1); // false system.out.println (str10 == str3); // false system.out.println (str10 == str4); // false system.out.println (str10 == str7); // false system.println (str10 == str8); System.out.println (str10 == str9); // false System.out.println ("--------> equals"); System.out.println (str1.equals (str4)); // true system.out.println (str1.equals (str7)); // true system.out.println (str1.equals (str8)); // true system.out.println ("--------> hashcode"); /*Формула расчета хэшкода: s [0]*31^(n-1) + s [1]*31^(n-2) + ... + s [n-1] Следовательно, хэшкод одинаково, и она одинакова каждый раз, когда он запускает*/System.out.println (str1.hashcode ()); // 96354 System.out.out.println (str.hashcode ()); // 96354. System.out.println (str3.hashcode ()); System.out.println (str4.hashcode ()); System.out.println (str5.hashcode ()); System.out.println (str6.hashcode ()); System.out.println (str7.hashcode ()); System.out.println ("--------> Нормальное значение изменения"); // Строка является неизменным классом. Строка указывает только на ссылку в памяти кучи. Он хранит адрес объекта в куче, а не в самом объекте. Присвоение значения строке - это просто изменение своего эталонного объекта вместо самого объекта str6 = "123"; System.out.println (str5); // abc System.out.println (str6); // 123 System.out.println ("--------> отражать значение изменения"); /* Если вам нужно изменить значение строки, это не невозможно. Можно использовать только отражение. Общедоступная строка окончательного класса реализует java.io.serializable, сопоставимый <string>, charequestence {// значение используется для хранения символов. Частная конечная стоимость символа []; …} */ Str6 = str5; try {field field = string.class.getDeclaredfield ("value"); // Field Field = str6.getClass (). getDeclaredField ("value"); if (! field.Isaccessible ()) {field.SetAccessible (true); } char [] value = (char []) field.get (str6); значение [0] = '0'; System.out.println (str5); // 0bc System.out.println (str6); // 0bc} catch (nosuchfieldexception | SecurityException | allosalArgumentException | allostalaccessexception e) {e.printstacktrace (); } System.out.println ("-------> obj.toString ()"); Объект obj = new Object (); /* public String toString () {return getClass (). getName () + "@" + integer.tohexstring (hashcode ()); } */System.out.println (obj.tostring ()); // java.lang.object@15db9742 string [] arr1 = {"0"}; String [] arr2 = {"0"}; System.out.println (arr1.equals (arr2)); // false}}Суммировать
Выше всего посвящено анализу экземпляров объектов создания струны Java, и я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!