String问题总结

这篇博客探讨了Java中的字符串拼接与字符串池的概念。通过示例代码展示了`String`对象在堆和常量池中的存储区别,以及`intern()`方法的作用。文章还提到了JVM内存管理和垃圾回收机制,并讨论了如何通过`-XX:StringTableSize`参数优化字符串常量池的效率,减少堆内存使用。此外,涉及了Java内存区域,包括栈和堆的用途,以及对象的生命周期。
摘要由CSDN通过智能技术生成

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.子类的构造方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值