자바 의 더미 와 스 택 의 차이

스 택 과 더 미 는 자바 가 메모리 에 데 이 터 를 저장 하 는 곳 입 니 다.C++와 달리 자바 는 스 택 과 더 미 를 자동 으로 관리 하고 프로그래머 는 스 택 이나 더 미 를 직접 설정 할 수 없습니다.
자바 의 더 미 는 실행 중인 데이터 영역 으로 클래스 의 대상 이 공간 을 분배 합 니 다.이 대상 들 은 new,new array,anewarray,multianewarray 등 명령 을 통 해 만 들 어 졌 으 며 프로그램 코드 로 표시 할 필요 가 없습니다.더 미 는 쓰레기 회수 로 책임 집 니 다.더 미 는 메모리 크기 를 동적 으로 분배 할 수 있 고 생존 기간 도 컴 파일 러 에 게 미리 알려 주지 않 아 도 됩 니 다.실행 할 때 동적 으로 메모 리 를 분배 하기 때문에 자바 의 쓰레기 수집 기 는 더 이상 사용 하지 않 는 데 이 터 를 자동 으로 받 습 니 다.그러나 실행 할 때 동적 으로 메모 리 를 분배 해 야 하기 때문에 액세스 속도 가 느 린 것 이 단점 이다.
자바 스 택 은 기본 형식의 변수(int,short,long,byte,float,double,boolean,char)와 대상 핸들 을 저장 하 는 데 사 용 됩 니 다.스 택 의 장점 은 액세스 속도 가 쌓 이 는 것 보다 빠 르 고 레지스터 에 버 금 가 며 스 택 데 이 터 를 공유 할 수 있다 는 것 이다.그러나 스 택 에 존재 하 는 데이터 크기 와 생존 기간 은 반드시 확정 되 고 유연성 이 부족 하 다 는 것 이 단점 이다.
스 택 은 매우 중요 한 특수성 이 있 는데 바로 스 택 에 존재 하 는 데 이 터 를 공유 할 수 있다 는 것 이다.우리 가 동시에 정의 한다 고 가정 하면:

int a = 3; 
int b = 3; 

컴 파일 러 가 int a=3 을 먼저 처리 합 니 다.우선 스 택 에 a 라 는 변 수 를 만 든 다음 스 택 에 3 이라는 값 이 있 는 지 찾 습 니 다.찾 지 못 하면 3 을 저장 하고 a 를 3 으로 가 리 킵 니 다.이어서 int b=3 처리 하기;b 의 인용 변 수 를 만 든 후에 스 택 에 3 이라는 값 이 있 기 때문에 b 를 3 으로 직접 가리 킵 니 다.이렇게 해서 a 와 b 가 동시에 3 을 가리 키 는 상황 이 발생 했다.
이때,다시 a=4;그러면 컴 파일 러 는 스 택 에 4 값 이 있 는 지 다시 검색 하고 없 으 면 4 를 저장 하고 a 를 4 로 가리 키 도록 합 니 다.만약 이미 있다 면,바로 a 를 이 주소 로 가리 키 세 요.따라서 a 값 의 변 화 는 b 의 값 에 영향 을 주지 않 습 니 다.
이러한 데이터 의 공유 와 두 대상 의 인용 이 동시에 한 대상 을 가리 키 는 이러한 공 유 는 다르다 는 것 을 주의해 야 한다.이러한 상황 에서 a 의 수정 은 b 에 영향 을 주지 않 고 컴 파일 러 에 의 해 이 루어 지 며 공간 을 절약 하 는 데 유리 하기 때문이다.한 대상 의 인용 변 수 는 이 대상 의 내부 상 태 를 수정 하여 다른 대상 의 인용 변수 에 영향 을 줄 수 있 습 니 다.
String 은 특수 한 포장 류 데이터 입 니 다.사용 가능:
String str = new String("abc"); 
String str = "abc"; 

두 가지 형식 으로 만 듭 니 다.첫 번 째 는 new()로 새 대상 을 만 듭 니 다.쌓 여 있 습 니 다.호출 할 때마다 새로운 대상 을 만 듭 니 다.두 번 째 는 스 택 에 String 류 의 대상 참조 변수 str 를 만 든 다음 스 택 에'abc'가 저장 되 어 있 는 지 찾 는 것 입 니 다.없 으 면'abc'를 스 택 에 저장 하고 str 를'abc'로 가리 키 며'abc'가 있 으 면 str 를'abc'로 가리 키 는 것 입 니 다.
클래스 안의 수치 가 같 는 지 비교 할 때 equals()방법 을 사용 합 니 다.두 포장 류 의 인용 이 같은 대상 을 가리 키 는 지 테스트 할 때=,아래 는 예 를 들 어 위의 이론 을 설명 한다.
String str1 = "abc"; 
String str2 = "abc"; 
System.out.println(str1==str2); //true 

str 1 과 str 2 가 같은 대상 을 가리 키 는 것 을 알 수 있다.
String str1 =new String ("abc"); 
String str2 =new String ("abc"); 
System.out.println(str1==str2); // false 

새로운 방식 으로 다른 대상 을 만 드 는 것 이다.매번 하나씩 생 성 된다.
따라서 두 번 째 방식 으로 여러 개의"abc"문자열 을 만 듭 니 다.메모리 에 하나의 대상 만 존재 합 니 다.이러한 쓰기 방법 은 메모리 공간 을 절약 하 는 데 유리 합 니 다.또한 프로그램의 운행 속 도 를 어느 정도 향상 시 킬 수 있 습 니 다.JVM 은 스 택 에 있 는 데이터 의 실제 상황 에 따라 새로운 대상 을 만 들 필요 가 있 는 지 여 부 를 자동 으로 결정 하기 때 문 입 니 다.String str=new String("abc");의 코드 는 문자열 값 이 같 든 그렇지 않 든 모두 더미 에 새 대상 을 만 들 고 프로그램의 부담 을 가중 시 킵 니 다.
다른 한편,주의해 야 할 것 은 String str="abc"와 같은 것 을 사용 하고 있 습 니 다.의 형식 정의 클래스 는 항상 당연히 String 클래스 의 대상 str 를 만 들 었 다 고 생각 합 니 다.함정 이 걱정 이 야!대상 이 생 성 되 지 않 았 을 수도 있 습 니 다!이전에 만 든 대상 을 가리 키 는 것 일 수도 있 습 니 다.new()방법 을 통 해서 만 매번 새로운 대상 을 만 들 수 있 습 니 다.
String 류 의 immutable 성질 때문에 String 변수 가 값 을 자주 바 꿔 야 할 때 StringBuffer 류 를 사용 하여 프로그램 효율 을 높이 는 것 을 고려 해 야 합 니 다.
함수 에서 정의 하 는 기본 형식의 변수 와 대상 의 인용 변 수 는 모두 함수 의 스 택 메모리 에서 분 배 됩 니 다.
코드 블록 에서 변 수 를 정의 할 때 자바 는 스 택 에서 이 변 수 를 위해 메모리 공간 을 분배 합 니 다.변 수 를 초과 한 역할 영역 이 있 으 면 자바 는 이 변수 에 분 배 된 메모리 공간 을 자동 으로 방출 합 니 다.이 메모리 공간 은 즉시 다른 용도 로 사용 할 수 있 습 니 다.
메모리 더 미 는 new 가 만 든 대상 과 배열 을 저장 하 는 데 사 용 됩 니 다.
더미 에 분 배 된 메모 리 는 자바 가상 컴퓨터 의 자동 쓰레기 회수 기 에서 관리 합 니 다.
더미 에 배열 이나 대상 이 생 긴 후에 스 택 에서 특수 한 변 수 를 정의 할 수 있 습 니 다.스 택 에 있 는 이 변 수 는 배열 이나 대상 이 메모리 에 있 는 첫 번 째 주소 와 같 습 니 다.스 택 에 있 는 이 변 수 는 배열 이나 대상 의 참조 변수 가 됩 니 다.
인용 변 수 는 배열 이나 대상 을 위 한 이름 과 같 습 니 다.나중에 프로그램 에서 스 택 의 인용 변 수 를 사용 하여 쌓 인 배열 이나 대상 에 접근 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기