String类的概述和使用
一、String类的概念(重点)
-
java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描
述,如:"abc"。 -
该类由final关键字修饰,表示该类不能被继承
-
从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成byte[]加上编码标记,从而节约了一些空间。
-
该类描述的字符串内容是个常量不可更改,因此可以被共享使用。
如:String str1 = "abc"; - 其中"abc"这个字符串的是个常量不可改变。
str1 = "123" - 将"123"字符串的地址赋值给变量str1. - 改变str1的指向并没有改变指向的内容
二、常量池的概念(原理)
- 由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能。
package com.FirstStage.ThridModule.Two;
public class StringPoolTest {
public static void main(String[] args) {
//验证常量池的存在
//到目前为止,只有String这个特殊类除了new之外还可以直接字符串赋值(包装类除外)
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);//str1 str2 指向同一个地址
}
}
输出:
true
Process finished with exit code 0
三、常用的构造方法(练熟、记住)
package com.FirstStage.ThridModule.Two;
public class StringConstructorTest {
public static void main(String[] args) {
//使用无参方式构造对象并打印
String str1 = new String();
//" "表示空字符串对象,有对象只是里面没内容
//null 表示空,连对象都没有
System.out.println("str1 = " + str1);//
System.out.println("---------------------");
//使用参数指定的byte数组来构造对象并打印
//'a' - 97
byte[] bArr = {97, 98, 99, 100, 101};
//使用字节数组中的一部分内容来构造对象,表示使用数组bArr中下标从1开始的三个字节构造字符串对象
//构造字符串的思路:就是先将每个整数翻译成对应的字符,在将所有的字符串起来
String str2 = new String(bArr, 1, 3);
System.out.println("str2 = " + str2);
//使用整个字节数组来构造字符串对象
String str3 = new String(bArr);
System.out.println("str3 = " + str3);
System.out.println("-----------------------------");
//使用字符数组来构造字符串对象
char[] cArr = {'h', 'e', 'l', 'l', 'o'};
//使用数组的一部分内容来构造对象
String str4 = new String(cArr, 2, 2);
System.out.println("str4 = " + str4);
//使用整个字符数组来构造对象
String str5 = new String(cArr);
System.out.println("str5 = " + str5);
System.out.println("----------------------------------");
//使用字符串来构造字符串对象
String str6 = new String("world");
System.out.println("str6 = " + str6);
}
}
输出:
str1 =
---------------------
str2 = bcd
str3 = abcde
-----------------------------
str4 = ll
str5 = hello
----------------------------------
str6 = world
Process finished with exit code 0
String类的笔试考点:
package com.FirstStage.ThridModule.Two;
public class StringExamTest {
public static void main(String[] args) {
//1、请问下面的代码会创建几个对象?分别存放在什么地方?
//String str1 = "hello";//创建一个对象存放在常量池中
//String str1 = new String("hello");//2个对象,一个直接在常量池中,一个在堆区
//常量池和堆区对象的比较
String str1 = "hello";//常量池中
String str2 = "hello";//常量池中
String str3 = new String("hello");//堆区
String str4 = new String("hello");//堆区
System.out.println(str1 == str2); //比较地址 true
System.out.println(str1.equals(str2));//比较内容 true
System.out.println(str3 == str4); //比较地址 false
System.out.println(str3.equals(str4));//比较内容 true
System.out.println(str2 == str4); //比较地址 false
System.out.println(str2.equals(str4));//比较内容 true
System.out.println("----------------------------------------");
// 常量有优化机制,变量没有
String str5 = "abcd";
String str6 = "ab" + "cd";//常量优化机制
System.out.println(str5 == str6); // 比较地址 true
System.out.println(str5.equals(str6));//true
String str7 = "ab";
String str8 = str7 + "cd";// str7是变量,没有常量优化
System.out.println(str5 == str8); // 比较地址 false
System.out.println(str5.equals(str8));// 比较内容 true
}
}
输出:
true
true
false
true
false
true
----------------------------------------
true
true
false
true
Process finished with exit code 0
四、常用的成员方法
方法声明 功能介绍
String toString() 返回字符串本身
byte[] getByte() 将当前字符串内容转换为byte数字返回
char[] toCharArray() 用于将当前字符串内容转换为char数组并返回
package com.FirstStage.ThridModule.Two;
public class StringByteCharTest {
public static void main(String[] args) {
//创建String类型的对象并打印
String str1 = new String("world");
System.out.println("str1 = " + str1);
System.out.println("---------------------------");
//实现将String类型转换为byte数组类型
//思路:将字符串拆分为字符,在将每个字符转换为byte类型,获取所有字符的ASCLL
byte[] bArr = str1.getBytes();
for (int i = 0; i < bArr.length; i++) {
System.out.println("下标为" + i + "的元素是:" + bArr[i]);
}
//将byte类型转换String类型
String str2 = new String(bArr);
System.out.println("str2 = " + str2);
System.out.println("------------------------------");
//实现将String类型的转换为char数组类型
char[] cArr = str1.toCharArray();
for (int i = 0; i < bArr.length; i++) {
System.out.println("下标为" + i + "的元素是:" + cArr[i]);
}
//将char数组类型转换为String类型
String str3 = new String(cArr);
System.out.println("Str3 = " + str3);
}
}
输出:
str1 = world
---------------------------
下标为0的元素是:119
下标为1的元素是:111
下标为2的元素是:114
下标为3的元素是:108
下标为4的元素是:100
str2 = world
------------------------------
下标为0的元素是:w
下标为1的元素是:o
下标为2的元素是:r
下标为3的元素是:l
下标为4的元素是:d
Str3 = world
Process finished with exit code 0
方法声明 功能介绍
char charAt(int index) 方法charAt用于返回字符串指定位置的字符
int length() 返回字符串字符序列的长度
boolean isEmpty() 判断字符串是否为空
package com.FirstStage.ThridModule.Two;
public class StringCharTest {
public static void main(String[] args) {
//构造String类型的对象并打印
String str1 = new String("hello");
System.out.println("str1 = " + str1);
//获取字符串的长度和每个字符并打印
int len = str1.length();
System.out.println("字符串的长度为:" + len);
for (int i = 0; i < str1.length(); i++) {
char ci = str1.charAt(i);
System.out.println("c" + i + " = " + ci);
}
//判断字符串是否为空
boolean flag = str1.isEmpty();
System.out.println("字符串是否为空:" + flag);
System.out.println("-------------------------");
//笔试考点
//使用两种方式实现字符串“12345”转换为整数12345并打印
String str2 = new String("12345");
//方式一:调用Integer类中的parseInt()方法
int ia = Integer.parseInt(str2);
System.out.println("转换出来的整数是:" + ia);
//方式二:利用ASCLL来实现类型转换并打印
//'1' - '0' => 1 '2' - '0' => 2 . . .
int ic = 0;
for (int i = 0; i < str2.length(); i++) {
char ib = str2.charAt(i);
ic = ic*10 + ib -'0';
}
System.out.println("转换后的整数是:" + ic);
}
}
str1 = hello
字符串的长度为:5
c0 = h
c1 = e
c2 = l
c3 = l
c4 = o
字符串是否为空:false
-------------------------
转换出来的整数是:12345
转换后的整数是:12345
Process finished with exit code 0
案例题目:
判断字符串“上海自来水来自海上”是否为回文并打印,所谓回文是指一个字符序列无论从左向右读还是从右向左读都是相同的子。
package com.FirstStage.ThridModule.Two;
/**
* 案例题目
* 判断字符串“上海自来水来自海上”是否为回文并打印,所谓回文是指一个字符序列无论从左向右读
* 还是从右向左读都是相同的句子。
*/
public class StringJudgeTest {
public static void main(String[] args) {
//构造String类型的对象并打印
String str = new String("上海自来水来自海上");
System.out.println("str = " + str);
//判断字符串的内容
for (int i = 0; i < (str.length()-1)/2; i++) {
if (str.charAt(i) != str.charAt(str.length()-1-i)) {
System.out.println("字符串“" + str + "”不是回文");
return; //仅仅是用于方法的结束
}
}
System.out.println("字符串“" + str + "”是回文");
}
}
输出:
str = 上海自来水来自海上
字符串“上海自来水来自海上”是回文
Process finished with exit code 0
方法声明 功能介绍
int compareTo(String anotherString) 用于比较调用对象和参数对象的大小关系
int compareToIgnoreCase(String str) 不考虑大小写,也就是'a'和'A'是相等关系
案例题目
编程实现字符串之间大小的比较并打印。
package com.FirstStage.ThridModule.Two;
/**
按照字典顺序进行比较,从第一个字符开始比较,直到分出大小截止。若比较晚所有字符大小相等则两个字符串大小相等。
*/
public class StringCompareTest {
public static void main(String[] args) {
// 构造String类型的对象并打印
String str1 = new String("hello");
System.out.println("str1 = " + str1);
// 使用构造好的对象与其他字符串对象之间比较大小并打印
System.out.println(str1.compareTo("world"));
System.out.println(str1.compareTo("haha"));
System.out.println(str1.compareTo("heihei"));
System.out.println(str1.compareTo("hehe"));
System.out.println(str1.compareTo("helloworld"));
System.out.println(str1.compareTo("HELLO"));
System.out.println(str1.compareToIgnoreCase("HELLO"));
}
}
输出:
str1 = hello
-15
4
3
4
-5
32
0
Process finished with exit code 0
package com.FirstStage.ThridModule.Two;
public class StringManyMethodTest {
public static void main(String[] args) {
//构造String类型的对象并打印
String str1 = new String(" Let Me Give You Some Color To See See!");
System.out.println("str1 = " + str1);
//实现各种成员方法的调用和测试
boolean b1 = str1.contains("some");
System.out.println("b1 = " + b1);//false
boolean b2 = str1.contains("Some");
System.out.println("b2 = " + b2);//true
System.out.println("------------------------");
//将所有字符转换为大写、小写以及去除两边的空白字符
String str2 = str1.toUpperCase();
System.out.println("str2 = " + str2);// LET ME GIVE YOU SOME COLOR TO SEE SEE!
System.out.println("str1 = " + str1);// Let Me Give You Some Color To See See!
String str3 = str1.toLowerCase();
System.out.println("str3 = " + str3);// let me give you some color to see see!
System.out.println("str1 = " + str1);// Let Me Give You Some Color To See See!
String str4 = str1.trim();
System.out.println("str4 = " + str4);//Let Me Give You Some Color To See See!
System.out.println("-------------------------------");
//判断字符串是否以。。。开头,以。。。。结尾
b1 = str1.startsWith("Let");
System.out.println("b1 = " + b1);//false
b1 = str1.startsWith(" ");
System.out.println("b1 = " + b1);//true
//下标从7开始是否是以Let开头
b1 = str1.startsWith("Let", 7);
System.out.println("b1 = " + b1);//true
b1 = str1.endsWith("See");
System.out.println("b1 = " + b1);//false
b1 = str1.endsWith("See!");
System.out.println("b1 = " + b1);//true
}
}
输出:
str1 = Let Me Give You Some Color To See See!
b1 = false
b2 = true
------------------------
str2 = LET ME GIVE YOU SOME COLOR TO SEE SEE!
str1 = Let Me Give You Some Color To See See!
str3 = let me give you some color to see see!
str1 = Let Me Give You Some Color To See See!
str4 = Let Me Give You Some Color To See See!
-------------------------------
b1 = false
b1 = true
b1 = true
b1 = false
b1 = true
Process finished with exit code 0
案例题目:
提示用户从键盘输入用户名和密码信息,若输入”admin”和”123456”则提示“登录成功,欢迎使用”,否则提示“用户名或密码错误,您还有n次机会”,若用户输入三次后依然错误则提示“账户已冻结,请联系客服人员!”
package com.FirstStage.ThridModule.Two;
import java.util.Scanner;
/**
* 案例题目
* 提示用户从键盘输入用户名和密码信息,若输入”admin”和”123456”则提示“登录成功,欢迎使
* 用”,否则提示“用户名或密码错误,您还有n次机会”,若用户输入三次后依然错误则提示“账户已
* 冻结,请联系客服人员!”
*/
public class StringEqualsTest {
public static void main(String[] args) {
//提示用户从键盘输入用户名和密码信息并使用变量记录
System.out.println("请输入用户名和密码信息");
Scanner sc = new Scanner(System.in);
for (int i = 3; i > 0; i--) {
String useName = sc.next();
String passWord = sc.next();
//判断用户名和密码是否为"admin"和"123456"并给出提示
boolean b1 = useName.equals("admin");
boolean b2 = passWord.equals("123456");
if (b1 == true && b2 == true) {
System.out.println("登陆成功,欢迎使用");
break;
}else if (i == 1){
System.out.println("账户已冻结,请联系客服人员!");
}else{
System.out.println("用户名或密码错误,您还有" + (i-1) + "次机会");
}
}
sc.close();//关闭扫描器
}
}
输出:
请输入用户名和密码信息
asd
sad
用户名或密码错误,您还有2次机会
asd
asd
用户名或密码错误,您还有1次机会
admin
123456
登陆成功,欢迎使用
Process finished with exit code 0
package com.FirstStage.ThridModule.Two;
public class StringIndexTest {
public static void main(String[] args) {
//构造String类型的对象并打印
String str1 = new String("Good Good Study, Day Day Up");
System.out.println("str1 = " + str1);
//实现字符串中指定字符和字符串查找功能
int pos = str1.indexOf('g');
System.out.println("pos = " + pos);// -1 代表查找失败
pos = str1.indexOf('G');
System.out.println("pos = " + pos);// 0 该字符第一次出现的位置
//表示从下标0开始查找字符'G'第一次出现的位置,包含0
pos = str1.indexOf('G', 0);
System.out.println("pos = " + pos);
pos = str1.indexOf('G', 1);
System.out.println("pos = " + pos);
System.out.println("-----------------------------");
//查找字符串
pos = str1.indexOf("day" );
System.out.println("pos = " + pos);// -1
pos = str1.indexOf("Day");
System.out.println("pos = " + pos);// 17 重找字符串时是字符串中第一个字符的下标
pos = str1.indexOf("Day", 18);
System.out.println("pos = " + pos);// 17 重找字符串时是字符串中第一个字符的下标
System.out.println("---------------------------");
//编写通用代买实现将字符串str1中所有"Day"出现的索引位置找到并打印出来
pos = str1.indexOf("Day");
while (-1 != pos) {
System.out.println("pos = " + pos);
pos = str1.indexOf("Day",pos+1);
}
System.out.println("----------------------------");
//优化一下
pos = 0;
while ((pos = str1.indexOf("Day", pos)) != -1) {
System.out.println("pos = " + pos);
pos += "Day".length();
}
System.out.println("---------------------------------");
//实现字符和字符串内容的反向查找
pos = str1.lastIndexOf('G');
System.out.println("pos = " + pos);// 5
pos = str1.lastIndexOf('G', 5);
System.out.println("pos = " + pos);// 5
pos = str1.lastIndexOf('G', 6);
System.out.println("pos = " + pos);// 5
pos = str1.lastIndexOf('G', 4);
System.out.println("pos = " + pos);// 0
System.out.println("-------------------------------");
pos = str1.lastIndexOf("Day");
System.out.println("pos = " + pos);// 21
pos = str1.lastIndexOf("Day", 21);
System.out.println("pos = " + pos);// 21
pos = str1.lastIndexOf("Day", 22);
System.out.println("pos = " + pos);// 21
pos = str1.lastIndexOf("Day", 20);
System.out.println("pos = " + pos);// 17
}
}
package com.FirstStage.ThridModule.Two;
import java.util.Scanner;
public class SubStringTest {
public static void main(String[] args) {
//构造String类型的对象并打印
String str1 = new String("Happy Wife, Happy Life");
System.out.println("str1 = " + str1);
//获取字符串中的一部分内容并打印
//表示从当前字符串中下标12开始获取字符串
String str2 = str1.substring(12);
System.out.println("str2 = " + str2);// Happy Life
//可以取到6,但取不到10
String str3 = str1.substring(6, 10);
System.out.println("str3 = " + str3);// Wife
System.out.println("--------------------------");
//获取输入字符串中从输入字符串起的子字符串内容
System.out.println("请输入一个字符串:");
Scanner sc = new Scanner(System.in);
String str4 = sc.next();
System.out.println("请输入一个字符:");
String str5 = sc.next();
//从str4中查找str5第一次出现的索引位置
int pos = str4.indexOf(str5);
System.out.println("pos = " + pos);
//根据位置获取子字符串
String str6 = str4.substring(pos);
System.out.println("str6 = " + str6);
}
}
五、正则表达式
1、概念
- 正则表达式本质就是一个“规则字符串”,可以用于对字符串数据的格式进行验证,以及匹配、查找、替换等操作。该字符串通常使用^运算符作为开头标志,使用$运算符作为结尾标志,当然也可以省略。
2、规则
3、方法
案例题目
使用正则表达式描述一下银行卡密码的规则:要求是由6位数字组成。
使用正则表达式描述一下QQ号码的规则:要求是由非0开头的5~15位数组成。
使用正则表达式描述一下手机号码的规则:要求是由1开头,第二位数是3、4、5、7、8中的一位,总共11位
使用正则表达式描述身份证号码的规则:总共18位,6位数字代表地区,4位数字代表年,2位数字代表月,2位数字代表日期, 3位数字代表个人,最后一位可能数字也可能是X。
package com.FirstStage.ThridModule.Two;
import java.util.Scanner;
public class StringRegTest {
public static void main(String[] args) {
//定义描述规则的正则表达式字符串并使用变量记录
//正则表达式只能对数据格式进行检查,无法对数据内容进行检查,内容的正确性检查需要后台查询数据库
//描述银行卡密码的规则:有六位数字组成
//String reg = "^[0-9]{6}$";
//String reg = "[0-9]{6}";
//String reg = "\\d{6}";
//描述QQ号码的规则:有5-15位数字组成
//String reg = "[1-9]\\d{4,14}";
//描述手机号码的规则:要求是由1开头,第二位数是3、4、5、7、8中的一位,总共11位
//String reg = "1[34578]\\d{9}";
//使用正则表达式描述身份证号码的规则:总共18位,6位数字代表地区,4位数字代表年,2位数字代表月,
// 2位数字代表日期, 3位数字代表个人,最后一位可能数字也可能是X。
String reg = "(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9|X])";
//提示用户从键盘输入指定的内容并使用变量记录
Scanner sc = new Scanner(System.in);
while(true) {
//System.out.println("请输入银行卡密码:");
//System.out.println("请输入QQ号码:");
//System.out.println("请输入手机号码:");
System.out.println("请输入身份证号码:");
String str = sc.next();
//判断用户输入的字符串内容是否满足指定的规则并打印
if (str.matches(reg)) {
//System.out.println("银行卡密码格式正确!");
System.out.println("输入字符串的格式正确!");
break;
}else{
// System.out.println("银行卡密码格式不正确!");
System.out.println("输入字符串的格式不正确!");
}
}
}
}
package com.FirstStage.ThridModule.Two;
public class StringRegMethodTest {
public static void main(String[] args) {
//准备一个字符串对象并打印
String str1 = "1001,赵云,30";
System.out.println("str1 = " + str1);
//按照逗号对字符串内容进行切割
String[] sArr = str1.split(",");
for (int i = 0; i < sArr.length; i++) {
System.out.println("下标为" + i + "的内容为:" + sArr[i]);
}
System.out.println("-------------------------------------");
//准备一个字符串内容并进行替换
String str2 = "我的小名叫大帅哥";
//将字符串中所有的'我'替换为'你'
String str3 = str2.replace('我', '你');
System.out.println("str2 = " + str2);
System.out.println("str3 = " + str3);
//将字符串中所有的大替换为小
String str4 = str3.replace('大', '小');
System.out.println("str4 = " + str4);
//将字符串中所有的小替换为大
String str5 = str4.replace('小', '大');
System.out.println("str5 = " + str5);
System.out.println("------------------------------------");
//准备一个字符串进行字符串内容的替换
String str6 = "123abc456def789ghi";
//将第一个数字替换为“#”
String str7 = str6.replaceFirst("\\d", "#");
System.out.println("str7 = " + str7);
//将所有的字母字符串替换为"$$$"
String str8 = str7.replaceAll("[a-z]", "A");
System.out.println("str8 = " + str8);
}
}
输出:
str1 = 1001,赵云,30
下标为0的内容为:1001
下标为1的内容为:赵云
下标为2的内容为:30
-------------------------------------
str2 = 我的小名叫大帅哥
str3 = 你的小名叫大帅哥
str4 = 你的小名叫小帅哥
str5 = 你的大名叫大帅哥
------------------------------------
str7 = #23abc456def789ghi
str8 = #23AAA456AAA789AAA
Process finished with exit code 0
本文来自博客园,作者:寒露凝珠,转载请注明原文链接:https://www.cnblogs.com/china-soldier/p/14966888.html