概述
String Class 表示的是字符串。在Java中所有的字符串,例如 “abc” 都是实现了String这个类的实例。String是常量的,在创建之后它们的值是不可以进行改变的。但是在字符缓冲区是可以进行改变的。因为字符串对象是不可以改变的,所以它们可以被共享。例如:
1 | String str = "abc"; |
等同于:
1 | char[] data = {'a','b','c'}; |
下面是关于如何使用String的例子:
1 | System.out.println("abc"); |
String的方法包含了检查序列的每个字符、比较字符串、查找字符串、获得子字符串、复制字符串并进行大小写转化。
Java中提供了对String的+运算符的支持、将其他对象转化成字符串。String的连接是通过StringBuilder/Stringbuffer及其append方法实现的。字符串的转化是通过toString方法实现的。String表示一个字符串通过UTF-16(unicode)格式
定义
1 | public final class More ...String implements java.io.Serializable, Comparable<String>, CharSequence {} |
从上面可以看出来String是被final修饰的,所以是不可以更改的,同时还可以看出String实现了Serializable,Comparable,CharSequence接口。
属性
1 | private final char value[]; |
final修饰,表示不可以更改。例如String s = "a",s = "a",这种情况下s的值并没有修改,只是修改了s的引用、同时可以知道String的底层是数组实现的。
1 | private int hash; |
缓存string的hash code,默认为0
构造方法
- 使用字符数组、字符串进行构造
1 | public More ...String(char value[], int offset, int count) { |
1 | public More ...String(char value[]) { |
String的底层是采用字符数组进行实现的,所以我们可以使用一个字符数组来进行创建一个String,当时用字符数组构建Stirng的时候,会使用到Arrays.copyOf和Arrays.copyOfRange方法,也可以使用字符数组中的某一连续部分进行构建,传入起始和结束即可。这两方法会将原来数组中的内容复制到新创建的String中。或者我们使用一个String类型来进行构建String的时候,会将原String的value和hash这两个属性值赋值给新String。
- 使用字节数组构造String
我们知道String的底层是采用字符数组char[]实现的,字符数组是使用unicode来进行存储的。当采用字节数组来构造String的时候,将字节数组进行解码为字符数组,进而就可以构造新的String。
1 | public More ...String(byte bytes[], Charset charset) { |
1 | public More ...String(char value[], int offset, int count) { |
……
- 使用
StringBuffer和StringBuider构造一个String
- StringBuffer
1 | public More ...String(StringBuffer buffer) { |
StringBuffer中使用了Sychronized,所以效率要低一些。但是是线程安全的。
- StringBuilder
1 | public More ...String(StringBuilder builder) { |
其他方法
- charAt(int)
- compareTo(String)/compareToIgnoreCase(String)
- concat(String)
- contains(CharSequence)
- endsWith(String)
- equals(Object)
- indexOf(…)
- isEmpty()
- length()
- spilt()
- subStirng(int/int,int)
- toCharArray()
- trim()
charAt(int)1
2
3
4
5
6public char More ...charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
compareTo(String)/compareToIgnoreCase(String)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public int More ...compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
concat(String)1
2
3
4
5
6
7
8
9
10public String More ...concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
例如:
1 | "cares".concat("s") returns "caress"; |
contains(CharSequence)
1 | public boolean More ...contains(CharSequence s) { |
endsWith(String)
1 | public boolean More ...endsWith(String suffix) { |
equals(Object)
1 | public boolean More ...equals(Object anObject) { |
首先if (this == anObject)进行判断要比较的对象和当前对象是不是同一个对象,如果是就直接返回true,如果不是在继续进行比较。anObject instanceof String如果要比较的对象不是String类型的话,直接返回false,如果是的话,再进行比较长度是否相等,相等则一个一个的比较值是否相等,不相等的话直接返回false.
indexOf(…)
1 | public int More ...indexOf(int ch, int fromIndex) { |
首先查找的索引和string的长度进行对比,大于则返回-1,否则从头开始进行查找,直到游标等于索引值。索引值<0,设置为==0.
isEmpty()
1 | public boolean More ...isEmpty() { |
length()
1 | public int More ...length() { |
spilt()
1 | public String[] More ...split(String regex, int limit) { |
涉及到正则表达式比较复杂
subStirng(int/int,int)
1 | public String More ...substring(int beginIndex, int endIndex) { |
考虑边界问题,以及起始和终止的大小,之后返回string
toCharArray()
1 |
|
使用arraycopy进行复制,因为类的初始化问题所以不采用Arrays。copyOf
trim()
1 | public String More ...trim() { |
去除首尾空格
参考资料
http://www.hollischuang.com/archives/99
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/String.java#String
