使用final修饰 无疑会在内存上有稍多的消耗,因为final修饰后的属性所在的常量池
常量池(constant_pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量和符号引用。运行时常量池是方法区的一部分。
常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:
1.类和接口的全限定名
2.字段名称和描述符
3.方法名称和描述符
Java中八种基本类型的包装类的大部分都实现了常量池技术,它们是Byte、Short、Integer、Long、Character、Boolean,另外
两种浮点数类型的包装类(Float、Double)则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在
对应值在-128到127时才可使用对象池
在方法内使用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;
}
}