您的位置:首页 > 其它

String系列简介

2015-08-16 20:44 507 查看

一、概述

查看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
,但是需要加锁。

六、基本数据类型对象包装类

基本数据类型基本数据类型
byteBytefloatFloat
shortShortdoubleDouble
intIntegercharCharacter
longLongbooleanBoolean

基本数据类转字符串

基本数据类型转字符串有一下方式:

基本数据类型+"";  或者  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: