Java —— String
概述
- Java程序中,所有的双引号字符串,都是String这个类的对象。
- String类在Java.lang包下,所以使用的时候是不需要导包的。
- 字符串不可变,它们的值在创建之后不可被更改。
常见的构造方法
public String() // 创建一个空白字符串对象,不含有任何内容 public String(char[] chs) // 根据字符数组的内容,来创建字符串对象 public String(String original) // 根据传入字符串的内容,来创建字符串对象 String s = "abc" // 直接赋值的方法来创建字符串对象,内容就是abc
常见的成员方法
length()
获取字符串的长度,常用于遍历字符串。
String str = "hello world"; System.out.println("str.length() = " + str.length()); // str.length() = 11
charAt()
返回指定索引处的char值,字符串的索引也是从0开始的,常用于遍历字符串。使用方式如下
String str = "hello world"; System.out.println(str.charAt(1)); // e
toCharArray()
将当前字符串拆分为字符数组并返回,常用于遍历字符串。使用方式如下
String str = "hello world"; char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { System.out.print(chars[i] + "\t"); // h e l l o w o r l d }
substring()
字符串的截取,它有俩种使用方式,分别是传入一个参数和俩个参数,使用方式分别如下:
1、传入一个参数,就是从传入的索引处开始向后截取,一直截取到末尾,得到新的字符串并返回。
String str = "hello world"; String newStr2 = str.substring(6); System.out.println(newStr2); // world
2、传入俩个参数,第一个参数就代表开始截取的位置索引,第二个参数代表结束索引的位置。使用方式如下:
String str = "hello world"; String str2 = str.substring(1, 4); System.out.println(str2); // ell
replace
将当前字符串中的部分内容使用新值进行替换,返回替换完成后的新字符串。它传入2个参数,第一个参数为即将要替换的内容,第二个参数为即将使用的字符串新值,使用方式如下
String str = "hello world"; String newString = str.replace("hello", "hi"); System.out.println(newString); // hi world
这个方法是全部替换,也就是字符串中有多个所匹配的,也一并替换掉,如下
String str = "hello world, hello world"; String newString = str.replace("hello", "hi"); System.out.println(newString); // hi world, hi world
split
根据传入的字符串作为规则进行切割,将切割后的内容存入字符串数组中,并将字符串数组返回。使用方式如下
String str = "张三, 27"; String[] arr = str.split(","); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); // 张三 // 27 }
equals()和equalsIgnoreCase()
==号在做比较的时候,如果是基本数据类型之间的比较,比较的是具体的值,比较引用类型的值的时候,比较的是地址值。
因为字符串是对象,如果需要它比较内容是否相同。可以通过一个方法来实现,这个方式就是——equals,使用方式如下:
String str1 = "abc"; String str2 = new String("abc"); boolean result = str1.equals(str2); System.out.println(str1 == str2); // false System.out.println(result); // true
如果想忽略大小写的进行比较,可以使用equalsIgnoreCase()进行比较,使用方法如下:
String str1 = "abc"; String str2 = new String("ABC"); boolean result = str1.equalsIgnoreCase(str2); System.out.println(result); // true
一些注意点
创建字符串对象的区别对比
以" "方式给出的字符串,只要字符序列(顺序和大小写)相同,无论在程序代码中出现几次,JVM都只会创建一个String对象,并在字符串常量池中维护。
String str1 = "abc"; String str2 = "abc";
当使用" "创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在,如果不存在,就创建,如果存在,就不会重现创建,而是直接复用。
通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同。
String str3 = new String("abc"); String str4 = new String("abc");
关于不能更改
字符串是常量,它们的值在创建之后不能更改。
String str = "abc"; str = "def"; System.out.println("str = " + str); // str = def
上面str字符串对象看似内容被更改了,其实并没有,只是str变量指向了另一个字符串对象实例。
关于打印
string这个类比较特殊,打印其对象名的时候,不会出现内存地址,而是该对象所记录的真实内容。
常见面试题
String str1 = "abc"; String str2 = "abc"; System.out.println(str1 == str2); // true
String str1 = "abc"; String str2 = new String("abc"); System.out.println(str1 == str2); // false
String str1 = "abc"; String str2 = "ab"; String str3 = str2 + "c"; System.out.println(str1 == str3); // false // 分析:当字符串之间使用 + 号串联(拼接)的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。拼接后,再调用其toString方法转换为String类型。
String str1 = "abc"; String str2 = "a" + "b" + "c"; System.out.println(str1 == str2); // true // 分析:Java存在常量优先机制,在编译的时候,就会将"a" + "b" + "c"拼接为"abc"