目录
在Java中String类可以表示一个字符串,String类实际上是使用字符数组存储的。
String类的赋值方式
(1)一种称为直接赋值(推荐):
(只创建一个对象在字符串常量池中。)
String name = “张三”
(2)通过关键字new调用String的构造方法赋值
面试题:以下代码创建了几个对象?
答:两个。(字符串常量池中一个,堆中还new了一个。)
String name = new String(“张三”)
String类的两种赋值分析
String类字符与字符串操作方法
序号 | 方法名称 | 类型 | 描述 |
1 |
public char charAt(int index)
| 普通 |
根据下标找到指定的字符
|
2 |
public char[] toCharArray()
| 普通 |
以字符数组的形式返回全部的字符串内容
|
3 |
public String(char[] value)
| 构造 |
将全部的字符数组变为字符串
|
4 |
public String(char[] value,int offset,int count)
| 构造 |
将指定范围的字符数组变为字符串
|
(拓展:Method call expected这个报错是因为要用new创建对象,在使用public String(char[] value)等构造方法时经常会碰到类似的错误)
用法演示:
public class Demo {
public static void main(String[] args) {
String letter="abcdefg";
System.out.println(letter.charAt(3));
char[]a=letter.toCharArray();
System.out.println(Arrays.toString(a));
String m=new String(a);
System.out.println(m);
String a1=new String(a,3,2);
System.out.println(a1);
}
}
运行结果:
d
[a, b, c, d, e, f, g]
abcdefg
de
String类字节与字符串操作方法
序号 | 方法名称 | 类型 | 描述 |
1 |
public byte[] getBytes()
| 普通 |
将字符串变为字节数组
|
2 |
public String(byte[] bytes)
| 构造 |
将字节数组变为字符串
|
3 |
public String(byte[] bytes,int offset,int
length)
| 构造 |
将指定范围的字节数组变为字符串
|
4 |
public String(byte[] bytes,
String charsetName)
| 构造 |
通过使用指定的 charset 解码指定的
byte
数组,构造一个新的 String
|
(注意:charsetname是指所用编码名称,将内存中的unicode编码转换为charsetname格式。)
用法演示:
public class Demo {
public static void main(String[] args) {
String letter="abcdefg";
System.out.println(letter.getBytes());
byte[] byt = letter.getBytes();
for (byte b : byt) {
System.out.println(b);
}
String a=new String(byt);
System.out.println(a);
String a1=new String(byt,3,2);
System.out.println(a1);
try{
String a2=new String(byt,"utf-8");
System.out.println(a2);}
catch (Exception e)
{
}
}
}
运行结果:
[B@6f496d9f
97
98
99
100
101
102
103
abcdefg
de
abcdefg
(注意:在使用
String类判断是否以指定内容开头或结尾
序号 | 方法名称 | 类型 | 描述 |
1 |
public boolean startsWith(String prefix)
| 普通 |
从第一个位置开始判断是否以指定的内容开头
|
2 |
public boolean startsWith(String prefix,int toffset)
| 普通 |
从指定的位置开始判断是否以指定的内容开头
|
3 |
public boolean endsWith(String suffix)
| 普通 |
判断是否以指定的内容结尾
|
用法演示:
public class Demo {
public static void main(String[] args) {
String letter="abcdefg";
System.out.println(letter.startsWith("a"));
System.out.println(letter.startsWith("d", 3));
System.out.println(letter.endsWith("g"));
}
}
运行结果:
true
true
true
String类替换操作
序号 | 方法名称 | 类型 | 描述 |
1 |
public String replace(char oldChar,char newChar)
| 普通 |
替换指定字符
|
2 |
public String replace(CharSequence target, CharSequence replacement)
| 普通 |
替换指定字符串
|
3 |
public String replaceAll(String regex,String replacement)
| 普通 |
替换指定的字符串
|
4 |
public String replaceFirst(String regex,String replacement)
| 普通 |
替换第一个满足条件的字符串
|
(注意:regex指的是正则表达式。)
用法演示:
public class Demo {
public static void main(String[] args) {
String letter="abcdefg";
System.out.println(letter.replace("a", "z"));
System.out.println(letter.replace("ab", "xy"));
System.out.println(letter.replaceAll("^[a-z]+$", "121564"));
System.out.println(letter.replaceFirst("^[a-z]", "1"));
}
}
运行结果:
zbcdefg
xycdefg
121564
1bcdefg
String类字符串截取操作
序号 |
方法名称
| 类型 | 描述 |
1 |
public String substring(int beginIndex)
| 普通 |
从指定位置开始一直截取到末尾
|
2 |
public String substring(int beginIndex,int endIndex)
| 普通 |
截取指定范围的字符串
|
public class Demo {
public static void main(String[] args) {
String letter="abcdefg";
System.out.println(letter.substring(3));
System.out.println(letter.substring(2, 4));
}
}
运行结果:
defg
cd
String类字符串拆分操作
序号 | 方法名称 | 类型 | 描述 |
1 |
public String[] split(String regex)
| 普通 |
按照指定的字符串拆分
|
2 |
public String[] split(String regex,int limit)
| 普通 |
拆分字符串,并指定拆分的个数
|
用法示例:
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
String letter="a0bc0d0e0fg";
String[] s=letter.split("0");
System.out.println(Arrays.toString(s));
String[] s1=letter.split("0",2);
System.out.println(Arrays.toString(s1));
}
}
运行结果:
[a, bc, d, e, fg]
[a, bc0d0e0fg]
String类字符串查找操作
序号 | 方法名称 | 类型 | 描述 |
1 |
public boolean contains(String s)
| 普通 |
返回一个字符串是否存在
|
2 |
public int indexOf(int ch)
| 普通 | 从头查找指定的字符是否存在,char -> int,如果存在则返回位置,如果不存在则返回“-1”。 |
3 |
public int indexOf(int ch,int
fromIndex)
| 普通 | 从指定位置查找指定的字符是否存在,char -> int,如果存在则返回位置,如果不存在则返回“-1”。 |
4 |
public int indexOf(String str)
| 普通 | 从头查找指定的字符串是否存在,如果存在则返回位置,如果不存在则返回“-1" |
5 |
public int indexOf(String str,int
fromIndex)
| 普通 | 从指定位置查找字符串是否存在,如果存在则返回位置,如果不存在则返回“-1”。 |
6 |
public int lastIndexOf(int ch)
| 普通 | 从字符串的最后向前查找,指定的字符是否存在,如果存在则返回位置,如果不存在则返回“-1”。 |
7 |
public int lastIndexOf(int ch,int fromIndex)
| 普通 | 从字符串的指定的末尾向前查找,指定的字符是否存在,如果存在则返回位置,如果不存在则返回“-1”。 |
8 |
public int lastIndexOf(String str)
| 普通 | 从字符串的最后向前查找,指定的字符串是否存在,如果存在则返回位置,如果不存在则返回“-1”。 |
9 |
public int lastIndexOf(String str,int fromIndex)
| 普通 | 从字符串的指定的末尾向前查找,指定的字符串是否存在,如果存在则返回位置,如果不存在则返回“-1”。 |
用法示例:
public class Demo {
public static void main(String[] args) {
String letter="abcdefg";
System.out.println(letter.contains("a"));
System.out.println(letter.indexOf("a"));
System.out.println(letter.indexOf("a", 2));
System.out.println(letter.indexOf("bc"));
System.out.println(letter.indexOf("cd", 2));
System.out.println(letter.lastIndexOf("a"));
System.out.println(letter.lastIndexOf("a", 2));
System.out.println(letter.lastIndexOf("bc"));
System.out.println(letter.lastIndexOf("bc", 3));
}
}
运行结果:
true
0
-1
1
2
0
0
1
1
String类其它操作方法
序号 | 方法名称 | 类型 | 描述 |
1 |
public boolean isEmpty()
| 普通 |
判断是否为空,指的是内容为空“
""
”
|
2 |
public int length()
| 普通 |
取得字符串的长度
|
3 |
public String toLowerCase()
| 普通 |
转小写
|
4 |
public String toUpperCase()
| 普通 |
转大写
|
5 |
public String trim()
| 普通 |
去掉开头和结尾的空格,中间的空格不去
|
6 |
public String concat(String str)
| 普通 |
字符串连接操作
|
import java.util.Locale;
public class Demo {
public static void main(String[] args) {
String letter=" abcdefg XYZ ";
String m="llly";
System.out.println(letter.isEmpty());
System.out.println(letter.length());
System.out.println(letter.toLowerCase(Locale.ROOT));
System.out.println(letter.toUpperCase(Locale.ROOT));
System.out.println(letter.trim());
System.out.println(letter.concat(m));
}
}
运行结果:
false
16
abcdefg xyz
ABCDEFG XYZ
abcdefg XYZ
abcdefg XYZ llly
StringBuffer与StringBuilder
在实际开发当中,我们经常会使用到字符串连接的操作,如果用String来操作,则使用“+”号完成字符串的连接操作。
使用String连接字符串,代码性能会非常低,因为String的内容不可改变,在这个过程中会创建很多对象。
解决这个问题的方法是使用StringBuffer或StringBuilder,使用它们的好处是不产生重复的新对象
StringBuilder是一个与 StringBuffer 兼容的 API,但不保证同步。该类被设
计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种
情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比
StringBuffer 要快。
面试题:String和StringBuffer和StringBuilder的区别
String:不可变字符串
StringBuffer:可变字符串,效率低,线程安全(所有公开方法都是 synchronized 修饰,但StringBuilder没有)(适合多线程使用)
StringBuilder :可变字符序列,效率远远高于StringBuffer,线程不安全(不能同步访问),但由于效率高,在不要求线程安全的情况下,多数(单线程)情况下建议使用StringBuilder
StringBuffer使用了缓存区,StringBuilder没有使用缓存区,所以没有修改数据的情况下,多次调用StringBuffer的toString方法获取的字符串是共享底层的字符数组的。而StringBuilder不是共享底层数组的,每次都生成了新的字符数组
(拓展:1.synchronized是Java中的关键字,synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性,因此StringBuffer(被上锁)性能比StringBuilder差
2.String对象的相加底层调用的是StringBuilder对象,调用了append方法和toString方法,由于其中还有StringBuilder对象的创建过程和toString方法中字符数组拷贝的过程,因此String效率很低)