Java 基础篇学习(7/3-7/4)
一、 数据类型
注:包装类型中一般设有缓冲池,比如 Integer、String。
1、Integer缓存池范围-128~127都是同一个地址,在缓存池范围内赋值不会创建新的对
象,且不开辟新内存空间。该缓存池由源码Integer.class中的IntegerCache这个私有静态
内部类定义。该缓存池与jvm关系是:缓存池创建缓存数据,jvm会在常量池中直接找到该
值引用。不用创建新的对象。还可以在jvm中设置缓存池hi最大值。
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
2、String 也有缓存池
String 不可变性:所谓不可变性就是不可以手动修改已经分配内存空间的 String。
// String使用+拼接,不能改变原来的String,会创建新的String对象。创建和分配空间,
所以+号耗时。
String str1 = "java";
str1.concat("c++");
System.out.println("str1: " + str1);//仍然为 java
String 不可变性的好处就是:1、可以缓存 hash 值,不用重复计算 hash 值,例如 String 常
被用于 map 的键 key。2、String pool 中应用了 String 不可变性。3、安全性。String 通常作
为参数,例如,网络地址不需要被改变。4、线程安全性。String 不可变性天生具备线程安
全,可以在多个线程中安全地使用。
String Pool 字符串缓存池:
String 缓存池中保存所有字符串字面量(literal strings),这些在编译时就确定。可以使用
intern()方法在运行时,将字符串加入到 String Pool 中。Intern()方法就是将 String Pool 中没
有的字符串加入,返回 String Pool 中引用。如果已经存在直接返回 String Pool 中引用。
注意:例如,String str = new String(“x”)+new String(“x“);str.inern();如果 String Pool 之
前没存在“xx”,调用的 str 引用会指向 String Pool 中字面量。【+号不会在 String Pool 中创
建”xx”对象,只会在 Heap 中创建对象。】
批注 [许1]: 1、直接 new String(“x”)会在编译期,在
String Pool 创建字符串对象。
2、+号不会在 String Pool 中创建对象。
3、String str = “java”会在字符串常量池中创建对象。
评论0
最新资源