String

1、对象和对象引用:在Java中,不能直接操作对象,所以就有了对象引用,对象引用存储对象在内存中的地址;


2、JVM在执行程序时会把内存区域划分为若干个不同的数据区域:方法区、栈、堆;

      方法区:运行时的常量池;

      栈:基本类型变量,对象引用,方法调用;

      堆:创建的对象和数组;

      例子:对象存储在堆中,而对象的引用存储在栈中;


3、字符串不可变:指字符串对象不可变,而不是字符串引用不可变;

     源码层面分析:

     Java8,String是使用char数组实现;

public final class String implements java.io.Serializable, Comparable<String>, CharSequence { 
   /** The value is used for character storage. */ 
   private final char value[];

   /** Cache the hash code for the string */ 
   private int hash; // Default to 0
}

     Java9,String是使用byte数组实现,同时使用coder标识使用哪种编码;

public final class String 
   implements java.io.Serializable, Comparable<String>, CharSequence { 
        /** The value is used for     character storage. */ 
        private final byte[] value;
    /** The identifier of the encoding used to encode the bytes in {@code value}. */ 
        private final byte coder;
}

从源码中可知,String其实是通过操作value数组实现的;

value数组被private修饰且未提供修改方法,被final修饰意味着一旦被初始化就无法改变;


4、不可变优势

      线程安全:可以在多线程之间共享

     hash值不变:String类中重要字段hash,用来保存字符串对象的hashcode,由于字符串对象的不可变性,所以一旦字符串被                             创建,其hash值就不会被改变,非常适合做为hashmap的key值,极大提高效率


5、参考文章

https://zhuanlan.zhihu.com/p/92544319

https://zhuanlan.zhihu.com/p/94428221

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值