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());
// deleteCharAt(int index)
StringBuffer s6 = new StringBuffer("Hello");
s6.deleteCharAt(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]格式显示