美文网首页
使用final static修饰集合hashmap会产生什么影响

使用final static修饰集合hashmap会产生什么影响

作者: 风逝勿追 | 来源:发表于2019-03-21 21:05 被阅读0次
fianl static HashMap<> HASH_MAP = new   HashMap<>();

这样使用hashmap会有什么影响呢?

第一反应是这个hashmap一旦存进去值,就不能变了。 结果是错的,存进去之后还可以变。
        HASH_MAP.put(2,2+"id");
        HASH_MAP.put(2,"id"+2);

结果是不报错的。

第二反应是这个hashmap第一次初始化之后,它的各项属性值不能变了,比如说Capacity、size等等。结果还是错的,这些属性还是可以变化。
static final HashMap<Integer,String> HASH_MAP = new HashMap<>(16); 
public static void main(String[] args){
        Class c1 = (Class)HASH_MAP.getClass();
        Field[] fs = c1.getDeclaredFields();
        for(int j =0;j<fs.length;j++){
            Field field = fs[j];
            field.setAccessible(true);
            Object val = field.get(HASH_MAP);
            System.out.println("name:"+field.getName()+"\t value = "+val);
        }
        System.out.println("------------------------");
        for(int i = 0;i<10000;i++){
            HASH_MAP.put(i,i+"id");
//            System.out.println(i+1);
        }
        for(int j =0;j<fs.length;j++){
            Field field = fs[j];
            field.setAccessible(true);
            Object val = field.get(HASH_MAP);
            System.out.println("name:"+field.getName()+"\t value = "+val);
            if (field.getName().equals("UNTREEIFY_THRESHOLD")){
                field.set(HASH_MAP,7);
                System.out.println("name:"+field.getName()+"\t value = "+val);
            }

        }
}

这里仅仅是对它的size进行增加,发现不管你put多少个对象进行都是可以的。并且它的size和modCount、threshold都发生了改变。所以说之前的猜想又不对。
下面的运行结果是去掉对UNTREEIFY_THRESHOLD赋值之后的运行结果。loadFactor、UNTREEIFY_THRESHOLD等属性是final修饰的,所以是不能变的;threshold、size等属性没有被final修饰,但是与hashmap内部机制有关,所以你改了也没用。


image.png
所以说只剩下一种可能会报错,就是对这个已经初始化好了的hashmap对象重新进行初始化操作。
static final HashMap<Integer,String> HASH_MAP = new HashMap<>();
HASH_MAP = new HashMap<>(16);

果然只有这样的操作才会报错。

总结

final static修饰其实在刚才的实验过程中起作用的只有final。当final修饰变量时,对于基本类型和string,这个变量的值是不能改变的;当修饰其他类型的对象时,final使其引用恒定不变,但是对象自身却可以自由修改变换。

相关文章

  • 使用final static修饰集合hashmap会产生什么影响

    这样使用hashmap会有什么影响呢? 第一反应是这个hashmap一旦存进去值,就不能变了。 结果是错的,存进...

  • 修饰符和访问控制符的区别

    修饰符有三个,static,final,abstract; final可以修饰类、方法、变量; static修饰变...

  • 优化android程序

    优化java代码 1.尽量使用static和final修饰符 对于一些固定的类和方法尽量使用static修饰符,调...

  • 如何对Java代码进行基本优化

    1、尽量不要使用static、final修饰符和局部变量 final修饰符修饰的变量值不可以修改,修饰的方法不可以...

  • HashMap的存储

    默认的HashMap 构造方法 HashMap static final intDEFAULT_INITIAL_C...

  • SpringBoot: @Value

    使用规则 不能修饰static: 不能修饰final 不能在没有注册的类中使用,例如util类 不能使用new方式...

  • Java 面向对象2

    Java 面向对象 1. static 和 final static关键字---修饰成员变量 用static修饰的...

  • final关键字

    static final用来修饰属性:全局常量

  • 浅谈HashMap

    HashMap结构图 HashMap主要方法 final int hash(Object k) static in...

  • static 和 final 的区别

    static final:static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被...

网友评论

      本文标题:使用final static修饰集合hashmap会产生什么影响

      本文链接:https://www.haomeiwen.com/subject/fhchvqtx.html