Java源码学习之String篇
字符串
从概念上讲,Java字符串就是Unicode字符串序列。Java 没有内置的字符串类型,而是在标准的Java类库中提供了一个预定义类String。每个用双引号括起来的字符串都是String类的一个实例。
基础知识
这里列出的一些基础知识是在你读源码时所需要了解的;
1.原码、反码、补码:
(1)在Java中,所有数据的表示方式都是以补码形式来表示;
(2)正数:原码、反码、补码相同;
(3)负数:符号位为1,其余各位是对原码取反,然后整个数加1;
(4) ~ 按位取反(反码加1称为补码。)步骤就是先求出这个数(因为java存的数是补码)的原码,然后对原码取反得到X,这个X就是我们要求的那个数的补码;
2.java运算符 与(&)、非(~)、或(|)、异或(^);
(1)位与运算符(&):运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。;
(2)位或运算符(|):运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
(3)位非运算符(~):运算规则:如果位为0,结果是1,如果位为1,结果是0.
(4)位异或运算(^):运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
3.java中有三种移位运算符
(1)<< : 左移运算符,num << 1,相当于num乘以2
(2)>> : 右移运算符,num >> 1,相当于num除以2
(3)>>> : 无符号右移,忽略符号位,空位都以0补齐
4.Unicode 编码 参考JAVA方法 字符串与unicode的相互转换
5.正则表达式 参考String.matches()的用法
String类的声明
String类是final修饰可序列化的一个强不变类 。
public final class String implements java.io.Serializable, Comparable<String>,CharSequence
String类的属性
String是通过数组的形式进行数据存储的;
private final char value[];
private int hash; // Default to 0
String类的构造方法
String类现在提供两种实例化对象的模式;
(1)String可以直接采用赋值的形式进行处理,这一点感觉和基本数据类型的赋值非常像。
(2)既然是类那么就可以通过构造方法进行实例化;
String类提供了16个构造方法其中2个被废弃了1个是包内友好访问的以下列出的是较为常用的5个
1.无参构造方法
用个空串""作为初始值
public String() {
this.value = "".value;
}
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}
public String(StringBuilder builder) {
this.value = Arrays.copyOf(builder.getValue(), builder.length());
}
String类的常用方法
方法 | 参数 | 应用 |
---|---|---|
length() | String中字符的个数 | |
charAt() | Int索引 | 取String中该索引位置的char |
getChars(),getBytes() | srcBegin:要复制部分起点的索引 ;srcEnd:要复制部分终点的索引;dst[]:复制的目标数组;dstBegin:目标数组的起始索引 | 复制char或byte到一个目标数组中 |
toCharArray() | 生成一个char[]包含String的所有字符 | |
equals(),equalsIgnoreCase() | 与之进行比较的String | 比较两String的内容是否相同,后者忽略大小写 |
compareTo() | 与之进行比较的String | 按词典的顺序比较String的内容,比较结果为负数、零、正数,大小写不等价 |
contains() | 要搜索的CharSequence | 如果该String的内容包含要搜索的参数则返回true |
contentEquals() | 与之比较的CharSequence或StringBuffer | 如果该String与参数的内容完全一致则返回true |
regionMatches() | 该String的索引偏移量,另一个String及其索引偏移量,要比较的长度 ,重载方法版本增加了“忽略大小写”的功能 | 返回boolean值,以表示所比较区域是否相等 |
startsWith() | 可能的起始String。重载方法版本增加了偏移量 | 返回boolean结果,表明该String是否以此参数起始 |
endsWith() | 该String可能的后缀 | 返回boolean结果,表示该String以此参数结尾 |
indexOf(),lastIndexOf() | 重载方法版本包括:char,char与起始索引,String,String与起始索引 | 如果String不包括此参数,就返回-1;否则就返回此参数在该String中的起始索引;lastIndexOf() 是从后向前搜索 |
substring(), subSequence() | 重载方法版本:起始索引;起始索引+终点坐标 | 返回新的String ,以包含指定参数的子字符串 |
concat() | 要连接的String | 返回一个新的String对象,内容为原始String连接上参数String |
replace() | 要替换掉的字符,用来替换的新的字符;也可以用一个 CharSequence,替换另一个CharSequence | 返回替换后的新的String,如果没有替换发生,则返回原来的String |
toLowerCase(),toUpperCase() | 将字符的大小写改变后,返回一个新的String,如果没有改变,则返回原来的String对象 | |
trim() | 将String两端的空白字符删除后,返回新的String对象。如果没有发送改变,则返回原来的String对象 | |
valueOf() | 重载方法版本:Object;char[];char[],偏移量,与字符个数;boolean;char;int;long;float;double | 返回一个表示参数内容的String |
intern() | 为每一个唯一的字符序列生成一个且仅生成一个String引用 | |