什么是String对象
通俗点理解,它就是一个字符串对象。
特点
- 字符串的内容永不可变。
- 正是因为字符串不可改变,所以字符串是可以共享使用的(常量池)
- 字符串效果上相当于是char[ ]字符数组,但是底层原理是byte[ ]字节数组。
如何创建
创建方法(3 + 1) | 解释 |
---|---|
public String() | 创建一个空白字符串,不含有任何内容 |
public String(char[] array) | 根据字符数组的内容,来创建对应的字符串 |
public String(byte[] array) | 根据字节数组的内容。来创建对应的字符串 |
---------------- | 直接创建 |
创建对象实例
public class Main {
public static void main(String[] args) {
// 直接创建
String str1 = "abc";
System.out.println(str1);
// 空参创建
String str2 = new String();
System.out.println(str2);
// 字符数组带参创建
char[] x = {'a','b','c'};
String str3 = new String(x);
System.out.println(str3);
// 字节数组带参创建
byte[] y = {97,98,99};
String str4 = new String(y);
System.out.println(str4);
}
}
运行结果:
abc
abc
abc
常用方法
返回值 | 方法 | 解释 |
---|---|---|
boolean | equals(Object anObject) | 比较两个字符串内容 |
int | length() | 返回此字符串的长度 |
String | concat(String str) | 将指定的字符串连接到该字符串的末尾 |
char | charAt(int index) | 返回 char指定索引处的值 |
int | indexOf(String str) | 返回指定子字符串第一次出现的字符串内的索引 |
String | substring(int beginIndex) | 返回一个字符串,该字符串是此字符串的子字符串 |
String | substring(int beginIndex, int endIndex) | 返回一个字符串,该字符串是此字符串的子字符串 |
char[ ] | toCharArray() | 将此字符串转换为新的字符数组 |
byte[ ] | getBytes() | 使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中 |
String | replace(char oldChar, char newChar) | 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar |
String[ ] | split(String regex) | 将此字符串分割为给定的 regular expression的匹配 |
关于equals方法的注意事项
- 任何对象都能用object进行接收。
- equals方法具有对称性。也就是a.equals(b)和b. equals(a)效果一样。
- 如果比较双方一个常量一个变量,推荐把常量字符串写在前面。
推荐,“abc”.equals(str) 不推荐: str. equals(“abc”)
原因:如果str是空值(null) 和 abc 进行内容比较就会报:java.lang.NulIPointerException
错误
使用方法实例
public class Main {
public static void main(String[] args) {
// 测试长度
String str = "abc";
System.out.println(str.length());
// 测试连接
String str1 = str.concat("def");
System.out.println(str1);
// 测试索引
for (int i = 0; i < str.length(); i++) {
System.out.print(str.charAt(i));
}
System.out.println();
// 测试子字符串索引
int a = str1.indexOf("def");
System.out.println(a);
// 返回指定区域的一个子字符串
String str2 = str1.substring(1, 4);
System.out.println(str2);
// 将字符串转化为字符数组
char[] b = str1.toCharArray();
System.out.println(b);
// 将字符串转化为字节数组
byte[] c = str1.getBytes();
for (int i = 0; i < c.length; i++)
System.out.print(c[i] + " ");
System.out.println();
// 替换字符串
String str3 = str1.replace('a', '%');
System.out.println(str3);
// 利用分割
String str4 = "hello,world,java";
String[] str5 = str4.split(",");
for (int i = 0; i < str5.length; i++) {
System.out.print(str5[i] + " ");
}
}
}
运行结果:
3
abcdef
abc
3
bcd
abcdef
97 98 99 100 101 102
%bcdef
hello world java
特殊地
字符串对象是拥有常量池的。对于直接创建的字符串对象来说,是先会堆里面寻找,常量池里面是否有该字符串,再考虑是否再开辟一段空间进行分配。下面用代码来解释:
public class Main {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == d);
}
}
运行结果:
true
false
false