在Android中,公共类中的全局变量有什么用,或者在一个线程中声明它?
我实现了线程
a very good Thread,这里,每次触发线程时都会声明String updateWords
。
那么,这会影响记忆吗?
我宣布不。变量,所以,我在问。
任何帮助将不胜感激。 谢谢。
答案 0 :(得分:2)
当备选方案远远更糟时,你应该只使用全局变量。
启动线程比创建对String的引用要贵1000倍。如果您担心使用单个字符串,甚至是少数字符串,则根本不应该创建一个线程。
即使你有几千个字符串,他们将使用与全局变量相同的内存量,因为它们使用局部变量。唯一的区别是全局变量使用堆,局部变量使用堆栈和堆,大部分用法仍在堆上。
答案 1 :(得分:0)
良好的面向对象编程通常会避开“全局”变量,而是倾向于将变量封装在对象中。有些时候可以打破,就像你有常量或其他东西一样,但有一些模式。
那就是说,是的,如果你创建多个线程,每个线程都有自己的updateWords
,那么你将创建更多的对象,从而更多的垃圾收集。但是,由于updateWords
是一个String,如果它在所有线程中设置为相同的值,则Java应该只创建一个String
,因为String
在Java中是文字的。
答案 2 :(得分:0)
创建一个公共静态属性,并在Main Class上初始化,如下所示:
public class foo {
public static final string name = "Stack Overflow";
}
答案 3 :(得分:0)
只要线程没有被破坏,就会消耗内存。查看字符串是否是您的类的属性(根据面向对象的设计)。
答案 4 :(得分:0)
Java(和其他语言)中有几个用于各种任务的内存区域。
最昂贵的是堆内存,基本上所有使用new
关键字创建的内容都会转到堆中。
然后就是堆栈,可以说是一个本地“堆”,但没有与堆变量创建相关的大部分成本,因此更快。几乎所有局部变量如updateWords
都位于堆栈中。
寄存器是处理器内部变量,闪电般快速。 JVM优化器总是试图在适合的时候将内容放入内部寄存器,但由于寄存器的数量非常有限,只有非常频繁使用的变量才会存在。
但是昂贵意味着堆和寄存器之间的执行时间差为0.0000000001秒。
然后,在声明本地String或任何Object:指针时,您应该知道实际保留了什么。实际上是一个32/64位“整数”,它保存实际找到String / Object的位置。所以指令String updateWords = updateAuto();
将不创建一个新字符串,也不会将其复制到任何地方,所有发生的事情是updateAuto()函数返回一个指针(“整数”)并且updateWords设置为值。这和编写int updateWords = 42
一样快,并且如果优化器感觉完全在堆栈甚至寄存器上完成。
通常,您应该更多地关注可见性以及最方便/产生最少错误的应用程序,而不是内部组织内存的错误。一次手动优化通常会使你的应用程序速度提高不超过0.0000001%,而在保留内存时唯一要做的事就是在这样的循环中毫无意义地执行:
for (int i = 0; i < 1000; ++i) {
new MyReallyStupidMemoryWastingObject();
}
但即使是由垃圾收集器优雅地处理(只要你不通过将它们放在列表或类似的东西中来保存所有这些指针)。
因此:使用全局变量可以简化代码并减少错误。示例是全局常量,如枚举或广泛使用的字符串关键字。否则使用本地或类本地变量并依赖JVM来正确地执行操作。
一个常见的事情是给JVM一个使用单词final
的用法提示。这允许JVM对此变量进行完全优化,甚至通过将其放入寄存器中来完全删除它,因为它知道您永远不会更改它。