java学习笔记-21/8/31 字符串常量池

1、Java命名:

常量命名:

应该全部为大写字母,可以包含多个单词,单词之间使用"_"连接,比如:MIN_AGE,力求语义表达完整清楚,不要嫌名字长。

可以包含数字,但不能以数字开头。

代码中的命名均不能以下划线(_)或美元符号($)开始及结束。

所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。

2、字符串

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

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;}

1、String类是final的,意味着它不能被子类继承。

2、String类实现了Serializable接口,意味着它可以序列化。

3、String类实现了Comparable接口,意味着最好不要用'=='来比较两个字符串是否相等,而应该用compareTo()方法去比较。

4、StringBuffer、StringBuider和String一样,都实现了CharSequence接口,由于String是不可变的,所以遇到字符串拼接的时候就可以考虑下StringBuffer和StringBuide,它俩都是可变的。

5、每个字符串都会有一个hash值,这个hash值在很大概率是不会重复的,因此String很适合来做HashMap的键值。

String的不可变性:

String类被final修饰,所以它不会有子类,意味着没有子类可以重写它的方法,改变它的行为。

String类的数据存储在byte[] 数组中,而这个数组也被final修饰了,这就表示Stirng对象是没办法被修改的,只要初始化一次,值就确定了

第一、可以保证String对象的安全性,避免被篡改,毕竟像密码这种隐私信息一般是用字符串存储的。

第二、保证hash值不会频繁变更,毕竟要作为哈希表的键值,经常变更的话哈希表的性能会变差。

第三、可以实现字符串的常量池,由于字符串的不可变性,String类的一些方法实现最终都返回了新的字符串对象。

 这就意味着不管是截取、拼接还是替换,都不是在原有字符串进行的,而是重新生成了新的字符串对象,原来的字符串并没有发生改变。

3、字符串常量池

String s = new String("二哥");

 这行代码创建了两个对象,使用new关键字创建一个字符串对象时,java虚拟机会先在字符串常量池中查找有没有“二哥”这个字符串对象:

如果有,就不会在字符串常量池中创建“二哥”这个对象了,而是直接在堆中创建一个“二哥”的字符串对象,然后将堆中的这个“二哥”的对象地址返回赋值给变量s。

如果没有,先在字符串常量池中创建一个“二哥”的字符串对象,然后再在堆中创建一个“二哥”的字符串对象,然后将堆中的这个“二哥”的对象地址返回赋值给变量s。

由于字符串的使用频率实在是太高了,所以java虚拟机为了提高性能和减少内存开销,在创建字符串对象的时候进行了一些优化,特意为字符串开辟了一个字符串常量。 

String s = "二哥";

通常情况下,我们采用双引号方式来创建字符串对象,而不是通过new关键字的方式。

当执行上段代码时,java虚拟机会先在字符串常量池中查找有没有“二哥”这个对象,如果有则不创建任何对象,直接将常量池中的“二哥”对象的地址返回,赋值给s;如果没有,则在字符串常量池中创建“二哥”这个对象,然后将其返回,赋值给s。

有了字符串常量池,就可以通过双引号的方式直接创建字符串对象,不要再通过new的方式在堆中创建对象了。也就是说,new的方式始终会创建一个对象,不管字符串的内容是否已经存在,而双引号的方式会重复利用字符串常量池中已经存在的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值