①. 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的基本操作
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 }