JavaSE基础篇【2】
2022年6月2日
第三部分 字符串
3.1 String 类
Java中 char 类型只能表示单个字符,不能表示由多个字符连接而成的字符串。Java在语言中,字符串需要作为对象来处理,可以通过 java.lang 包中的 String 创建字符对象的类别。 在Java语言中字符串必须包含在一对双引号(" ")内部。
“23.23” " ABCDE" “你好”
字符串变量可以通过以下语法格式声明:
String str;
其中 String 指的是该变量为字符串类型,而 str 代表字符串变量的名称。 创建对象应采用类结构方法。String 常用的结构方法如下:
- ① String(char a[ ]) 用一个数组 a 创建 String 对象。
- ② String(char a[ ], int offset, int length) 提取字符数组 a 其中一部分创建了字符串对象。 offset 表示开始截取字符串的位置,length 表示截取字符串的长度。
- ③ String(char [ ] value) 这种结构方法可以分配新的 String 对象表示字符串数组参数中所有元素连接的结果。 除上述使用外 String 类的构造方法来创建字符串变量外,还可以通过字符串常量的引用赋值给一个字符串变量。
3.2 连接字符串
使用 “ ” 运算可以实现连接多个字符串的功能。“ ” 操作符可以连接多个操作符并产生一个 String 对象。
package Chapter5; import java.util.Date; public class Join {
public static void main(String[] args) {
String s1= new String("hello"); //new String("XXX")创建字符串 String s2= new String("world"); String s=s1 " " s2;//利用 可以连接不同的字符串 System.out.println(s); } }
字符串也可以连接到其他基本数据类型。如果将字符串与这些数据类型的数据连接起来,这些数据将直接转换为字符串。
public class Join {
public static void main(String[] args) {
System.out.println("I like" "+
"java");//可以换行写,但是得注意引号的位置
System.out.println("我每天花费"+booktime+"小时看书; "+
(practice+booktime)+"小时上机练习。");
}
}
3.3 获取字符串信息
使用 length( ) 的方法可以获得字符串长度。
str.length( );
String 类提供了两种字符串查找的方法,即 indexOf( ) 方法和 lastIndexOf( ) 方法。这两种方法都允许字符串中搜索指定条件的字符或字符串。indexOf( ) 方法返回的是搜索的字符或字符串首次出现的位置,lastIndexOf( ) 方法返回的是搜索字符或字符串最后一次出现的位置。
public class Join {
public static void main(String[] args) {
String str="We are students ";
int size=str.lastIndexOf("");
System.out.println("字符串的长度为:"+str.length());
System.out.println("去除空格后的字符串长为:"+str.trim().length());
System.out.println("空字符在字符串中的位置是:"+size);
System.out.println("字符串str中索引位置是5的字为:"+str.charAt(5));
}
}
使用 charAt( ) 方法可以将指定索引位置的字符返回。语法为:
str.charAt(int index)
其中 index 为指定索引的位置。代码在上述已经给出。
3.4 字符串操作
通过 String 类的 substring( ) 方法可对字符串进行截取。这些方法的共同点就是都利用字符串的下标进行截取,且应明确字符串的下标是从0开始的。 substring( ) 方法被两种不同的方法重载,来满足不同的需要。
- ① substring(int beginIndex)
- ② substring(int beginIndex, int endIndex)
public class Join {
public static void main(String[] args) {
String str="We are students ";
String substr=str.substring(2, 5);
System.out.println("截取后的字符段为:"+substr);
}
}
trim( ) 方法返回字符串的副本,忽略前导空格和尾部空格。具体用法和代码前述已经给出。
System.out.println("去除空格后的字符串长为:"+str.trim().length());
replace( ) 方法可实现将指定的字符或字符串替换成新的字符或字符串。语法如下:
str. replace(char oldChar, cahr newChar)
replace( ) 方法返回的结果是一个新的字符串。如果字符串 oldChar 没有出现在该对象表达式中的字字符串序列中,则将原字符串返回。 startsWith( ) 方法与 endsWith( ) 方法分别用于判断字符串是否以指定的内容开始或结束。这个两个方法的返回值都是 boolean 类型。
- ① startsWith( ) 方法 该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:
str.startsWith(String prefix)
其中,prefix 是指作为前缀的字符。
- ② endsWith( ) 方法 该方法用于判断当前字符串是否为以给定的子字符串结束。语法如下:
str.endsWith(String suffix)
其中,suffix 是指作为后缀的字符串。
public class Join {
public static void main(String[] args) {
String str="We are students ";
System.out.println("更换后的字符串为:"+str.replace("a", "A"));
boolean b1=str.startsWith("W");
boolean b2=str.endsWith("S");
System.out.println("字符串是以W开头的吗:"+b1);
System.out.println("字符串是以S开头的吗:"+b2);
}
}
对字符串对象进行比较不能简单地使用比较运算符 “==” ,因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回 false。 因此,要比较两个字符串内容是否相等,应使用 equals( ) 方法和 equalsIgnoreCase( ) 方法。
- ① equals( ) 方法 如果两个字符串具有相同的字符和长度,则使用 equals( ) 方法进行比较时,返回 true。 语法如下:
str.equals(String otherstr)
其中,str、otherstr 是要比较的两个字符串对象。
- ② equalsIgnoreCase( ) 方法 使用 equals( ) 方法对字符串进行比较时是区分大小写的,而使用 equalsIgnoreCase( ) 方法是在忽略了大小写的情况下比较两个字符串是否相等,返回结果仍为 boolean 类型。语法如下:
str.equalsIgnoreCase(String otherstr)
其中,str、otherstr 是要比较的两个字符串对象。
public class Join {
public static void main(String[] args) {
String str="We are students ";
String str1="WE ARE STUDENTS";
boolean b3=str.equals(str);//区分大小写
boolean b4=str.equalsIgnoreCase(str1);//不区分大小写
System.out.println("字符串str和str1是否相等:"+(b3));
System.out.println("字符串str和str1是否相等:"+(b4));
}
}
compareTo( ) 方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的 Unicode 值,按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较,如果按照字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数;如果按照字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为0。语法如下:
str.compareTo(String otherstr)
System.out.println("a "+ "compareTo"+ " b"+":"+a.compareTo(b));
其中,str、otherstr 为两个要比较的对象。 compareTo( ) 方法只有在 equals(Object) 方法返回 true 时才返回0。 字符串的 toLowerCase( ) 方法可将字符串中的所有字符从大写字符改为小写字母,而 toUpperCase( ) 方法可将字符串中的小写字符改为大写字符。
- ① toLowerCase( ) 方法 该方法将 String 转换为小写。如果字符串中没有应该被转换的字符,则将原字符返回;否则将返回一个新的字符串,将原字符串中每个该进行小写转换的字符都转换为等价的小写字符。字符长度与原字符长度相同。语法如下:
str.toLowerCase( )
- ② toUpperCase( ) 方法 该方法将 String 转换为大写。如果字符串中没有应该被转换的字符,则将原字符返回;否则将返回一个新的字符串,将原字符串中每个该进行大写转换的字符都转换为等价的大写字符。字符长度与原字符长度相同。语法如下:
str.toUpperCase( )
其中 str 为待转换的字符串。
public class UpAndLower{
public static void main(String args[]){
String str=new String("abc DEF");
String newstr1=str.toLowerCase();
String.newstr2=str.toUpperCase();
System.out.println(newstr1);
System.out.println(newstr2);
}
}
使用 split( ) 方法可以使字符串按指定的分割字符或者字符串对内容进行分割,并将分割后的结果存放在字符串数组中。 split( ) 方法提供了以下两种字符串分割形式。
str.split(String sign) str.split(String sign, int limit)
其中 sign 为分割字符的分割符,也可以使用正则表达式。而 limit 为模式匹配次数,如果设置的值为 n,那么将根据正则表达式匹配 n-1 次,得到的结果数组的长度不会大于 n,数组的最后一项是最后匹配的分割符以后的全部内容。
3.5 格式化字符串
String 类的静态 format( ) 法用于创建格式化的字行申。forma( ) 方法有两种重载形式。 (1) format(String format, Object…args) 该方法使用指定的格式宇符串和参数返回一个格式化字行串,格式化后的新字符串使用本地默认的语言环境。如法如下:
str.format(String format, Object…args)
(2) format(Local 1, String format, Object…args)
- 1:格式化过程中要应用的语言环境。如果1为 null,则不进行本地化。
- 首先来看返回一个月中的天数,实例代码如下:
Date date=new Date();
String s= String.format("%te",date);
常用的日期格式化转换符为: %te: 一个月中的某一天(1~31),如 2; %tb: 指定语言环境的月份简称,如 Feb(英文),二月(中文); %tB: 指定语言环境的月份全称; %tA: 指定语言环境的星期几全称; %ta: 指定语言环境的星期几简称; %tc: 包含全部日期和时间信息; %tY: 4位年份,如 2008; %tj: 一年中的第几天,如 085; %tm: 月份,如 04; %td: 一个月中的第几天,如 025; %ty: 2位年份,
import java.util.Date;
public class Eval{
public static void main(String args[]){
Date date=new Date();
String year=String.format("%tY",date);
String month=String.format("%tB",date);
String day=String.format("%td",date);
System.out.println("今年是:"+year+"年");
Syetem.out.println("现在是:"+month+"月");
Syetem.out.println("今天是:"+day+"号");
}
}
- 时间格式化的转换符主要如下所示:
- 常见的格式如下: %tF: "年-月-日"格式(4位年份),如2022-06-02; %tD: "月/日/年"格式(2位年份),如06/02/22; %te: 全部日期和时间信息; %tr: "时:分:秒 PM(AM)"格式(12时制),如03:22:06 下午; %tT: "时:分:秒"格式(24时制),如15:23:50; %tR: "时:分"格式(24时制),如15:23。
常规类型的格式化可应用于任何参数类型。 %tb、%tB:结果被格式化为布尔类型; %th、%tH:结果被格式化为散列码; %ts、%tS:结果被格式化为字符串类型; %tc、%tC:结果被格式化为字符类型; %d:结果被格式化为十进制类型; %o:结果被格式化为八进制类型; %x、%X:结果被格式化为十六进制类型; %e:结果被格式化为科学计数表示的十进制数; %a:结果被格式化为带有效位数和指数的十六进制浮点数; %n:结果为特定于平台的行分割符; %%:结果为字面值%。
3.6 使用正则表达式
正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一个格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符。正则表达式中元字符及意义如下:
元字符 | 正则表达式中的写法 | 意义 |
---|---|---|
. | . | 表示任意一个字符 |
\d | \d | 代表0~9的任何一个数字 |
\D | \D | 代表任何一个非数字字符 |
s | \s | 代表空白字符,如"\t",“\n” |
S | \S | 代表非空白字符 |
w | \w | 代表可用作标识符的字符,但不包括"$" |
W | \W | 代表不可用于标识符的字符 |
\p{Lower} | \p{Lower} | 代表小写字母a~z |
\p{Upper} | \p{Upper} | 代表大写字母A~Z |
\p{ASCII} | \p{ASCII} | ASCII字符 |
\p{Alpha} | \{Alpha} | 字母字符 |
\p{Digit} | \p{Digti} | 十进制数,即0~9 |
\p{Almum} | \p{Almum} | 数字或字母字符 |
\p{Punct} | \p{Punct} | 标点符号 |
\p{Graph} | \p{Graph} | 可见字符 |
\p{print} | \p{print} | 可打印字符 |
\p{Black} | \p{Black} | 空格或制表符 |
\p{Cntrl} | \p{Cntrl} | 控制字符 |
在正则表达式中可以使用括号括起若干字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。 在正则表达式中允许使用限定修饰符来限定元字符出现的次数。常见的限定修饰符如下表所示:
限定修饰符 | 意义 | 示例 |
---|---|---|
? | 0次或者1次 | A? |
* | 0次或者多次 | A* |
+ | 1次或者多次 | A+ |
{n} | 正好出现n次 | A{2} |
{n,} | 至少出现n次 | A{2,} |
{n,m} | 出现n~m次 | A{2,3} |
- 字符串生成器 StringBuilder
第四部分 数组
数组是具有相同类型的一组数据的集合。在Java中将数组看作为一个对象。
4.1 一维数组的创建和使用
一维数组实质上是一组相同类型数据的线性集合。 数组作为对象允许使用new关键字进行内存分配。在使用数组前,需要先定义数组变量所属的类型。
数组元素类型 数组名字[ ]; 数组元素类型[ ] 数组名字;
int arr[];
String str[];
然后再为数组分配内存空间:
数组名字 = new 数组元素的类型[数组元素的个数];
int arr=new int[5];
int month= new int[12];
- 数组的初始化可分别初始化数组中的每个元素。
int arr1=new int[]{
1,2,3,4,5};
int arr2={
1,2,3,4,6};
public class shuzu {
public static void main(String[] args) {
int Day[]=new int[] {
31,28,31,30,31,30,31,31,30,31,30,31};
for(int j=0;j<12;j++) {
System.out.println((j+1)+"月有"+Day[j]+"天");
}
}
}
4.2 二维数组的创建和使用
- 先声明,再弄new运算符进行内存分配。
//直接位每一维分配内存空间
a=new int[2][4];
//分别为每一位分配内存空间
a=new int[2][];
a[0]=new int[2];
a[1]=new int[3];
type arrayname[][]={value 1,value 2,…,value n}
public class shuzu {
public static void main(String[] args) {
int a[][]=new int[3][4];//二维数组
for(int i=0;i<a.length;i++) {
for(int j=0;j<a[i].length;j++) {
System.out.print(a[i][j]);
}
System.out.println();
}
}
}
4.3 数组的基本操作
- 数组遍历就是获取数组中的每个元素。通常遍历数组都是用for循环来实现。遍历二维数组需要使用双层for循环,通过数组的 length 属性可获得数组的长度。
public class shuzu {
public static void main(String[] args) {
int a[][]=new int[3][4];//二维数组
for(int i=0;i<a.length;i++) {
for(int j=0;j<a[i].length;j++) {
System.out.print(a[i][j]);
}
System.out.println();
}
}
}
在遍历数组时,使用 foreach 语句会更简单。
public class Tautog{
//创建类
public static void main(String[] args){
//主方法
int arr2[][]={
{
4,3},{
1,2}}; //定义二维数组
System.out.println("数组中的元素是:"); //提示信息
int k=0; //外层循环计数器变量
for(int x[]:arr2) {
//外层循环变量为一维数组
k++; //外层循环计数器递增
int j=0; //内层循环计数器
for(int e:x) {
//循环遍历每一个数组元素
j++; //内存计数器递增
if(k==arr2.length&&j==x.length) {
//判断变量是二维数组中的最后一个元素
System.out.println(e); //输出二维数组的最后一个元素
}
else //如果不是二维数组中的最后一个元素
System.out.print(e+"、"); //输出信息
}
}
}
}
- 数组中的元素定义完成后,可通过Arrays类的静态方法 fill( ) 来对数组中的元素进行替换。该方法通过各种重载的形式可完成对任意类型的数组元素的替换。
- 该方法可以将指定的 int 值分配给 int 型数组的每个元素。其中: ① 表示要进行元素替换的数组。 ② 要存储数组中所有原色的值。
import java.util.Arrays; public class Swap{ public static void main(String[] args){ int arr[]=new int[5]; Arrays.fill(A, 8