概述:字符串是由多个字符组成的一串数据(字符序列),它可以看成是一个字符数组。Java程序中的所有字符串面值(如:“abc”)都可以看成是一个字符串对象。
String str = "abc";
相当于:
char data[] = {
'a', 'b', 'c'};
String str = new String(data);
// String底层是靠字符数组实现的。
- String类被final修饰,不可被继承
- 字符串是不可变序列,是常量,一旦被赋值,就不能被改变。(其值不能改变,但是String类型的引用所指向的地址值可以发生改变)
- 字符串字面值存放在方法区中的字符串常量池,字符串常量池中一定不存在两个相同的字符串
public static void main(String[] args) {
String name = "zhangsan";
/**
* 重新赋值时,并不是直接在原地址上覆盖zhangsan,而是在字符串池中
* 找到(创建)lisi,然后把lisi的地址赋值给name,从而实现新的赋值过程
*/
name = "lisi";
}
注意:当我们重新赋值时,并不是直接修改他的字面值,因为字面值是不可改变的,而是通过重新开辟一个空间,把新空间的地址赋值给变量,这就是不可变性
| 方法 | 描述 |
|---|---|
String(); |
无参构造 |
String(byte[] bytes); |
把字节数组转换成字符串 |
String(byte[],int offset,int length); |
把字节数组的一部分转换成字符串 |
String(char[] value); |
把字符数组转换成字符串 |
String(char[] value,int offset,int count); |
把字符数组的一部分转换成字符串 |
String(String original); |
把字符串常量转换成字符串 |
示例:
// 直接创建
String s = "abc";// 创建一个字符串对象abc,放在方法区字符串常量池中
// 通过构造器传字符串的创建
String s1 = new String("abc");// 在堆中创建一个字符串对象,然后在常量池中找到并返回abc对象
// 通过字符数组构造
char chars[] = {
'a', 'b', 'c'};
String str2 = new String(chars);// 在堆中创建一个字符串对象,然后在常量池中找到并返回abc对象
// 通过字节数组构造
byte bytes[] = {
97, 98, 99 };
String str3 = new String(bytes);// 在堆中创建一个字符串对象,然后在常量池中找到并返回abc对象
注意:字符串直接赋值的方式是先到方法区的字符串常量池里面查找,如果有就直接返回,如果没有就创建并返回。
String str = “abc”;与String str2 = new String(“abc”);的区别
- String str = “abc”:
可能创建一个或者不创建对象。直接到方法区的字符串常量池里面查找,如果abc在字符串池中存在, str直接指向这个内存地址;如果abc在字符串池中不存在,会在java字符串池中创建一个String对象abc,然后str指向这个内存地址,无论以后用这种方式创建多少个值为abc的字符串对象,始终指向的都是该内存地址,即以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一 个 String 对象,并在字符串池中维护。- String str = new String(“abc”):
至少会创建一个对象,也有可能创建两个。因为用到new关键字,肯定会在堆中创建一个String对象,如果字符池中已经存在abc,则不会再字符串池中创建一个String对象,如果不存在,则会在字符串常量池中也创建一个对象。

| 方法名 | 描述 |
|---|---|
int length() |
返回字符串的长度 |
char charAt(int index) |
根据下标获取字符 |
int indexOf(String str) |
查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1 |
int indexOf(int ch,int fromIndex); |
查找指定字符在指定位置后第一次出现处的索引 |
int indexOf(String str,int fromIndex); |
查找指定字符串在指定位置后第一次出现处的索引 |
char[] toCharArray() |
将字符串转换成数组。 |
byte[] getBytes(); |
把字符串转换为字节数组 |
static String valueOf(...); |
String类的valueOf方法可以把任意类型的数据转换为字符串 |
String trim() |
去掉字符串前后的空格 |
String toLowerCase(); |
把字符串转换为小写 |
String toUpperCase() |
把字符串转换为大写 |
String replace(String oldString,String newString) |
把字符串中的子字符串替换为新的子字符串,原字符串不变 |
String[] split(String str) |
根据str做拆分,如空格符或给定正则表达式的匹配拆分此字符串 |
String concat(String str); |
把字符串进行拼接 |
String subString(int beginIndex,int endIndex) |
在字符串中截取出一个子字符串,范围[beginIndex,endIndex),包含开始,不含结束 |
boolean equals(Object obj); |
比较字符串的内容是否相同,区分大小写 |
boolean equalsIgnoreCase(String str); |
比较字符串的内容是否相同,忽略大小写 |
int compareTo(String str); |
按字典顺序比较两个字符串 |
boolean contains(String str) |
判断当前字符串中是否包含str |
boolean startsWith(String str); |
判断字符串是否以某个指定的字符串开头 |
boolean endsWith(String str) |
判断字符串是否以str结尾 |
boolean isEmpty(); |
判断字符串内容是否为空 |
native String intern(); |
直接指向常量池 |
new String()的一些参考:
演示:
System.out.println("---------字符串方法的使用 1-------------");
//字符串方法的使用
//1、length();返回字符串的长度
//2、charAt(int index);返回某个位置的字符
//3、contains(String str);判断是否包含某个子字符串
String content = "java是世界上最好的java编程语言,java真香";
System.out.println(content.length()); // 26
System.out.println(content.charAt(content.length() - 1)); // 香
System.out.println(content.contains("java")); // true
System.out.println(content.contains("php")); // false
System.out.println("--------字符串方法的使用 2--------------");
//字符串方法的使用
//4、toCharArray();返回字符串对应的数组
//5、indexOf();返回子字符串首次出现的位置
//6、lastIndexOf();返回字符串最后一次出现的位置
System.out.println(Arrays.toString(content.toCharArray()));
System.out.println(content.indexOf("java")); // 0
System.out.println(content.indexOf("java", 4)); // 11
System.out.println(content.lastIndexOf("java"));// 20
System.out.println("------------字符串方法的使用3------------------");
//7、trim();去掉字符串前后的空格
//8、toUpperCase();//把小写转成大写 toLowerCase();把大写转成小写
//9、endWith(str);判断是否已str结尾,startWith(str);判断是否已str开头
String content2 = " hello World ";
System.out.println(content2.trim()); // hello World
System.out.println(content2.toUpperCase()); // HELLO WORLD
System.out.println(content2.toLowerCase