关于方法内使用final修饰属性

使用final修饰 无疑会在内存上有稍多的消耗,因为final修饰后的属性所在的常量池

    常量池(constant_pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量和符号引用。运行时常量池是方法区的一部分。
    常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
        1.类和接口的全限定名
        2.字段名称和描述符
        3.方法名称和描述符

Java中八种基本类型的包装类的大部分都实现了常量池技术,它们是ByteShortIntegerLong、Character、Boolean,另外
两种浮点数类型的包装类(Float、Double)则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在
对应值在-128127时才可使用对象池

在方法内使用final修饰后 因为进入一个方法是开辟一个方法栈帧 在栈帧内执行此方法,所以执行完毕后 栈帧关闭前会将final内的值清洗掉 但是由于该属性已通过final修饰 并且存在于常量池内,故引用不会改变 下次获取该对象可不用重新在堆中开辟新的空间。

未完待续…

package finall;


import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AAAAA {

    Logger logger = LoggerFactory.getLogger(AAAAA.class);

    @Test
    public void main(){

        List<String>[] param = new ArrayList[1000];
        for(int i=0;i<param.length;i++){
            int len = 100;
            List<String> objects = new ArrayList<>(len);
            for(int j=0 ; j < len ; j ++){
                objects.add(String.valueOf(j));
            }
            param[i] = objects;
        }

        String s = testA(param);
        String s2 = testA(param);
        String s1 = testB(param);

        logger.info("");

    }


    private String testA(List<String>[] param){

        long start = System.nanoTime();
        logger.info("a开始时间 {}"+start);
        Map<String, Map<String, String>> stringMapMap = testA1(param);
        long end = System.nanoTime();
        logger.info("a结束时间 {}"+end);
        logger.info("a耗时 {}"+(end-start));
        logger.info(stringMapMap+"");

        return new StringBuilder("a开始时间 ")
                .append(start)
                .append("   ")
                .append("a结束时间  ")
                .append(end)
                .append("   ")
                .append("a 耗时 ")
                .append((end-start))
                .toString();
    }
    private Map<String,Map<String,String>> testA1(List<String>...a){

        final Map<String,Map<String,String>> result = new HashMap<>();

        if(a != null && a.length > 0){
            for (List<String> item : a) {
                String[] strings = {};
                item.toArray(strings);
                Map<String, String> stringStringMap = testA11(strings);
                result.put(String.valueOf(Math.random()*1000000 + 1),stringStringMap);
            }
        }
        return result;
    }
    private Map<String,String> testA11(String...a){
        final Map<String,String> result = new HashMap<>();

        for (String item : a) {
            result.put(item,item);
        }
        return result;
    }




    private String testB(List<String>[] param){

        long start = System.nanoTime();
        logger.info("b开始时间 {}"+start);
        Map<String, Map<String, String>> stringMapMap = testB1(param);
        long end = System.nanoTime();
        logger.info("b结束时间 {}"+end);
        logger.info("b耗时 {}"+(end-start));
        logger.info(stringMapMap+"");

        return new StringBuilder("b开始时间 ")
                .append(start)
                .append("   ")
                .append("b结束时间  ")
                .append(end)
                .append("   ")
                .append("b 耗时 ")
                .append((end-start))
                .toString();
    }
    private Map<String,Map<String,String>> testB1(List<String>...a){

        Map<String,Map<String,String>> result = new HashMap<>();

        if(a != null && a.length > 0){
            for (List<String> item : a) {
                String[] strings = {};
                item.toArray(strings);
                Map<String, String> stringStringMap = testB11(strings);
                result.put(String.valueOf(Math.random()*1000000 + 1),stringStringMap);
            }
        }
        return result;
    }
    private Map<String,String> testB11(String...a){

        Map<String,String> result = new HashMap<>();

        for (String item : a) {
            result.put(item,item);
        }
        return result;
    }



}

猜你喜欢

转载自blog.csdn.net/qq_18259357/article/details/80285189