String与StringBuffer
文章目录
1.1 Sring类
String用于不变字符串的操作
1.1.1创建字符串
字符串的构造方法有如下4个:
- public String():初始化一个新创建的 String 对象,使其表示一个空字符序列。注意,由于 String 是不可变的,所以无需使用此构造方法。
- public String(String original):初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列
- public String(char[] value):用已有字符数组初始化新的String
- public String(StringBuffer buffer):用StringBuffer对象的内容初始化新的String
String s1 = "abc";//创建字符串s1
String s = new String("abc");//创建字符串s
char[] arr = {'a','r','r'};
String s = new String (arr);//将字符数组转为字符串
字符串对象的toCharArray()方法可得到字符串对应的字符数组
public class Ex01 {
public static void main(String[] args) {
String s = "hello world!";
char[] arr;
arr = s.toCharArray();
for (int n=0;n<arr.length;n++){
System.out.print("arr["+n+"]:"+arr[n]+"\t");
}
}
【运行结果】
1.1.2字符串的连接
1.利用“+”运算符实现字符串的拼接
String s = "Hello!";
s = s + "Mary"+4;
System.out.println(s); //Hello!Mary4
s = 1 + 2 +"hello";
System.out.println(s); //3hello
[说明]
String类的引用变量只代表对字符串的一个引用,更改s的值实际上只是将其指向另外一个字符串对象。字符串拼接后将创建另一个串对象,而变量s指向这个新的串对象。
2.利用concat()方法实现字符串的拼接
String s = "4+3=";
s = s.concat("7");
System.out.println(s); //4+3=7
1.1.3比较两个字符串
方法 | 功能 |
---|---|
boolean equals(Object Obj) | 相等返回true,否则返回false |
boolean equalsIgnoreCase(String Str) | 忽略字母大小写判断两个串是否相等 |
int compareTo(String anotherString) | 按字典顺序比较两个字符串。该比较基于字符串中各个字符的 Unicode 值。前串大,返回值>0; 前串小,返回值<0; 两串相等,返回值=0 |
**【注意】**对比以下程序
String s1 = "HelloWorld";
String s2 = "HelloWorld";
boolean b1 = s1.equals(s2);//true
boolean b2 = (s1==s2);//true
String s1 = "HelloWorld";
String s2 = new String("HelloWorld");
boolean b1 = s1.equals(s2);//true
boolean b2 = (s1==s2);//false
【说明】
- String中的equals()方法并不是Object中的方法,String中的equals()方法是经过重写了的,它是用来比较两个字符串的值是否相同,而不是比较地址。
- 为何第一个代码的b2是true而第二个代码的b2为false:Java在编译时在对待字符串常量的存储时有一个优化处理策略,相同字符串常量只存储一份,也就是说第一个代码中的s1和s2指向的是同一个字符串;而第二个程序因为new String,所以s2是新开辟了一块空间用来存储HelloWorld。所以在==比较它们的地址时,第一个代码为true,第二个代码为false。
1.1.4字符串的提取与替换
- char charAt(int index) : 返回指定索引处的 char 值。
- String substring(int beginIndex, int endIndex) : 返回从beginIndex开始到endIndex-1结束的一个新字符串,它是此字符串的一个子字符串。
- String substring(int beginIndex):返回从beginIndex位置开始到串末尾的子字符串。
- String replace(char oldChar, char newChar) :将字符串中所有oldChar字符换为newChar。
- String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
- String trim() :返回字符串的副本,忽略前导空格和尾部空格。
- String toUpperCase() :将 String 中的所有字符都转换为大写。
- String toLowerCase() :将 String 中的所有字符都转换为小写。
1.1.5字符串中字符或子串的查找
方法 | 功能 |
---|---|
int indexOf(int ch) | ch的首次出现位置 |
int indexOf(int ch, int start) | ch的首次出现位置>=start |
int indexOf(String str) | str的首次出现位置 |
int indexOf(String str, int start) | str的首次出现位置>=start |
int lastIndexOf(int ch) | ch的最后出现位置 |
int lastIndexOf(int ch, int start) | ch的最后出现位置<=start |
int lastIndexOf(String str) | str的最后出现位置 |
int lastIndexOf(String str, int start ) | str的最后出现位置<=start |
boolean startsWith(String prefix) | 测试此字符串是否以指定的前缀开始 |
boolean endsWith(String suffix) | 测试此字符串是否以指定的后缀结束 |
1.2 StringBuffer类
String类不能改变串对象中的内容,只能通过建立一个新串来实现串的变化,而创建对象过多不仅浪费内存,而且效率也低。要动态改变字符串,通常用StringBuffer类,StringBuffer类可实现字符串内容的添加、修改和删除。
1.2.1创建StringBuffer对象
StringBuffer类的构造方法:
- public StringBuffer():创建一个空的StringBuffer对象,其初始容量为 16 个字符。
- public StringBuffer(int capacity):创建一个长度为length的StringBuffer对象。
- public StringBuffer(String str):用字符串str初始化新建的StringBuffer对象。
StringBuffer sb = new StringBuffer();//无参构造方法创建一个可容纳16个字符的StringBuffer对象
StringBuffer sb2 = new StringBuffer(101); //创建一个可容纳101个字符的字符串
StringBuffer sb = new StringBuffer("abcde");// 以String对象作为参数的构造方法:可容纳长度为参数字符串长度,再加16 个字符
【注意】StringBuffer创建对象时只能new,不能直接创建。
1.2.3 StringBuffer类的主要方法
- StringBuffer append(Object obj) :将某个对象的串描述添加到StringBuffer尾部
- StringBuffer insert(int position, Object obj) :将 Object 参数的字符串表示形式插入此字符序列的指定位置中
- StringBuffer insert(int index, char[] str, int offset, int len) :将字符数组str从offset位置开始的len个字符插入到串的index位置。
- void setCharAt(int index, char ch) :用新字符替换指定位置字符。
- int codePointAt(int index) :删除指定位置的字符。
- StringBuffer replace(int start, int end, String str) :使用给定 String 中的字符替换此序列的子字符串中的字符。
- String substring(int start, int end) :返回一个新的 String,它包含此序列当前所包含的字符子序列。
- int length() :返回长度(字符数)。
【例】
StringBuffer sb = new StringBuffer();
sb.append("Hello,java!");
sb.insert(6,30);
System.out.println(sb.toString());//Hello,30java!
练习:将一个字符串反转
1.用StringBuffer
public class Ex01 {
public static void main(String[] args) {
String s = "Hello,java!";
int len = s.length();
StringBuffer sb = new StringBuffer(len);//创建一个长度为len的字符串
for (int i = (len-1);i>=0;i--){
sb.append(s.charAt(i));//返回指定索引处的 char 值
}
System.out.println(sb.toString());
}
【运行结果】
2.用String
public class Ex01 {
public static void main(String[] args) {
String s = "Hello,java!";
String res = "";
for (int n = s.length()-1; n >= 0; n--) {
res =res+s.charAt(n);
}
System.out.println(res);
}
}
【注意】用String时,每个创建的字符串对象均要占用内存空间,为java的垃圾回收也带来负担,从效率上来将比用StringBuffer类的拼接方法要差。