기본 유형과 캡슐화된 유형 데이터, Java의 힙 및 스택 간의 관계 요약
Java의 힙은 클래스 객체가 공간을 할당하는 런타임 데이터 영역입니다. 이러한 객체는 new, newarray, anewarray 및 multianewarray와 같은 명령을 통해 생성되며 명시적으로 해제되는 프로그램 코드가 필요하지 않습니다. 힙의 장점은 메모리 크기를 동적으로 할당할 수 있다는 점이며 런타임에 메모리를 동적으로 할당하고 Java의 가비지 수집기가 더 이상 사용되지 않는 메모리를 자동으로 수집하므로 수명을 컴파일러에 미리 알릴 필요가 없다는 것입니다. 하지만 단점은 런타임 시 메모리의 동적 할당으로 인해 액세스 속도가 느리다는 것입니다.
스택의 장점은 레지스터에 이어 액세스 속도가 힙보다 빠르다는 것입니다. , 스택 데이터를 공유할 수 있지만 스택에 저장되는 데이터의 크기와 수명을 결정해야 하며 스택에는 주로 일부 기본 유형의 변수(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을 처리합니다. 스택에 이미 3의 값이 있으므로 b는 이 방법으로 a와 b는 동시에 3을 가리킵니다. 이때 Let a=4이면 컴파일러는 스택에 4 값이 있는지 다시 검색합니다. 그렇지 않은 경우 4를 저장하고 4를 지정합니다. 이미 존재하는 경우 a는 이 주소를 직접 가리킵니다.
이런 종류의 데이터 공유는 동시에 하나의 객체를 가리키는 두 객체의 참조를 공유하는 것과 다르다는 점에 유의해야 합니다. 이 경우 a의 수정은 b에 영향을 주지 않고 다음과 같이 수행되기 때문입니다. 공간 절약에 도움이 되는 컴파일러입니다. 객체 참조 변수가 이 객체의 내부 상태를 수정하면 다른 객체 참조 변수에 영향을 미칩니다.
문자열은 두 가지로 생성될 수 있습니다. form:
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
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의 힙은 클래스 객체가 공간을 할당하는 런타임 데이터 영역입니다. 이러한 객체는 new, newaray, multianewarray와 같은 명령을 통해 생성되며 힙은 가비지 수집을 담당하지 않습니다. 힙의 장점은 메모리 크기를 동적으로 할당할 수 있다는 점이며, 런타임에 동적으로 메모리를 할당하고 Java의 가비지 수집기가 자동으로 메모리 크기를 할당하지 않기 때문에 수명을 컴파일러에 미리 알릴 필요가 없다는 것입니다. 단점은 런타임 시 메모리의 동적 할당으로 인해 액세스 속도가 느리다는 것입니다.
b.jvm只有一个堆区被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
a.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
b.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
c.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
a.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
b.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。字符串常量在方法区分配 ,数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小。
上面明白之后,接下来我们来分析 String str=new String("abc");
String str 是定义了一个String类型的变量,此时只定义了而没有创建对象,而new Sring(“abc”)到底做了什么?我们可以查看String的源码,发现如下:
public final class String
implements java.io.Serializable, Comparable
{
/** The value is used for character storage. */
private final char value[];
……
发现她有一个Value的属性,类型是char[],而此数组又做了什么事情?如果读源码会发现他保存了String对象的值,此时也说明String就是char[]来组织的。
当执行String a="abc";时,JAVA虚拟机会在栈中创建三个char型的值'a'、'b'和'c',然后在堆中创建一个String对象,它的值(value)是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}对象,而这个新创建的String对象会被添加到字符串池中。
此时就存在了两个对象:一个在堆中;一个在字符串池中。
/**************************************************************************************************************************/
String str1 = "abc"; String str2 = new String("abc");
위 내용은 기본 유형과 캡슐화된 유형 데이터, Java의 힙 및 스택 간의 관계 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.
