String 유형의 매개 변수, 전가 또는 전가 참조?

2011 단어 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변수는 이전에 발생한 대상을 가리킨다.
 
이것은 일반적인 인용과 다르다. 일반적인 인용은 가리키는 주소의 대상 값을 바꿀 수 있기 때문에 사람들이 같은 주소를 가리키면 모두 바뀐다.
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를 출력합니다.

좋은 웹페이지 즐겨찾기