이 기사는 주로 Java 문자열로 객체를 만드는 문제를 다음과 같이 연구합니다.
우선, 우리는 변수와 객체를 참조하는 두 가지 개념을 이해해야합니다. 객체는 일반적으로 힙에 새로 새로 생성되며 문자열은 기준 변수 일뿐입니다.
모든 문자열은 문자열 객체입니다. 문자열 상수의 대량 사용으로 인해 Java에서 시간을 절약하기 위해 컴파일 단계에서 모든 문자열 상수가 문자열 상수 풀에 배치됩니다. 문자열 상수 풀의 장점 중 하나는 동일한 문자열을 병합하여 공간을 점유 할 수 있다는 것입니다.
변수의 주소는 Java에서 직접 얻을 수 없지만 == 두 참조 변수가 주소, 즉 객체를 가리키는 지 여부를 결정할 수 있습니다.
| 스택 메모리 | 힙 메모리 |
|---|---|
| 기본 유형, 객체 참조 (힙 메모리 주소) | 새로운 객체와 배열 |
| 빠른 액세스 속도 | 스택보다 메모리가 느립니다 |
| 데이터 크기는 선언주기 동안 결정해야합니다. | 할당 된 메모리는 Java Virtual Machine 자동 쓰레기 수집기에 의해 관리됩니다. 동적으로 할당 된 메모리 크기 |
| 공유 기능, 스택에 문자열이있는 경우 직접 참조됩니다. 그렇지 않다면, 값을 저장할 새로운 공간을 열어 | 모든 새로운 것은 힙 메모리에서 새로운 객체를 생성합니다. 재사용은 없습니다 |
package com.demo.test; import java.lang.reflect.field; public class stringdemo {public static void main (string [] args) {//이 문자열 객체가 메모리에 존재하는지 여부를 찾으십시오. 존재하면이 문자열 객체를 가리 키십시오. 문자열 str1 = "abc"; 문자열 str2 = "abc"; /* public String toString () {reture this; } */ String str3 = "abc".toString (); //이 문자열 객체가 이미 메모리에 있든 상관없이 새 개체가 생성됩니다. 문자열 str4 = 새 문자열 ( "abc"); 문자열 str5 = 새 문자열 ( "abc"); 문자열 str6 = str5; 문자열 str7 = "a" + "b" + "c"; 문자열 str8 = "a" + "b" + new String ( "c"); // 문자열은 불변의 문자열 객체, StringBuilder 및 StringBuffer는 가변 문자열 객체입니다 (내부 문자 배열의 길이는 변수입니다), StringBuffer는 스레드-안전, StringBuilder는 stresh-safe str9 = new StringBuilder (). Append ( "A"). Append ( "B"). Append ( "C"). 문자열 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); // false System.. 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); // false System.OUT.OUT.OUT.OUT.OUT.OUT.OUT.OUT.OUT.OUT.OUT.OUT. 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.out.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 (str1.hashcode ()); 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 ( "--------> 정상 변경 값"); // 문자열은 불변의 클래스입니다. 문자열은 힙 메모리의 참조 만 지적합니다. 물체의 주소를 객체 자체가 아니라 힙에 저장합니다. 문자열에 값을 할당하는 것은 객체 자체 대신 참조 객체를 변경하는 것입니다. System.out.println (str5); // abc system.out.println (str6); // 123 System.out.println ( "-------> 변경 값을 반영"); /* 문자열 값을 변경 해야하는 경우 불가능하지 않습니다. 반사 만 사용할 수 있습니다. 공개 최종 클래스 문자열은 java.io.serializable, 비슷한 <string>, charSequence {// 값이 문자 저장에 사용됩니다. 개인 최종 문자 가치 []; …} */ 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 | 불법 행사 exception e) {e.printstacktrace (); } system.out.println ( "-------> obj.toString ()"); Object obj = new Object (); /* public String toString () {return getClass (). getName () + "@" + integer.toHexString (hashCode ()); } */system.out.println (obj.tostring ()); // java.lang.object@15db9742 String [] arr1 = { "0"}; 문자열 [] arr2 = { "0"}; System.out.println (arr1.equals (arr2)); // false}}요약
위의 것은 Java String Creation Object 인스턴스의 분석에 관한 것이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!