java中的字符串String类
String 类表示字符串,Java 程序中的所有字符串(例如“蓝桥”)都作为此类的对象。String 类不是基本数据类型,它是一个类。因为对象的初始化默认值是 null,所以 String 类对象的初始化默认值也是 null。String 是一种特殊的对象:
String 字符串是常量,字符串的值在创建之后不能更改。
String 类是 final 修饰的最终类,因此不能被继承。
String类常见的几种创建方法
如何使用 String 类操作字符串呢?首先要定义并初始化字符串。在初始化时,可以直接使用双引号来创建一个字符串字面值常量,这也是实际编程中最常用的方法,如 String h=“hello”;,还可以借助于 String 类包含的以下构造方法(构造方法的方法名和类名一致,会在后续章节进行介绍)。
String(String s):创建一个新的 String 对象,使其内容为参数 s 中的字符序列。
String(char[] value):创建一个新的 String 对象,使其内容为参数 value 中的字符序列。
String(char[] value, int offset, int count):创建一个新的 String 对象,其内容为取自字符数组参数 value 的一个子序列。offset 参数是子数组第一个字符的索引(从 0 开始建立索引),count 参数指定子数组的长度。
示例如下:
String stuName1 = new String("王云");
char[] charArray = {'刘','静','涛'};
String stuName2 = new String(charArray);
String stuName3 = new String(charArray,1,2);//从'静'字开始,截取 2 个字符,结果是“静涛”
最常用的方式:
字符串的不可变性(重,字符串不可变和变量可变)
在实际编程过程中,常常有这样的需求,需要在一个字符串后面增加一些内容,例如需要在 stuName1 后面增加字符串“同学”。查询相关资料,知道 String 类提供了一个 concat(String str)的方法,可以在 String 类字符串后面增加字符串。
我们来看看下面这个例子
public class TestString1 {
public static void main(String[] args) {
String stuName1 = new String("王云");
stuName1.concat("同学");
System.out.println(stuName1);
}
}
如果编译、运行此程序,执行的输出结果是“王云”,而不是“王云同学”。为什么呢?
我们知道 String 字符串是常量,字符串的值在创建之后不能更改。concat(String str)方法实际创建了一个新 String 字符串,用来存放 stuName1 字符串加上“同学”的结果,而不是在原来 stuName1 字符串的后面增加内容,对于 stuName1 而言,它是常量,内容并没有变化,如图所示。
如果想输出“王云同学”,可以将 stuName1.concat(“同学”) 表达式的结果赋给一个新的字符串,然后再输出该字符串。
例如:字母大小写转换时
s1指向的地址不变,只是在堆空间新建了一个值是ABC的小写,所以我们需要新建字符串给它赋值就可以了。
也可以转化为小写后重新赋值给s1,此处是s1的指针变了所以成功转换,原本的ABC是仍然存在的。
字符串的不可变性例题
如何判断字符串相等
比较字符串常用的两个方法是运算符 == 和 String 类的 equals 方法。
使用**“==”比较两个字符串,是比较两个对象在内存中的地址是否一致,本质上就是判断两个变量是否指向同一个对象**,如果是则返回 true,否则返回 false。而 String 类的 equals 方法则是比较两个 String 字符串的内容是否一致,返回值也是一个布尔类型。
在比较字符串时还要知道**“常量池”的概念**:在第一次生成某个字符串时,这个字符串就会被复制到 JVM 的一个特定的内存中,这个内存区域就称为“常量池”。以后,如果再次创建了相同内容的字符串,JVM 就直接返回常量池中已有的字符串。
字符串的比较,例:
常量池,例:
字符串中常用的方法1
以下是 String 类索引,比较和替换相关的常用方法。
1. public char charAt(int index)
返回 index 指定的索引处的字符。
2. public int length()
返回此字符串的长度。这里需要和获取数组长度区别开,获取数组长度是通过数组名.length获取的。
3.public int indexOf(String str)
返回指定子字符串 str 在此字符串中第一次出现处的索引。没有则返回-1。
4.public int indexOf(String str,int fromIndex)
返回指定子字符串 str 在此字符串中第一次出现处的索引,从指定的索引 fromIndex 处开始搜索。没有则返回-1。
5.public boolean equalsIgnoreCase(String another)
将此 String 与另一个字符串 another 比较,比较时不区分大小写。
6.public String replace(char oldChar,char newChar)
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。这里再重申一下,String 类方法中的索引都是从 0 开始编号的。
字符串中常用的方法2
7.public boolean startsWith(String prefix)
判断此字符串是否以 prefix 指定的前缀开始。
8.public boolean endsWith(String suffix)
判断此字符串是否以 suffix 指定的后缀结束。
9.public String toUpperCase()
将此 String 中的所有字符都转换为大写。
10.public String toLowerCase()
将此 String 中的所有字符都转换为小写。
11.public String substring(int beginIndex)
返回一个从 beginIndex 开始到结尾的新的子字符串。
12.public String substring(int beginIndex,int endIndex)
返回一个从 beginIndex 开始到 endIndex 结尾(不含 endIndex 所指字符)的新的子字符串。
字符串中常用的方法3
13.public String trim()
返回字符串的副本,忽略原字符串前后的空格。
14.public static String valueOf(基本数据类型参数)
返回基本数据类型参数的字符串表示形式,例如:
public static String valueOf(int i)
public static String valueOf(double d)
这两个方法是 String 类的静态方法,关于“静态”的内容将会在后面的课程详细介绍,这里需要大家注意的是,静态方法是通过类名.方法名直接调用的,例如:
String result = String.valueOf(100);//将int型100转换为字符串"100"
15.public String[] split(String regex)
通过 regex 指定的分隔符分隔字符串,返回分隔后的字符串数组。注意是通过正则方式进行分割!!
例如:
当遇到(这种在正则中有特殊含义的符号时就需要使用反斜杠\进行一个转义告诉他(只是一个符号,但是由于\本身也有特殊含义,就导致需要再添加一个\进行转义,例如:
例题
【练一练】实现回文字符串判断器
首先在 /home/project 中创建一个 Palindrome.java 。
本次实验的目标是完成一个回文字符串判断器,即传入一个字符串判断该字符串是否为回文结构。
回文结构:正序和倒序都一模一样的字符串结构。
本次实验的思路:将传入的字符串倒序排列得到新字符串,再将新字符串与原字符串进行比较。若比较结果为真则表示该字符串为回文字符串,反之则不是回文字符串。
代码如下:
import java.util.Scanner;
public class Palindrome {
public static void main(String[] args) {
// 创建一个控制台录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串");
// 从控制台接收整行字符串
String str = sc.nextLine();
// 创建一个新字符串,该字符串内容为空
String nstr = "";
// 将该字符串倒序遍历并拼接到新的字符串中
for (int i = str.length()-1; i >= 0 ; i--) {
nstr+=str.charAt(i);
}
// 将新字符串与原字符串进行比较
if(str.equals(nstr)){
System.out.println(str+":是回文");
}else{
System.out.println(str+":不是回文");
}
}
}
接下来在控制台使用命令编译并运行该程序。
最后得出实验结果。
正则表达式匹配规则
【练一练】邮箱校验【正则表达式需补充】(重)
首先在 /home/project 中创建一个 Email.java 。
本次实验的思路:根据我们常用邮箱的格式编写一段表示邮箱的正则表达式,将传入的邮箱字符串用该正则表达式验证,如验证通过则表示邮箱合法,反之则不合法。
合法 E-mail 地址:
必须包含一个并且只有一个符号“@”
第一个字符不得是“@”或者“.”
不允许出现“@.”或者.@
结尾不得是字符“@”或者“.”
允许“@”前的字符中出现“+”
不允许“+”在最前面,或者“+@”
代码如下:
import java.util.Scanner;
/**
* @author life
* @create 2019-11-24 14:29
* 判断功能:
* 校验邮箱
*/
public class Email {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 提示语句
System.out.println("请输入您的邮箱:");
// 接收控制台录入的邮箱
String email = scanner.next();
// 传入方法进行校验
boolean result = checkEmail(email);
// 判断校验结果
if(result){
System.out.println("邮箱正确");
}else{
System.out.println("邮箱错误");
}
}
public static boolean checkEmail(String email){
// 设计正则
String regex = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
// 使用 String 对象中的 matches() 方法校验字符串是否符合正则要求
if (email.matches(regex) == true) {
return true;
} else
return false;
}
}
接下来在控制台使用命令编译并运行该程序。
最后得出实验结果。