一、字符串概述
1.String类概述
java.lang.String类代表字符串。我们在API文档中可以看到“Java程序中的所有字符串面值(如 “abc”)都作为此类的实例实现。”也就是说,程序当中所有的双引号字符串,都是String类的对象。(就算没有new,也是如此。)类String中包括用于检查各个字符串的方法,我们在后面会说到。
2.字符串的特点
- 字符串的内容永不可变。【重点】
- 正是因为字符串不可改变,所以字符串是可以共享使用的。
- 字符串效果上相当于是char[]字符数组,但底层原理是byte[]字节数组。
二、字符串的使用
那么字符串该如何创建呢,除了我们常用的直接创建,还有三种构造方法,一共四种方法如下所示:
1.无参构造方法
// 无参构造,创建一个空白字符串,不含有任何内容
String str = new String();
2.通过字符数组构造
// 通过字符数组构造,根据字符数组的内容,来创建对应的字符串
char[] charArray = {'A', 'B', 'C'};
String str2 = new String(charArray);
3.通过字节数组构造
//通过字节数组构造,根据字节数组的内容,来创建对应的字符串
byte[] byteArray = {97, 98, 99};
String str3 = new String(byteArray);
4.直接创建
//直接写上双引号,就是字符串的对象
String str4 = "nxy";
三、字符串的比较
先说一个概念:字符串常量池,它是指程序当中直接写上的双引号字符串,就在字符串常量池中。我们观察如下代码:
public class Demo02StringPool {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
char[] charArray = {'a','b','c'};
String str3 = new String(charArray);
System.out.println(str1 == str2); //true
System.out.println(str1 == str3); //false
System.out.println(str2 == str3); //false
}
}
运行结果:
可以看到如果用 == 来比较一个直接创建的字符串和一个通过构造方法创建的字符串结果为 false 。这是因为程序当中直接写上的双引号字符串是放在字符串常量池当中的,而对于引用类型来说:== 是进行【地址值】的比较,因此,运行结果是false。
那么如何比较字符串的内容呢?可以使用两个方法:
1.public boolean equals(Object obj)
该方法严格区分所比较字符串的大小写情况,参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true,否则返回false。
注意事项:
- 任何对象都能用Object进行接收。
- equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果是一样的。
- 如果比较双方一个常量一个变量,推荐把常量字符串写在前面。
推荐:“abc”.equals(str) 不推荐:str.equals(“abc”)
2.public boolean equalsIgnoreCase(String str)
该方法不区分所比较的字符串的大小写情况,只对内容进行比较。
代码示例说明:
public class Demo01StringEquals {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
char[] charArray = {'H','e','l','l','o'};
String str3 = new String(charArray);
System.out.println(str1.equals(str2)); //true
System.out.println(str2.equals(str3)); //true
System.out.println(str3.equals("Hello")); //true
System.out.println("Hello".equals(str1)); //true
String str4 = "hello";
System.out.println(str1.equals(str4)); //false
System.out.println("---------------------");
String str5 = "abc";
System.out.println("abc".equals(str5)); //推荐 false
System.out.println(str5.equals("abc")); //不推荐 报错,空指针异常:NullPointerException
System.out.println("=====================");
String strA = "JAVA";
String strB = "java";
System.out.println(strA.equals(strB)); //false 严格区分大小写
System.out.println(strB.equalsIgnoreCase(strB)); //true,忽略大小写
//注意,只有英文字母区分大小写,其他都不区分
}
}
四、字符串的获取
String当中与获取相关的常用方法有:
public int length():获取字符串当中含有的字符个数,拿到字符串长度。
public String concat(String str):将当前字符串和参数字符串拼接成为返回值新的字符串。
public char charAt(int index):获取指定索引位置的单个字符。(索引从0开始)
public int indexOf(String str):查找参数字符串在本字符串当中首次出现的索引位置,如果没有返回-1值。
下面用代码举例说明:
public class Demo02StringGet {
public static void main(String[] args) {
//获取字符串的长度
int length = "asdhiaohfaincioahio".length();
System.out.println("字符串的长度是:" + length);
//拼接字符串
String str1 = "Hello";
String str2 = "World";
String str3 = str1.concat(str2);
System.out.println(str1); // Hello,原封不动
System.out.println(str2); // World,原封不动
System.out.println(str3); // HelloWorld,新的字符串
System.out.println("------------------------");
//获取指定索引位置的单个字符
char ch = "Hello".charAt(1);
System.out.println("在1号索引位置的字符是:" + ch);
System.out.println("------------------------");
//查找参数字符串在本来字符串当中出现的第一次索引位置
String original = "HelloWorld";
int index = original.indexOf("llo");
System.out.println("第一次出现的索引位置是:" + index); // 2
System.out.println("HelloWorld".indexOf("abc")); // -1
}
}