Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用;常数;Java中的对象_Java_Constants - Fatal编程技术网

使用;常数;Java中的对象

使用;常数;Java中的对象,java,constants,Java,Constants,根据我的研究,我知道在Java中使用static final修饰符可以得到一个几乎类似C的常量值。i、 e.static final int my_const_int=5 通过实验,我发现您可以以相同的方式创建常量对象,但它需要使用new关键字,即static final Color c=new Color(10055) 我的问题是:使用这种方法,会在运行时在堆上分配颜色对象c,在运行时在堆栈上分配颜色对象c(Java是否使用堆栈?),还是会在编译时以某种方式计算颜色对象c以减少内存占用 我是一

根据我的研究,我知道在Java中使用
static final
修饰符可以得到一个几乎类似C的常量值。i、 e.
static final int my_const_int=5

通过实验,我发现您可以以相同的方式创建常量对象,但它需要使用
new
关键字,即
static final Color c=new Color(10055)

我的问题是:使用这种方法,会在运行时在堆上分配颜色对象c,在运行时在堆栈上分配颜色对象c(Java是否使用堆栈?),还是会在编译时以某种方式计算颜色对象c以减少内存占用


我是一个最近转换的C程序员,所以虽然我对内存非常了解,但我对Java如何使用内存知之甚少。任何洞察都将不胜感激。

所有对象都存储在堆中,即使是
静态final
对象。就编译器所知,对象可能是可变的

堆栈上只存储基本体和引用


另一方面,编译器将在使用原语常量的地方内联这些常量。

所有对象都存储在堆上,即使是
静态final
对象。就编译器所知,对象可能是可变的

堆栈上只存储基本体和引用


另一方面,编译器将在使用原语常量的位置内联这些常量。

所有对象都在Java堆上分配。在堆栈上分配变量的唯一时间是为本地声明的原语和对堆上对象的本地声明引用(考虑“指针”,但不考虑指针算术、解引用等)

还值得注意的是,由于数组是对象,它们也在堆中分配,并且您在线程堆栈中维护对指针的引用,即使它是一个基本数组,如
int[]


编辑:感谢Marko的编辑。Hotspot JVM(可能还有其他JVM)可以根据对象引用是否可以“转义”方法或堆栈帧来执行优化。如果对象的引用没有在堆栈帧之间传递(即它被发布到其他线程),也不会传递给父堆栈帧(即该方法返回的),那么该对象被认为是“不可维护的”,并且在堆栈帧本身中被分配,类似于如何在C++中在堆栈上分配对象。p> 所有对象都在Java堆上分配。在堆栈上分配变量的唯一时间是为本地声明的原语和对堆上对象的本地声明引用(考虑“指针”,但不考虑指针算术、解引用等)

还值得注意的是,由于数组是对象,它们也在堆中分配,并且您在线程堆栈中维护对指针的引用,即使它是一个基本数组,如
int[]


编辑:感谢Marko的编辑。Hotspot JVM(可能还有其他JVM)可以根据对象引用是否可以“转义”方法或堆栈帧来执行优化。如果对象的引用没有在堆栈帧之间传递(即它被发布到其他线程),也不会传递给父堆栈帧(即该方法返回的),那么该对象被认为是“不可维护的”,并且在堆栈帧本身中被分配,类似于如何在C++中在堆栈上分配对象。p> 从我从C切换到Java时起:

第一个技巧是忘记所有关于内存的知识,特别是关于存储常量的最有效方法的知识。Java非常简单,你不必为此烦恼。第二个诀窍是学会随意地做那些在C中你从来不敢做的简单事情。创建对象并忘记它们:不要担心谁有指向它们的指针,不要担心它们是否被释放,不要担心你在百万周期循环中重复分配和释放空间

关于Java内存的三件事:

您无法加快它的速度。Java将每件事情都放在一个单独分配的内存位中,并使用引用跟踪它。在C语言中,可以在一个连续的内存块中排列嵌套结构集。无论您做什么,在Java中,同样的事情将是指向其他内存块的一组指针(“引用”),其中许多仍然是更多的指针集。接受它

你不能放慢速度。Java优化器会尽一切努力让你的代码运行得更快,JVM优化器会在你的代码运行时这样做。将对象放在堆栈上(如其他地方所述)是典型的

(这不是您通常需要考虑的事情,但它可以为基准测试做一些奇怪的事情。JVM可以巧妙地注意到,在循环运行时,您实际上没有看到正在填充的百万数字数组中超过5个元素,并抖动循环,使其仅运行5次来填充这5个元素。)

还有一个大问题:

你不能把事情搞砸如果您有一个包含(非空)引用的变量,那么它是好的。物体就在那里。它与设置引用时的对象相同。最令人惊讶的是,当你停止使用某些东西时——并且只有当你停止使用它时——空间才被释放。空的一个引用,以百万计的对象和…噗!都走了!你可以在不使用更多内存的情况下构建同样大的东西。Java的一个关键(也许是关键)是尽其所能地利用它

(免责声明:大型数组和使用它们的东西——ArrayList、HashTable——可能会干扰垃圾收集器,并导致其需要的内存超过应有的数量。但请稍后再担心。)

通常,使用“static”和“final”等词来控制程序的运行,而不是试图提高速度或内存使用率。指定算法是你的工作