JVM08_字符串常量池基本特性、内存分配、拼接操作、intern、StringTable垃圾回收(一)

①. String的基本特性


①. String:字符串,使用一对""引起来表示。


String sl = “hello”;//字面量的定义方式


String s2 = new String(“hello”)


②. String声明为final的,不可被继承


③. String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小


④. String在jdk8及以前内部定义了final char[ ],value用于存储字符串数据。jdk9时改为byte[ ]


    public final class String implements 
    java.io.Serializable, Comparable<String>,CharSequence {
    @Stable
    private final byte[] value;
    }


⑤. String:代表不可变的字符序列。简称:不可变性。


⑥. 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中


⑦. 字符串常量池中是不会存储相同内容的字符串的


String的String Pool 是一个固定大小的Hashtable,默认值大小长度是1009。如果放进


StringPool的String非常多, 就会造成Hash冲突严重,从而导致链表会很长,而链表长


了后直接会造成的影响就是当调用String. intern时性能会大幅下降。


使用 - XX:StringTableSize可设置StringTable的长度


在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会


导致效率下降很快。StringTableSize设 置没有要求


在jdk7中,StringTable的长度默认值是60013


jdk8开始,1009是StringTable长度可设置的最小值


②. String的内存分配


①. 常量池就类似一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:


直接使用双引号声明出来的String对象会直接存储在常量池中(比如: String info = “abc” )


如果不是用双引号声明的String对象,可以使用String提供的intern()方法


②.String的基本操作


JVM08_字符串常量池基本特性、内存分配、拼接操作、intern、StringTable垃圾回收(一)

    class Memory {
        public static void main(String[] args) {//line 1
            int i = 1;//line 2
            Object obj = new Object();//line 3
            Memory mem = new Memory();//line 4
            mem.foo(obj);//line 5
        }//line 9
    
        private void foo(Object param) {//line 6
            String str = param.toString();//line 7
            System.out.println(str);
        }//line 8
    }


JVM08_字符串常量池基本特性、内存分配、拼接操作、intern、StringTable垃圾回收(一)




上一篇:试水Nutanix超融合架构,中通信息经验分享


下一篇:动态调用WCF服务