Java のヒープはランタイム データ領域であり、クラス オブジェクトはそこから領域を割り当てます。これらのオブジェクトは、new、newarray、anewarray、multianewarray などの命令によって作成されます。ヒープはガベージによって収集されます。 collection Responsible、ヒープの利点は、メモリ サイズを動的に割り当てることができることです。また、実行時に動的にメモリを割り当て、Java のガベージ コレクタがこれらを自動的に収集しないため、ライフタイムを事前にコンパイラに伝える必要がないことです。ただし、実行時にメモリが動的に割り当てられるため、アクセス速度が遅くなるという欠点があります。スタックの利点は、レジスタに次いでアクセス速度が速いことです。スタック データは共有できるため、データのサイズと有効期間を決定する必要があり、柔軟性がありません。スタックには主にいくつかの基本的な変数 (int、short、long、byte、float、double、boolean、char) とオブジェクトが格納されます。
スタック: 非常に重要な特別な機能があります。つまり、スタックに格納されたデータを同時に定義するとします。
int a = 3; int b = 3;
この種のデータの共有は、2 つのオブジェクトの参照が同時に 1 つのオブジェクトを指している場合とは異なります。 a の変更は b には影響しません。これはコンパイラーによって行われ、スペースの節約とオブジェクト参照変数の変更に役立ちます。
String は、別のオブジェクト参照変数に影響を与える特別なラッパー クラス データです。
String str = new String("abc"); String str = "abc";
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
つまり、最初の方法を使用して複数の「abc」文字列を作成すると、実際にはメモリ内にオブジェクトが 1 つだけ存在することになり、メモリ領域を節約できると同時に、実行速度も向上します。これは、JVM がスタック内のデータの実際の状況に基づいて、新しいオブジェクトを作成する必要があるかどうかを自動的に判断するためです。 String str = new String("abc"); のコードの場合、文字列値が等しいかどうか、または新しいオブジェクトを作成する必要があるかどうかに関係なく、常に新しいオブジェクトがヒープに作成されるため、負荷が増加します。プログラム。
一方で、注意してください: String str = "abc"; のような形式を使用してクラスを定義する場合、常に String クラスのオブジェクト str が作成されると想定されます。罠の心配も!オブジェクトが作成されていない可能性があります。以前に作成したオブジェクトを指すだけの場合もあります。新しいオブジェクトが毎回確実に作成されるようにするには、 new() メソッドを使用する必要があります。
String クラスの不変の性質により、String 変数の値を頻繁に変更する必要がある場合は、プログラムの効率を向上させるために StringBuffer クラスの使用を検討する必要があります。 Java のヒープは、クラス オブジェクトがスペースを割り当てるランタイム データ領域です。これらのオブジェクトは、new、newaray、anewarray、multianewarray などの命令によって作成されます。ヒープはガベージ コレクションを実行します。ヒープの利点は、メモリ サイズを動的に割り当てることができることです。ヒープは実行時に動的にメモリを割り当て、Java のガベージ コレクタが不要なデータを自動的に収集するため、ライフタイムを事前にコンパイラに伝える必要がありません。欠点は、実行時にメモリが動的に割り当てられるため、アクセス速度が遅いことです。
/************************************************* ************************************************* *******************************************/
1. 基本データ型と参照データ型。
2. Java プログラムの実行時にメモリがどのように割り当てられるかについては説明されていませんが、通常、Java 開発者または学習者はメモリを 3 つの領域 (スタック領域、ヒープ領域、メソッド領域) に分割します。
a. すべてのオブジェクトが保存され、各オブジェクトには対応するクラスに関する情報が含まれます (クラスの目的は操作命令を取得することです)。
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 中国語 Web サイトの他の関連記事を参照してください。