一、概述
查看Java源码可以发现String类是final类型,也就是说String是不可以被继承的。字符串是一种特殊的对象,一旦被初始化就不可以被改变,程序中"abc"
这种形式其实就是在内存中创建了一个字符串对象,可以使用String s = "abc";
的方式创建一个字符串对象。也可以是用String s = new String("abc");
的方式创建一个字符串对象,但是两者之间的不同之处在于前者在内存中只创建了一个对象,而后者在内存创建了两个对象,通常使用前者来创建字符串对象。还有一点值得说明的是String s = new String();
字符串的默认构造函数其实是创建了一个空的字符串,也就是说和String s = "";
效果等同。
下面通过一个简单的例子,说明一下String
对象在内存的存储情况。
String s1 = "abc";
String s2 = new String("abc");
String s3 = "abc";
System.out.print((s1==s2)+"/"+(s1==s3));
上面的程序段的输出结果是:
false/true
程序在执行创建s1
时,会在内存中建立一块区域存放"abc"
,并将s1
指向这块区域的地址;在创建s2
时,会在内存中创建两个区域,但是"abc"
区域已经存在,不会再次创建了;在创建s3
时,“abc”
已经在内存中存在,也不会再次创建。java
中String
对象其实使用的是设计模式中的享元模式,对相同的字符串内容进行共享。
二、String的常见功能
获取功能
1、int length()
获取字符串的长度。
2、char charAt(int index)
获取字符index下标位置的字符。
3、int indexOf(int ch)
获取字符串中第一次出现ch的位置,没有找到返回-1。
4、int indexOf(int ch, int fromIndex)
从fromIndex位置开始获取ch的位置(这时的位置还是从头开始算的),没有找到返回-1。
5、int indexOf(String str)
获取字符串中第一次出现str的位置,没有找到返回-1。
6、int lastIndexOf(int ch)
获取最后一次出现ch的位置,没有找到返回-1。
7、int lastIndexOf(int ch, int fromIndex)
从fromIndex位置开始获取ch最后一次出现的位置(这时的位置还是从头开始算的),没有找到返回-1。
8、int lastIndexOf(String str)
获取字符串中最后一次出现str的位置,没有找到返回-1。
判断
1、boolean contains(CharSequence chs)
判断chs(可以是字符串)是否在字符串中出现过。
2、boolean isEmpty()
是否为空,和length() == 0
等效。
3、boolean startsWith(String str)
是否以str
开头。
4、boolean endsWith(String str)
是否以str
结尾。
5、boolean equals(String str)
是否和str内容相同。
6、boolean equalsIgnoreCase(String str)
忽略大小写判断是否内容相同。
转换
1、new String(char[] chs)
构造函数,将char
数组chs
装换为字符串。
2、new String(char[] chs, int offset, int count)
构造函数,将char
数组chs
中从下标offset
开始的count
个字符转换为字符串。
3、static String copyValueOf(char[] chs)
功能是根据char
数组chs
返回转换后的字符串。
4、static String copyValueOf(char[] chs, int offset, int count)
功能是根据char
数组chs
中从下标offset
开始的count
个字符转换为字符串。
5、static String valueOf(char[] chs)
和copyValueOf(char[] chs)
功能一样。
6、static String valueOf(int v)/static String valueOf(long v)/...
将其他类型变量转换为字符串类型。
7、char[] toCharArray()
是字符串转换为字符数组。
8、byte[] getBytes()
将字符串转换为字节数组。
其他常用函数
1、String replace(char oldChar, char newChar)
将oldChar
替换为newChar
然后返回替换过的字符串。
2、String replace(CharSequence target, CharSequence replacement)
将target
替换为replacement
并返回替换过的字符串。
3、String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
4、String substring(int begin)
获取begin
位置开始到末尾的字符串子串。
5、String substring(int begin, int end)
获取[begin, end)
端的字符串子串。
6、String toUpperCase()
转换为大写字符串。
7、String toLowerCase()
转换为小写字符串。
8、String trim()
去除首尾多余空格。
9、int compareTo(String str)
和str
比较,如果小于返回负数,如果等于返回0,如果大于返回正数。字符串的大小是按照字典序为准。
三、String应用示例
1、模拟trim()
功能,功能很简单,就是去除首尾的连续空格即可,注意没有空格和全是空格以及空串的情况,示例代码如下:
public String myTrim(String str) {
int start = 0, end = str.length()-1;
while(start <= end && str.charAt(start) == ' ') start ++;
while(start <= end && str.charAt(end) == ' ') end --;
return str.substring(start, end+1);
}
2、将字符串反转,即将"abcde"
变为"edcba"
,具体步骤是首先将字符串转为字符数组,然后将字符数组翻转,最后将字符数组构造出字符串。示例代码如下:
public String myReverse(String str) {
char[] chs = str.toCharArray();
for(int start=0, end=chs.length-1; start < end; start++, end--) {
char temp = chs[start];
chs[start] = chs[end];
chs[end] = temp;
}
return new String(chs);
}
3、计算"abkkcdkkefkkskk"
其中kk
出现的次数?利用indexOf(String, int)
方法,即可完成查找字串出现次数的功能。示例代码如下:
public int myCount(String str, String substr) {
int count = 0, index = 0;
while((index=str.indexOf(substr, index))!=-1) {
index += substr.length();
count ++;
}
return count;
}
4、取两个字符串的最长公共子串。
public String myMaxSubstring(String s1, String s2) {
for(int i=0; i<s2.length(); i++) {
for(int j=0,k=s2.length()-i; k!=s2.length()+1; j++,k++) {
String temp = s2.substring(j, k);
if(s1.contains(temp)) {
return temp;
}
}
}
return "";
}
四、StringBuffer
使用介绍
为解决String
的不可改变的弊端,出现了StringBuffer
类,StringBuffer
的特点是:长度可变,可以操纵多个数据类型,如使用append
功能添加整数型,浮点型,字符型,布尔型等数据,最终可使用toString()
方法返回String
类型。StringBuffer
也是final
类型的类。
添加功能
1、StringBuffer append(对象)
,这里可以添加一般类型的对象,如整数型、浮点型、布尔型等。最后返回StringBuffer
本身,也就是this
指针,这种方式称为方法调用链。
2、StringBuffer insert(int offset, 对象)
可以在指定位置插入数据对象,该位置之后的数据顺延。
修改功能
1、StringBuffer replace(int start, int end, String str)
将[start, end)
段替换为str
。
2、void setCharAt(int index, char ch)
将index
位置的字符修改为ch
。
3、StringBuffer reverse()
将字符串反转。
删除功能
1、StringBuffer delete(int start, int end)
删除[start, end)
段的字符内容。
2、StingBuffer deleteCharAt(int index, char ch)
删除index
位置的字符。
3、delete(0, str.length())
可以用于清空缓冲区。
其他功能
1、void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将StringBuffer
中[srcBegin, srcEnd)
段内容存放在dst
的dstBegin
可是的位置内。
五、StringBuilder
StringBuilder
和StringBuffer
有兼容的API。出现在JDK1.5版本中。与StringBuffer
最大的不同之处在于StringBuilder
是非线程同步,而StringBuffer
是线程同步的。
所以在单线程中一般都是用StringBuilder
,因为其速度快。多线程时也可以使用StringBuilder
,但是需要加锁。
六、基本数据类型对象包装类
基本数据类型 | 类 | 基本数据类型 | 类 |
---|---|---|---|
byte | Byte | float | Float |
short | Short | double | Double |
int | Integer | char | Character |
long | Long | boolean | Boolean |
基本数据类转字符串
基本数据类型转字符串有一下方式:
基本数据类型+""; 或者 String.valueOf(); 或者 Integer.toString();等
字符串转为基本数据类型有如下示例:
Integer.parseInt("123"); // "123"转为123
Long.parseLong("111"); // "111"转为111的长整型
Boolean.parseBoolean("true"); // "true"转为true
Integer.parseInt("3c", 16); //按照16进制将"3c"转为整数,也就是60
Character
没有parseCharacter
方法。
七、基本数据类型对象包装类的新特性
JDK1.5版本出现的新特性,即对象可以和数值之间直接运算。如下:
Integer x = 4; // 直接将4赋值给整型对象x,称为自动装箱,等同new Integer(4)
x = x + 2; //直接运算,x + 2自动拆箱,然后再将和自动装箱,并赋值给x
x = new Integer(x.intValue() + 2); //x = x + 2的具体过程。
Integer
会比int
多一个值便是null
。还有些如下特点:
Integer m = 128, n = 128;
Integer a = 127, b = 127;
System.out.println(m == n);
System.out.println(a == b);
结果如下,原因是当Integer的值的范围在byte类型范围内时,如果内存中已经存在了值,便不会再创建Integer对象,而是直接指向已存在的区域。
false
true