String字符串
定义|创建字符串
String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本。
String是个类
。这个类使用final修饰,所以这个类是不可以继承扩充和修改它的方法的。String类又特别常用,所以在对String对象进行初始化时,它可以不像其它对象一样,必须使用new关键字构造对象。字符串广泛应用在Java编程中.在java中字符串属于对象,Java提供了一种简化的特殊语法。
String对象一旦创建完成就不能改变,如果需要进行大量的字符串修改操作,应该使用
StringBuffer
或者
StringBuilder
类或者字符数组,最终结果可以被转换成String对象.
使用String对象存储字符串:
String s =
"有志者事竟成"
;
当然我们也还是可以像以前使用new关键字的。
String s =
new
String(
"有志者事竟成"
);
注意:
String类是不可改变的,所以你一旦创建了String对象,那它的值就不能被改变了.但是如果需要对字符串做修改,那么应该选择使用
StringBuffer & StringBuilder
类
String字符串的常用方法
String类位于
java.lang
包中,java会默认的导入java.lang包,所以我们使用java.lang包的类时,不需要显示的import类,String类具有丰富的方法,其中比较常用的有:
1.计算字符串的长度
2.连接字符串
3.比较字符串
4.提取字符串
5.替换字符串
1. 计算字符串的长度
用于获取有关对象的信息的方法称为
访问器方法.String类的一个访问器方法是
length()方法,它返回字符串对象包含的字符数.
public class Demo5 {
public static void main(String[] args) {
String str = " www.baidu.com ";
//计算字符串长度
// int len = str.length();
// System.out.println("包括空格的字符串的长度为:" + len);
System.out.println("包括空格的字符串的长度为:" + str.length());//另一种表示方法
//因为空格也算是字符串的长度,如果不想计算前后的空格,也可以使用trim()方法把前后的空格去掉
System.out.println("不包括空格的字符串的长度为:" + str.trim().length());
String name = "丛中之";
System.out.println("字符串的长度为:" + name.length());//一个汉字占一个字符
}
}
2.连接字符串
连接字符串有两种方法:方法1:使用“+”。方法2:使用String类的concat()方法。
public class Demo5 {
public static void main(String[] args) {
String str = " www.baidu.com ";
System.out.println("czz" + str);
System.out.println(str.concat("czz"));
}
}
3.比较字符串
字符串的比较方法有很多,如比较两个字符串是否相等,比较后返回值是个布尔值。
public class Demo5 {
public static void main(String[] args) {
String str = " www.baidu.com ";
//比较字符串
String str2 = " www.baidu.com ";
if(str.equals(str2)){
System.out.println("相等");
}else{
System.out.println("不相等");
//判断是都以某个字符开头或者结尾
System.out.println(str.startsWith("www"));
System.out.println(str.endsWith("com"));
}
}
}
4.提取字符串
public int indexOf(int ch) 搜索第一个出现的字符ch
public int indexOf(String value) 搜索第一个出现的字符串value
public int lastIndexOf(int ch) 搜索最后一个出现的字符ch
public int lastIndexOf(String value) 搜索最后一个出现的字符串value
public class Demo5 {
public static void main(String[] args) {
String str = "www.baidu.com ";
System.out.println(str.indexOf("w"));
System.out.println(str.indexOf("b"));
System.out.println(str.indexOf("www"));
System.out.println(str.lastIndexOf("m"));
}
}
截取字符串
注意下标也是从0开始的。
System.out.println(email.substring(3));
//从第4个(包括第四个)开始截取到最后
System.out.println(email.substring(3, 5));
indexOf方法和substring方法经常一起使用,比如我们要截取@之后的所有字符串,我们可以结合这个两个。
System.out.println(email.substring(email.indexOf(
"@"
)+1));
5. 替换字符串
可以把所有的字符串c换成字符串z
System.out.println(str.replace("c","z"));
StringBuffer
StringBuffer用于表示可以修改的字符串
构造方法
构造方法
|
说明
|
public StringBuffer()
|
保留了17个字符的空间
|
public StringBuffer(int length)
|
设置缓存器大小
|
public StringBuffer(String value)
|
接收字符串参数,用来设置初始内容,并不再重新分配
|
常用方法:
StringBuffer insert(String s)
|
在指定位置插入布尔值的字符串表示
|
insert(int offset, int i)
|
将int参数的字符串表示形式插入此序列中
|
StringBuffer append(String s)
|
将指定的字符串追加到此字符序列
|
int length()
|
确定StringBuffer对象的长度
|
int indexOf(String str)
|
查找某个字符在字符串中的第一次出现的下标或者索引
|
void setCharAt(int pos,char ch)
|
使用ch指定的新值设置pos指定的位置上的字符
|
String toString()
|
转换为字符串形式
|
StringBuffer reverse()
|
反转StringBuffer对象中的字符
|
StringBuffer delete(int start,int end)
|
此方法将删除调用对象中从start位置来时直到end指定的索引-1位置的字符序列
|
replace(int start, int end, String str)
|
使用给定String中的字符替换此序列的子字符的字符
|
// 字符设置和替换
// setCharAt(
int
index,
char
ch),将指定的字符ch放到index指出的位置。
// charAt(
int
index) 获得指定位置的字符
StringBuffer s1 =
new
StringBuffer(
"java"
);
s1.setCharAt(1, 'u');
// 则s为
"juva"
// 字符的插入
// insert(
int
offset,
char
ch),在offset位置插入字符ch。
StringBuffer s2 =
new
StringBuffer(
"wecome"
);
s2.insert(2, 'l');
// 则s为
"welcome"
// 在字符串末尾添加内容(Append方法)
StringBuffer s3 =
new
StringBuffer(
"中国"
);
s3.append(
"好"
);
// 则s为
"中国好"
。
// 转换为不变字符串:toString()。
System.out.println(s3.toString());
// 获取字符串的长度: length()
StringBuffer s4 =
new
StringBuffer(
"abc"
);
System.out.println(s4.length());
// 获取字符串的容量
System.out.println(s4.capacity());
// 字符串反转
s4.reverse();
System.out.println(s4.toString());
// 删除指定字符串着中的字符
//
delete
(
int
start,
int
end)
StringBuffer s5 =
new
StringBuffer(
"Hello"
);
s5.
delete
(0, s5.length());
// 删除字符串s的全部字符
System.out.println(s5.toString());
//
delete
CharAt(
int
index)
StringBuffer s6 =
new
StringBuffer(
"Hello"
);
s6.
delete
CharAt(4);
// 删除字符串s索引为4的字符
System.out.println(s6.toString());
// 替换字符串
// replace(
int
start,
int
end,String str)
StringBuffer s7 =
new
StringBuffer(
"Hello"
);
s7.replace(0, 1,
"qqq"
);
System.out.println(s7.toString());
// substring(
int
start) //返回从start下标开始以后的字符串
StringBuffer s8 =
new
StringBuffer(
"Hello"
);
s8.substring(2);
System.out.println(s8.toString());
// substring(
int
start,
int
end) //返回从start到 end-1字符串
StringBuffer s9 =
new
StringBuffer(
"Hello"
);
s9.substring(2,3);
System.out.println(s9.toString());
下面方法和String类的方法类似
序号
|
方法描述
|
1
|
int capacity()
返回当前容量。
|
2
|
char charAt(int index)
返回此序列中指定索引处的
char
值。
|
3
|
void ensureCapacity(int minimumCapacity)
确保容量至少等于指定的最小值。
|
4
|
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
将字符从此序列复制到目标字符数组
dst
。
|
5
|
int indexOf(String str)
返回第一次出现的指定子字符串在该字符串中的索引。
|
6
|
int indexOf(String str, int fromIndex)
从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
|
7
|
int lastIndexOf(String str)
返回最右边出现的指定子字符串在此字符串中的索引。
|
8
|
int lastIndexOf(String str, int fromIndex)
返回 String 对象中子字符串最后出现的位置。
|
9
|
int length()
返回长度(字符数)。
|
10
|
void setCharAt(int index, char ch)
将给定索引处的字符设置为
ch
。
|
11
|
void setLength(int newLength)
设置字符序列的长度。
|
12
|
CharSequence subSequence(int start, int end)
返回一个新的字符序列,该字符序列是此序列的子序列。
|
13
|
String substring(int start)
返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
|
14
|
String substring(int start, int end)
返回一个新的
String
,它包含此序列当前所包含的字符子序列。
|
15
|
String toString()
返回此序列中数据的字符串表示形式。
|
String和StringBuffer的区别
Java 中 StringBuffer 和 String 是有一定的区别的,首先,String 是被
final
修饰的,他的
长度是不可变的
,就算调用 String 的 concat 方法,那也是把字符串拼接起来并重新创建一个对象,把拼接后的 String 的值赋给新创建的对象,而
StringBuffer 的长度是可变的
,调用StringBuffer 的 append 方法,来改变 StringBuffer 的长度,并且,相比较于 StringBuffer,String 一旦发生长度变化,是非常耗费内存的!
String的不变性
当字符串string在内存中创建后,就不会再改变,所以对该字符串进行的所有改变操作,实际上都没有改变原来的字符串,你可以参考一下我们第一节,不过我们调用了原始的String的多少个方法,其实对原来的字符都不会有任何改变,都是重新生成一个新的字符串作为返回值,这就是所谓的Java String的不变性。
每一次的修改操作都会生成一个新的字符串,有一个不好的点——慢慢地消耗了内存,对GC来说也是非常费时的一件事,效率非常低,所以如果我们需要多次改变创建的字符串的话,那么使用String将会是个很不好的选择。
String与StringBuffer的区别
正是因为String是的不变性,StringBuffer或者StringBuilder就有他们的用武之地了,当然String有它的优点,就是使用方便,我们如何做出选择呢?一般如果字符串经常要做出修改,比如经常要拼接,删除等等,那么使用StringBuffer或者StringBuilder比较好,你可以在完成操作后使用
toString
方法转换为String类。
StringBuffer和StringBuilder的区别
StringBuilder和StringBuffer的方法是一样,区别是StringBuffer是线程安全,一个StringBuilder不是,你可以查看一下两个类的源码,StringBuffer的方法前面有synchronized关键字修饰。这个以后我们在讲解线程的时候会讲到。这里我们知道一下两者的区别即可:
StringBuffer线程同步,所以使用起来比较安全,但是效率较低主要是多线程和操作比较频繁是有有所体现。
StringBuilder正好相反不同步,效率高,但是多线程使用时可能会有问题。
练习:
1短串在长串中出现的次数
例:
String src = "abc1111ababb";
求"ab"出现的次数
提示:使用startsWith方法
两种方法,test1和test2
package com.StringBuffer;
public class StringBufferDemo2 {
public static void main(String[] args) {
//test1();
test2();
}
private static void test2() {
String str = "adjadfbvsadsjfo";
//定义计数变量
int count = 0;
String sub = "ad";
while(str.indexOf(sub) != -1){
count ++;
//截取子串
str = str.substring(str.indexOf(sub) + sub.length());
}
System.out.println(count);
}
private static void test1() {
String str = "adjadfbvsadsjfo";
//定义计数变量
int count = 0;
//循环判断截取后的子串是否以指定字符串开头,有则证明出现了一次指定字符串
while (str.length() != 0) {
//查找指定字符ad
if (str.startsWith("ad")) {
count++;
}
//从第二个字符开始截取子串
str = str.substring(1);
}
System.out.println(count);
}
}
2.
将字符串中每个单词反转,例如:
welcome to China
emoclew ot anihC
public static void main(String[] args) {
String s = "welcome to China";
String[] words = s.split(" ");
//创建StringBuffer对象
StringBuffer sb = new StringBuffer();
for (int i = 0; i < words.length; i++) {
StringBuffer sb2 = new StringBuffer(words[i]);
sb.append(sb2.reverse());
// words[i] = sb.reverse().toString();
sb.append(" ");
}
String res = sb.toString().trim();
System.out.println(res);
}
3.将数组中的元素以[1, 2, 3, 4]格式显示