String
关于String类:
Java.lang.String类使用finnal修饰,不能被继承,String是常量,其对象一旦构造就不不再改变,所有对String值发生的改变实际上是将该String的值赋给构造成新的String类;
关于String数据内存:
编码方式:
Java字符串在内存中采用unicode编码方式,即任何一个字符(无论中文还是英文)都算一个字符长度,占用两个字节定长编码;
常量池:
Java在声明创建一个静态String类型数据时,选择在常量池, 所谓常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。在常量池,java会尝试尽量使用同一个对象,对于重复出现的字符串常量,JVM首先会在常量池中查找,如果存在,就返回该对象。
1 String str1 = "abc"; 2 String str2 = new String("abc");
对于1 中的 String str1 = "abc",首先会检查字符串常量池中是否含有字符串abc,如果有则直接指向,如果没有则在字符串常量池中添加abc字符串并指向它.所以这种方法最多创建一个对象,有可能不创建对象。
对于2中的String str2 = new String("abc"),首先会在堆内存中申请一块内存存储字符串abc,str2指向其内存块对象。同时还会检查字符串常量池中是否含有abc字符串,若没有则添加abc到字符串常量池中。所以 new String()可能会创建两个对象。
String的匹配相等问题:
比对象的内容是否相等使用equals(),比较两个引用是否指向同一个对象时用==;
关于StringBuffer:
AbstractStringBuilder是StringBuffer的父类,定义了一些字符串的基本操作,比如append、insert、indexOf等公共方法。