String是所有程序设计语言中都有的数据结构,也是在开发中使用最多的数据类型。日常开发中处理最多就是关于字符串的处理。
String层次结构
//final 修饰String类
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
//final 修饰存储的字符数组
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
备注:由其类的申明为final可知其一旦声明就不可变,即String的不可变性
hashCode方法 Code
//简单的求和,算作一个hash散列函数。
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
String、StringBuffer、StringBuilder的关系
String 是final修饰 一旦申明就不可变
StringBuffer可变的,线程安全的
StringBuilder可变的,线程不安全的
备注:如果是需要拼接字符串场景并且不涉及线程安全问题那么推荐使用StringBuilder
(String Pool也称之为字符串常量池) Constant Pool常量池其实是存在方法区中的,和java中方法存在的内存相同。
在java编译好的class文件中,有个区域称为Constant Pool,它是一个由数组组成的表,类型为cp_info constant pool[],
用来存储程序使用的各种常量,包括Class/String/Integer等各种基本java数据类型。对于N 个值相同的String常量,
在Constant Pool中只会创建维护一个。
String string=new String(“hello world”);
分析创建过程:
1、先查找常量池中有没有有hello world字符串,如果没有就在常量池中创建一个。
2、在堆栈中创建一个对象。
说明:想要弄清字符串的引用关系有一点很重要:同一个引用不能指向多个字符串,先断开再指向。
1、不可变特性,由String源码定义final char value[]数组来存字符串内容就可以知道字符串不可变特性
2、常量池概念
3、使用String构造方法来解决字符编码问题(URLEncoder、URLDecoder也可以解决编码问题)
4、String、StringBuffer、StringBuilder三者关系
5、String类的hashCode实现算法是哈希算法(散列函数)
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
6、String中很多方式是使用到了Arrays工具类中的方法的
7、jdk1.8出现了一个join方法可以去看下
8、String format方法可以了解一下
9、public native String intern();本地方法可以了解一下
http://www.ibm.com/developerworks/cn/java/j-lo-basic-types/index.html