public static void main(String[] args) {
// System.out.println(“1”);
// javaavtivitydemo s = new javaavtivitydemo();
// s.method1();
//字符串常量
String S1 = "A";
String S2 = "B";
//编译器优化,直接做出来"AB",放入串池
String S3 = "A" + "B";
// S4是用StringBuilder来做出来的,new出来的一个对象,在堆区,不在串池
String S4 = S1 + S2;
String S5 = "AB";
//常量池{"A","B","AB"}
//将字符串放入串池,如果有,返回该字符串串池上对象
String S6 = S4.intern();
//
System.out.println(S3 ==S4); //false, 一个在堆区,一个在串池
System.out.println(S3 == S5); //true , 都在串池
System.out.println(S3 == S6); //true, 都在串池
//堆中对象
// String x2 = new String(“C”) + new String(“D”);
// String x1 = “CD”;
// x2.intern();
// System.out.println(x1 == x2); //false
//如果调换最后两行位置,“CD”入池,x1和x2是一个对象
String x2 = new String(“C”) + new String(“D”);
x2.intern();
String x1 = “CD”;
System.out.println(x1 == x2); //true
//如果是jdk1.6版本,入池操作会有变化,不会将堆中(new)的对象直接入池,而是复制一份放入池,即堆中的"CD"和常量池中"CD"不同
}
//-Xmx10m调整堆区默认大小,调整后,GC overhead limit了因为JVM认为程序已经癌症晚期了,在官方文档上有写
//-XX:-UseGCOverheadLimit
//改完后就是java heap space 对空间不足
// List list = new ArrayList<>();
// int i = 0;
// try{
// for(int j = 0;j<260000;j++){
// list.add(String.valueOf(j).intern());
// i++;
// }
// }catch (Throwable e){
// e.printStackTrace();
// }
// finally {
// System.out.println(i);
// }
//String垃圾回收机制
//-XX:+PrintStringTableStatistics -XX:+PrintGCDetails -verbose:gc
//当字符串数量还较少时,不触发GC回收,但10000个时,就被回收了。
// int i = 0;
// try{
// for(int j = 0;j<10000;j++)
// {
// String.valueOf(j).intern();
// i++;
// }
// }catch (Throwable a){
// a.printStackTrace();
// }finally {
// System.out.println(i);
// }
//String性能调优,底层数据结构是hashtable实现
//当系统内字符串常量数据太大,可以用 -XX StringTableSize=桶个数 ,调整效率,保持一个何时的桶大小,且提高效率
//intern入池,减少堆内存的使用
八大基础类型:boolean,int,double(1.1),float,byte,short,long,char.他们存储于栈中,引用类型存储在
对于引用类型,=会让两个对象指向同一个对象。基本类型是赋值操作。
堆区:堆内存用于存放由new创建的对象和数组
栈区:局部变量、程序运行状态、方法返回值。
Java程序初始化顺序:
1.父类的静态代码块
2.子类的静态代码块
3.父类的普通代码块
4.父类的构造方法
5.子类的普通代码块
6.子类的构造方法