第二十一部分 String类
21.1 概述
-
概述:
java.lang.String
类代表字符串。Java程序中所有的字符串文字(例如 “abc” )都可以被看作是实现此类的实例。程序当中所有的双引号字符串,都是String类的对象。 -
特点:
- 字符串的值在创建后不能被更改。
- 因为String对象是不可变的,所以它们可以被共享。
- 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组。
21.2 创建字符串的常见3+1种方式
- 三种构造方法
public String()
:初始化新创建的String对象,以使其表示空字符序列。public String(char[] array)
:通过当前参数中的字符数组来构造新的String。public String(byte[] array)
:通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String。
- 一种直接创建 :
String str = "Hello";
public class DemoString {
public static void main(String[] args) {
// 使用空参构造
String str1 = new String(); // 小括号留空,说明字符串什么内容都没有。
System.out.println("第1个字符串:" + str1);
// 根据字符数组创建字符串
char[] charArray = { 'A', 'B', 'C' };
String str2 = new String(charArray);
System.out.println("第2个字符串:" + str2); // ABC
// 根据字节数组创建字符串
byte[] byteArray = { 97, 98, 99 };
String str3 = new String(byteArray);
System.out.println("第3个字符串:" + str3); // abc
// 直接创建
String str4 = "Hello";
System.out.println("第4个字符串:" + str4);
}
}
21.3 字符串的常量池
-
字符串常量池: 程序当中直接写上的双引号字符串,就在字符串常量池中。new的不在池中。
-
对于基本类型来说,== 是进行
数值
的比较;
对于引用类型来说,== 是进行地址值
的比较。
public class StringPool {
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
}
}
21.4 字符串比较
==
是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法:
-
public boolean equals(Object obj)
:将此字符串与指定对象进行比较。只有参数是一个字符串并且内容相同的才会给true;否则返回false。- 任何对象都能用Object(” 对象”的意思,也是一种引用类型)进行接收。
- equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。
- 如果比较双方一个常量一个变量,推荐把常量字符串写在前面。
推荐:“abc”.equals(str) 不推荐:str.equals(“abc”)
-
public boolean equalsIgnoreCase(String str)
:忽略大小写,进行内容比较。
public class StringEquals {
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 = null;
System.out.println("abc".equals(str5)); // 推荐:返回false
// System.out.println(str5.equals("abc")); // 不推荐:报错,空指针异常
System.out.println("=================");
String strA = "Java";
String strB = "java";
System.out.println(strA.equals(strB)); // false,严格区分大小写
System.out.println(strA.equalsIgnoreCase(strB)); // true,忽略大小写
// 注意,只有英文字母区分大小写,其他都不区分大小写
System.out.println("abc一123".equalsIgnoreCase("abc壹123")); // false
}
}
21.5 字符串获取
public int length()
:返回此字符串的长度。public String concat (String str)
:将指定的字符串连接到该字符串的末尾,返回新的字符串。public char charAt (int index)
:返回指定索引处的char值。public int indexOf (String str)
:返回指定子字符串第一次出现在该字符串内的索引,如果没有返回-1值。
public class Demo02StringGet {
public static void main(String[] args) {
// 获取字符串的长度
int length = "asdasfeutrvauevbueyvb".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("==============");
// 查找参数字符串在本来字符串当中出现的第一次索引位置
// 如果根本没有,返回-1值
String original = "HelloWorldHelloWorld";
int index = original.indexOf("llo");
System.out.println("第一次索引值是:" + index); // 2
System.out.println("HelloWorld".indexOf("abc")); // -1
}
}
21.6 字符串截取
public String substring(int index)
:截取从参数位置一直到字符串末尾,返回新字符串。public String substring(int begin, int end)
:截取从begin开始,一直到end结束中间的字符串。[begin,end),包含左边,不包含右边。
public class DemoSubstring {
public static void main(String[] args) {
String str1 = "HelloWorld";
String str2 = str1.substring(5);
System.out.println(str1); // HelloWorld,原封不动
System.out.println(str2); // World,新字符串
System.out.println("================");
String str3 = str1.substring(4, 7);
System.out.println(str3); // oWo
System.out.println("================");
// 下面这种写法,字符串的内容仍然是没有改变的
// strA当中保存的是地址值,只是地址值发生了改变
String strA = "Hello";
System.out.println(strA); // Hello
strA = "Java";
System.out.println(strA); // Java
}
}
21.7 字符串转换
public char[] toCharArray()
:将当前字符串拆分成为字符数组作为返回值。public byte[] getBytes()
:获得当前字符串底层的字节数组。public String replace(CharSequence oldString, CharSequence newString)
:将所有出现的老字符串替换成为新的字符串,返回替换之后的新字符串。CharSequence
意思是说可以接受字符串类。
public class StringConvert {
public static void main(String[] args) {
// 转换成为字符数组
char[] chars = "Hello".toCharArray();
System.out.println(chars[0]); // H
System.out.println(chars.length); // 5
System.out.println("==============");
// 转换成为字节数组
byte[] bytes = "abc".getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]);
}
System.out.println("==============");
// 字符串的内容替换
String str1 = "How do you do?";
String str2 = str1.replace("o", "*");
System.out.println(str1); // How do you do?
System.out.println(str2); // H*w d* y*u d*?
System.out.println("==============");
}
}
21.8 字符串分割
public String[] split(String regex)
:将此字符串按照给定的regex(正则表达式)拆分为字符串数组。
public class StringSplit {
public static void main(String[] args) {
String str1 = "aaa,bbb,ccc";
String[] array1 = str1.split(",");
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
System.out.println("===============");
String str2 = "aaa bbb ccc";
String[] array2 = str2.split(" ");
for (int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
System.out.println("===============");
String str3 = "XXX.YYY.ZZZ";
String[] array3 = str3.split("\\."); // 需要用到正则表达式,不能直接写"."
System.out.println(array3.length);
for (int i = 0; i < array3.length; i++) {
System.out.println(array3[i]);
}
}
}
21.9 练习
键盘输入一个字符串,并且统计其中各种字符出现的次数。种类有:大写字母、小写字母、数字、其他
import java.util.Scanner;
public class StringCount {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String input = sc.next(); // 获取键盘输入的一个字符串
int countUpper = 0; // 大写字母
int countLower = 0; // 小写字母
int countNumber = 0; // 数字
int countOther = 0; // 其他字符
char[] charArray = input.toCharArray();
for (int i = 0; i < charArray.length; i++) {
char ch = charArray[i]; // 当前单个字符
if ('A' <= ch && ch <= 'Z') {
countUpper++;
} else if ('a' <= ch && ch <= 'z') {
countLower++;
} else if ('0' <= ch && ch <= '9') {
countNumber++;
} else {
countOther++;
}
}
System.out.println("大写字母有:" + countUpper);
System.out.println("小写字母有:" + countLower);
System.out.println("数字有:" + countNumber);
System.out.println("其他字符有:" + countOther);
}
}
上一篇: Java学习(八)—— 三个常用的类(Scanner,Random,ArrayList)
下一篇: Java学习(十)—— static关键字