>  기사  >  Java  >  Java에서 힙과 스택의 차이점 분석

Java에서 힙과 스택의 차이점 분석

高洛峰
高洛峰원래의
2017-01-24 14:52:052085검색

힙과 스택은 Java 데이터 구조에서 매우 중요한 개념입니다. 이 기사에서는 둘 사이의 차이점을 더 자세히 분석합니다. 당신의 참고를 위해. 자세한 내용은 다음과 같습니다.

Java의 힙은 클래스(객체들이 공간을 할당하는 런타임 데이터 영역입니다. 이러한 객체는 new, newarray, anewarray, multianewarray 등의 명령어를 통해 생성되며 프로그램이 필요하지 않습니다. 힙은 가비지 수집을 담당합니다. 힙의 장점은 메모리 크기를 동적으로 할당할 수 있다는 점과 런타임에 메모리를 동적으로 할당하기 때문에 수명을 미리 컴파일러에 알릴 필요가 없다는 것입니다. 그리고 Java의 가비지 컬렉터가 이를 자동으로 수집합니다. 단점은 런타임 시 메모리의 동적 할당으로 인해 액세스 속도가 느리다는 것입니다.

스택의 장점은 힙보다 액세스 속도가 빠르다는 것입니다. 두 번째로는 스택 데이터를 공유할 수 있지만 스택에 저장되는 데이터의 크기와 수명을 결정해야 하며 스택에는 주로 일부 기본 유형의 변수가 저장된다는 점입니다. (int, short, long, byte, float, double) 및 객체 핸들

스택의 매우 중요한 특징은 스택에 저장된 데이터를 공유할 수 있다는 것입니다. 동시에 정의합니다:
int a = 3;
int b = 3;
컴파일러는 먼저 int a = 3을 처리하고 스택에 변수 a에 대한 참조를 생성합니다. 그런 다음 스택에 3이라는 값이 있는지 검색합니다. 값이 없으면 3을 저장합니다. 그런 다음 a가 3을 가리킵니다. 그런 다음 이미 a가 있으므로 b의 참조 변수를 만든 후 int b = 3을 처리합니다. 스택에서 3의 값을 가지면 b는 직접 3을 가리키게 됩니다. 이렇게 하면 a와 b는 모두 3을 가리키게 됩니다. 3의 경우

이때, a=4로 설정하면 그런 다음 컴파일러는 스택에 4 값이 있는지 다시 검색합니다. 그렇지 않으면 4를 저장하고 이미 있으면 4를 가리킵니다. 따라서 이 주소를 직접 가리킵니다. a 값의 변경은 b 값에 ​​영향을 미치지 않습니다.

이러한 종류의 데이터 공유는 두 개체의 참조가 동시에 하나의 개체를 가리킨다는 사실과 관련이 있습니다. 이 경우 a의 수정은 b에 영향을 미치지 않고 컴파일러에 의해 수행되므로 공간 절약에 도움이 되며 객체 참조 변수가 객체의 내부 상태를 수정하면 다른 객체 참조에 영향을 미치기 때문입니다.

String은

String str = new String("abc");
String str = "abc";

의 두 가지 형식으로 생성할 수 있는 특수 래퍼 클래스 데이터입니다. 힙에 저장될 새 객체를 생성합니다. 호출될 때마다 새 객체가 생성됩니다. 두 번째는 먼저 스택에 문자열을 생성하는 것입니다. 그런 다음 "abc"가 스택에 저장되어 있는지 확인합니다. 그렇지 않은 경우 "abc"를 스택에 저장하고 str이 "abc"를 가리키도록 만듭니다. 🎜>

클래스의 값이 같은지 비교할 때는 equals() 메서드를 사용하고, 두 패키징 클래스의 참조가 동일한 객체를 가리키는지 테스트할 때는 ==를 사용합니다. 이론. .

String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true

str1과 str2가 동일한 객체를 가리키는 것을 볼 수 있습니다.

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false

new를 사용하여 다양한 객체를 생성하세요. 한 번에 하나씩 생성합니다.

따라서 첫 번째 방법을 사용하여 여러 개의 "abc" 문자열을 생성하면 실제로는 메모리에 하나의 개체만 있게 됩니다. 이 쓰기 방법은 동시에 메모리 공간을 절약하는 데에도 도움이 됩니다. JVM은 스택에 있는 데이터의 실제 상황을 기반으로 새 객체를 생성해야 하는지 여부를 자동으로 결정하기 때문에 프로그램 성능이 어느 정도 향상됩니다. String str = new String("abc"); 코드의 경우 문자열 값이 같은지, 새 개체를 만들어야 하는지 여부에 관계없이 항상 힙에 새 개체가 생성되므로 부담이 늘어납니다. 프로그램.

반면, String str = "abc";와 같은 형식을 사용하여 클래스를 정의할 때 항상 String 클래스의 객체 str이 생성된다고 가정합니다. 함정 걱정! 개체가 생성되지 않았을 수 있습니다! 이전에 생성된 객체를 가리킬 수도 있습니다. new() 메소드를 통해서만 매번 새로운 객체가 생성되도록 보장할 수 있습니다.

String 클래스의 불변성으로 인해 String 변수의 값을 자주 변경해야 하는 경우 StringBuffer 클래스를 사용하여 프로그램 효율성을 높이는 것을 고려해야 합니다.

이 글이 모든 분들의 Java 프로그래밍 학습에 도움이 되기를 바랍니다.

Java의 힙과 스택의 차이점 분석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.