전가를 해석하고, 인용을 전합니까?String 매개변수의 당혹

1902 단어 String
		
public static void main(String[] args) throws Exception {
		String str="aaaaaaaa";
		change(str);
		System.out.println(str);
	}

	public static void change(String str){
		str="bbbbbbb";
	}

결과는 바뀐bbbbbbb가 아니라 aaaaa.
설명:
객체는 전달 참조(정확히 말하면 지침이어야 하며 Java에는 C의 의미에서 인용되지 않음)입니다. 그러나 인용이 String 객체라면 상황이 다릅니다. 왜냐하면 String이 만들어지면 바꿀 수 없기 때문에 이것이 관건(본질)이기 때문입니다.change 방법에서 이 방법의 국부 변수str에 값을 다시 부여할 때str가 가리키는 위치는 String 상량 탱크이기 때문에 바꿀 수 없기 때문에 새로운 String 대상만 생길 수 있다.change 방법의str는 새로운 대상을 가리키고main 방법의str변수는 이전에 발생한 대상을 가리킨다.이것은 일반적인 인용과 다르다. 일반적인 인용은 가리키는 주소의 대상 값을 바꿀 수 있기 때문에 사람들이 같은 주소를 가리키면 모두 바뀐다.LZ는 String Buffer를 사용해 보세요. 결과는 당신이 예상한 것과 일치할 것입니다.아래 코드
	public static void main(String[] args) throws Exception {
		StringBuffer str=new StringBuffer("aaaaaaaa");
		change(str);
		System.out.println(str);
	}

	public static void change(StringBuffer str){
		str=str.replace(0, str.length(), "bbbbbbbb");
	}

즉, 인용이 가리키는 주소의 내용을 수정하면 이 주소를 가리키는 모든 인용이 영향을 받는다. 이것이 바로 인용의 근본이다.
 
String s = ""방식으로 생성된 String 객체는 String 상수 풀에 배치되고 String 상수 풀과 동일한 String 객체는 Copy 하나만 있기 때문에
	public static void main(String[] args) throws Exception {
		String str1="aaaaaaaa";
		String str2="aaaaaaaa";
		System.out.println(str1==str2);
	}

true를 입력합니다.new String을 사용하면 일반적인 대상과 마찬가지로 일반적인 Heap에 있고 이 대상은 String 상수 탱크에 동시에 추가됩니다(검증이 잘 되지 않음).
	public static void main(String[] args) throws Exception {
		String str1=new String("aaaaaaaa");
		String str2=new String("aaaaaaaa");
		System.out.println(str1==str2);
	}

false를 출력합니다.

좋은 웹페이지 즐겨찾기