java性能:在变量中存储hashMap值是否冗余?

java性能:在变量中存储hashMap值是否冗余?,java,performance,hashmap,Java,Performance,Hashmap,我的目标是减少内存使用。 如果需要多次使用hashMap值,是否应该将该值存储在变量中 public void upcCheck() { String prodUPC = pHashMap.get("productUpc"); if(prodUpc == ''){ //do stuff; } else if(prodUpc == '0123456'){ //do oth

我的目标是减少内存使用。 如果需要多次使用hashMap值,是否应该将该值存储在变量中

public void upcCheck() {
          String prodUPC = pHashMap.get("productUpc");
          if(prodUpc == ''){
            //do stuff;
          }
          else if(prodUpc == '0123456'){
            //do other stuff;
          }
    }
或者我应该总是使用hashMap的get方法来避免冗余和不必要的内存使用

 public void upcCheck() {

              if(pHashMap.get("productUpc") == ''){
                //do stuff;
              }
              else if(pHashMap.get("productUpc") == '0123456'){
                //do other stuff;
              }
        }
hashMap包含很多值:产品类型、产品价格等。。。许多方法都设置为使用这些值。所以我想知道最好的方法。
谢谢大家!

简短的回答是否定的,您不必担心使用变量会占用额外的内存


调用方法upcCheck时,将字符串prodUPC分配给pHashMap.getproductUpc的值。prodUPC将指向字符串对象。哈希映射还指向字符串对象。您没有复制字符串对象。您正在创建对它的新引用。存储对对象的引用占用的空间很小,但这个空间非常小,比如4个字节。

简单的回答是不,您不需要担心使用变量会占用额外的内存


调用方法upcCheck时,将字符串prodUPC分配给pHashMap.getproductUpc的值。prodUPC将指向字符串对象。哈希映射还指向字符串对象。您没有复制字符串对象。您正在创建对它的新引用。存储对对象的引用占用的空间很小,但这个空间非常小,比如4个字节。

它不是冗余的,也不占用很多额外的内存。额外的变量不会占用太多内存;正如post所提到的,它并不依赖于虚拟机的标准数量,但数量很小,不必担心

在这种情况下,如果您使用的是一个列表,那么重要的是,根据数组的大小,查看访问该列表的时间会增加多少。这种时间度量称为时间复杂度。不过,既然你使用的是地图,那就不用担心了


我更喜欢使用额外的变量,因为它更容易阅读。最好总是选择可读性。删除该变量不会带来任何明显的性能提升,因为它根本不需要占用太多内存,也不需要担心。

它不是冗余的,也不需要占用太多额外内存。额外的变量不会占用太多内存;正如post所提到的,它并不依赖于虚拟机的标准数量,但数量很小,不必担心

在这种情况下,如果您使用的是一个列表,那么重要的是,根据数组的大小,查看访问该列表的时间会增加多少。这种时间度量称为时间复杂度。不过,既然你使用的是地图,那就不用担心了


我更喜欢使用额外的变量,因为它更容易阅读。最好总是选择可读性。删除该变量不会导致任何明显的性能提升,因为它根本不占用太多内存,因此不应该担心。

如果我需要多次使用该值,则应该在变量中存储hashMap值。create method bound变量是创建对HashMap值的引用,然后您使用引用来解等式,当您结束方法时,JVM将回调此方法使用的所有内存。

如果我需要多次使用该值,您应该在变量中存储HashMap值。create method bound变量是创建对HashMap值的引用,然后使用引用进行反等式运算,当您执行方法结束时,JVM将回调此方法使用的所有内存。

第一个版本更快、更紧凑,如果只是因为您没有多次冗余访问HashMap

如果你真的内存紧张,你可能会考虑去处理。 从您的代码片段中不清楚它是否会有帮助,但其想法是,如果您有大量无法或将无法修改的对象,则可以丢弃重复的对象

在我被人们大骂这是不必要的,是个坏主意的人激怒之前,我要认真对待你们的记忆限制问题。这不是任何人通常应该关心的事情

如果将多个字符串对象与String.intern一起使用,则可能有多个字符串对象包含在程序周围浮动的0123456值

第二行的作用是将读入的字符串替换为从内部池中保存该值的“规范”字符串。其效果可能是大量减少游戏中持有0123456值的字符串对象的数量。 如果在2000个产品中阅读,可能有1000个字符串包含相同的值。 注:根据经验,大多数数据是不均匀的,最常见的值通常代表50%的人口。 这样做的效果是可以释放999个字符串对象,并可以为您提供10K的内存

我再说一遍,这不是你想要的 d通常是这样,但这比担心局部变量占用的奇数空间更可能节省空间

这里有一篇关于实习字符串的帖子。阅读这篇文章,看看这是否适合你


第一个版本更快、更紧凑,这仅仅是因为您没有多次冗余地访问HashMap

如果你真的内存紧张,你可能会考虑去处理。 从您的代码片段中不清楚它是否会有帮助,但其想法是,如果您有大量无法或将无法修改的对象,则可以丢弃重复的对象

在我被人们大骂这是不必要的,是个坏主意的人激怒之前,我要认真对待你们的记忆限制问题。这不是任何人通常应该关心的事情

如果将多个字符串对象与String.intern一起使用,则可能有多个字符串对象包含在程序周围浮动的0123456值

第二行的作用是将读入的字符串替换为从内部池中保存该值的“规范”字符串。其效果可能是大量减少游戏中持有0123456值的字符串对象的数量。 如果在2000个产品中阅读,可能有1000个字符串包含相同的值。 注:根据经验,大多数数据是不均匀的,最常见的值通常代表50%的人口。 这样做的效果是可以释放999个字符串对象,并可以为您提供10K的内存

我要再说一遍,这不是你通常会做的事情,但它更可能节省你的空间,而不是担心一个局部变量占用奇数空间

这里有一篇关于实习字符串的帖子。阅读这篇文章,看看这是否适合你


这不是多余的。只需一个get调用就可以访问hashmap。尽管查看访问hashmap的成本没有访问一个大列表那么高,但它仍然更容易阅读。喜欢可读性。如果您担心引用变量会占用堆栈空间,那么签出POSI更喜欢第一种方式,而不是两个get操作,即使这是一个常量时间操作。在第一个代码段中没有额外的显著内存使用。只需将变量引用保持在正确的范围内。hashMap包含很多值ae:product type、product price等:听起来你根本不应该有hashMap,而是一个product类型的对象。Java是一种面向对象语言。此外,您的代码不会编译,这不是您在Java中比较字符串的方式。额外的内存开销是4或8字节,具体取决于JVM一次。这不到典型计算机内存的十亿分之一。如果你关心这些事情。。。我想知道你的问题,这不是多余的。只需一个get调用就可以访问hashmap。尽管查看访问hashmap的成本没有访问一个大列表那么高,但它仍然更容易阅读。喜欢可读性。如果您担心引用变量会占用堆栈空间,那么签出POSI更喜欢第一种方式,而不是两个get操作,即使这是一个常量时间操作。在第一个代码段中没有额外的显著内存使用。只需将变量引用保持在正确的范围内。hashMap包含很多值ae:product type、product price等:听起来你根本不应该有hashMap,而是一个product类型的对象。Java是一种面向对象语言。此外,您的代码不会编译,这不是您在Java中比较字符串的方式。额外的内存开销是4或8字节,具体取决于JVM一次。这不到典型计算机内存的十亿分之一。如果你关心这些事情。。。我很想知道你的问题,谢谢你,文斯。我正在开发一款android应用程序。这就是为什么这是一个令人担忧的问题。谢谢大家的帮助,谢谢你,文斯。我正在开发一款android应用程序。这就是为什么这是一个令人担忧的问题。谢谢大家的帮助。
String productUPC=streamThing.readThing();
productUPC=productUPC.intern();