字符串
String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于引用数据量类型,也就是一个对象。java把String类声明为final类,不能被继承。String是不可变字符序列。
String对象是不可变的。String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。
String类型的底层是使用char[]实现的,这个char[]被定义成final类型,这就意味着String一旦被创建它就是不可变的,对字符串的相关操作其实就是对字符数组的操作。除此之外,还定义了一个int类型的hash,用来保存String的hash值。
声明字符串
在Java中字符串必须包含在一对双引号("")之内。例如:
"123"、"ABD"、"你好"
注意:在Java中双引号包围的都是字符串。如"1+2"的结果不是3,而是12。
声明字符串
String str;
注意:声明字符串变量必须初始化才能使用,否则编译器会报“变量未被初始化错误”。
创建字符串
在Java中将字符串作为对象来管理,创建对象要使用类的构造方法。String类的常用构造方法如下:
1、String()
用来创建空字符串的String对象。
String str = new String();
2、String(char[] a)
char[] a = {'g','o','o','d'};
String str = new String(a);
// 等价于
String s = new String("good");
创建字符串对象时可以传递一个字符数组,字符串的长度就是char数组的长度。
3、String(char value[], int offset, int count)
提取字符数组的一部分创建字符串。参数offset表示开始截取字符串的位置,count表示截取字符串的长度。
char[] a = { 's', 't', 'u', 'd', 'e', 'n', 't' };
String str = new String(a, 2, 4);
// 等价于
String s = new String("uden");
4、String(byte[] values)
使用byte数组创建一个字符串对象。
byte[] strb = new byte[]{65,66};
2 String str6 = new String(strb);//相当于String str6 = new String("AB");
5、String(String original)
用已知的字符串value创建一个String对象。
String str2 = new String("asdf");
String str3 = new String(str2);
注意:此时创建了两个字符串对象。String类中使用双引号创建的字符串对象的值会被存放到堆内存中的常量池中,而使用new String()创建的对象的值会被存放到堆内存中。
内存中变量的存储
Java中基本数据类型是被存放在栈内存中的,栈内存的特点是:先进后出。就像手枪的子弹夹一样。而引用数据类型的引用(地址)是存在栈内存中的,值是存在堆内存中的,可以理解为引用数据类型(对象)是在栈内存中存储的是这个值在堆内存中的地址。
使用""声明的字符串会存储到常量池中,常量池中的字符串对象可以共享,例如:
String a = "abc";
String b = "abc";
这个例子中只创建了一个对象,字符串a和字符串b指向的地址相同,都是常量池中的字符串"abc"。
字符串的拼接
Java中使用“+”来拼接字符串,可实现连接多个字符串,并产生一个String对象。
public class Demo {
public static void main(String[] args) {
// 创建一个字符串并赋值
String str1 = "hello";
// 创建一个字符串并赋值
String str2 = "world";
// 拼接一个字符串
String str3 = str1 + " " + str2;
// 打印拼接后的字符串
System.out.println(str3);
}
}
注意:Java中的一句相连的字符串不能分两行来写,如果字符串太长便于阅读,可以使用“+”连接。
连接其他数据类型
字符串也可以与其他数据类型进行连接,如果同其他数据类型连接,则会将其他类型数据转换成字符串。
public class Demo {
public static void main(String[] args) {
// 定义一个字符串
String str = "abc";
// 定义一个整数
int a = 1;
// 相加
String str1 = str + a;
System.out.println(str1);
}
}
注意:只要“+”运算符的一个操作类型是字符串,编译器就会将另外的操作类型转换成字符串形式。
String类中的常用方法
获取字符串信息
1、获取字符串的长度
使用String的length()方法可以获取声明字符串的长度。
String str = "abc";
int lengh = str.length();
str:指定的字符串对象。
返回值:返回指定字符串的长度,返回值是int类型。
2、获取指定字符串的索引位置
String中提供了indexOf()和lastIndexOf()方法来返回指定字符的索引位置,不同的是,indexOf()方法是返回指定字符首次出现的索引位置,而lastIndexOf()方法返回的是最后一次出现的索引位置。
String str = "abcdefgabcdefg";
int index = str.indexOf("g");
int lastIndex = str.lastIndexOf("g");
System.out.println(index+","+lastIndex);
注意:String中的索引的位置是从0开始的,返回值是int类型的,如果lastIndexOf()方法传入的参数是空字符串"",则返回结果和调用length()方法的返回结果相同。
3、获取指定索引位置的字符
使用charAt()方法可获取指定索引处的字符,返回此索引处的字符。
String str = "hello";
char a = str.charAt(3);
System.out.println(a);
注意:如果索引不在此字符串的索引范围,程序执行中会报错。
4、去除字符串中的空格
trim()方法是去除字符串头部和尾部的空格,返回值是一个新字符串。
String str = " hello world ";
String str1 = str.trim();
System.out.println(str1);
注意:trim()方法只会去除字符串头部和尾部的空格,字符串中间的字符不会被去掉。
5、字符串替换
replace()方法可以实现将指定字符或字符串替换成新的字符或字符串。
str.replace(char oldChar,char newChar);
- oldChar:要替换的字符或字符串。
- newChar:用于替换原来字符串的新内容
注意:replace()方法返回的结果是一个新的字符串。如果字符串oldChar没有出现则返回原字符串。
6、判断字符串的开始与结尾
startsWith()方法与endsWitch()方法分别用于判断字符串是否以指定的内容开始和结束的。这两个方法的返回值都是boolean类型。
1)startsWith()方法
该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。
str.startsWith(String prefix);
其中prefix是指作为前缀的字符。
2)endsWith()方法
该方法用于判断当前字符串对象的后缀是否为参数指定的字符串
str.endsWith(String suffix);
其中suffix是指作为后缀的字符。
7、判断字符串是否相等
对于字符串的比较不能使用简单的“==”号来比较,因为比较运算符比较的是两个字符串的地址是否相同,而不是内用相同。不管内容相不相同,只要地址不相同返回的就是false。
String类中提供了比较字符串的方法,equals()方法和equalsIgnoreCase()方法来比较字符串是否相同。
1)equals()方法
如果两个字符串有相同的长度和内容equals就会返回ture,否则false。语法如下:
str.qequals(String otherstr);
其中str和otherstr是要比较的两个字符串对象。
2)equalsIgnoreCase()方法
equals()方法比较时是区分大小写的,equalsIgnoreCase()方法是忽略大小写的情况下比较两个字符串是否相同。语法如下:
str.equalsIgnoreCase(String otherstr);
其中str和otherstr是要比较的两个字符串对象。
8、按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较是基于字符串中各个字符的Unicode值。如果按字典顺序在此String对象位于参数之前,则比较结果为一个负数,反之为正数,如果相等为0。
str.(String otherstr);
其中str和otherstr是要比较的两个字符串对象。
注意:compareTo()方法只有equals(Object)方法返回true时才返回0。
9、字母大小写转换
toLowerCase()方法将字符串中所有字符转为小写,toUpperCase()方法将字符串中所有字符转为大写。
1)toLowerCase()方法,语法如下:
str.toLowerCase();
其中str是要转换的字符串。
2)toUpperCase()方法,语法如下:
str.toUpperCase();
其中str是要转换的字符串。
注意:使用这两个方法时,数字或非字符不受影响。
10、字符串分割
使用split()方法可以实现字符串按指定的的分割字符或字符串对内容进行分割,并将分割后的结果存放在字符串数组中。split()提供了以下两种形式进行字符串的分割。
1)split(String sign)
该方法可以根据给定的分割符对字符串进行拆分。语法如下:
Str.split(String sign);
其中sign为分割字符串的分割符,也可以使用正则表达式。
注意:没有统一的对字符串分割的符号。如果想定义多个分割符,可以使用“|”。例如:",|="表示分割符分别为“,”和“=”。
2)split(String sign,int limit)
该方法可以根据给定的分割符对字符串进行拆分,并限定拆分次数。语法如下:
str.split(String sign,int limit);
- sign:分割字符串的分割符,也可以使用正则表达式。
- limit:限制的分割次数。
格式化字符串
String类的静态format()方法用于创建格式化字符串。format()方法有两种重载形式。
1)format(String format,Object···args)
该方法使用指定的格式字符串和参数返回一个格式化字符串,格式化后的新字符串使用本地默认语言环境。语法如下:
Str.format(String format,Object···args);
- format:格式字符串。
- args:格式字符串中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为0。
2)format(Local l,String format,Object···args)
- l:格式化过程中要应用的语言环境。如果l为null,则不进行本地化。
- format:格式化字符串。
- args:格式字符中由格式说明符引用的参数。如果还有格式说明符以外的参数,则忽略这些额外的参数。此参数的数目是可变的,可以为0。
日期和时间字符串格式化
1、日期格式化
例:
Date date = new Date();// 创建一个Date对象
String s = String.format("%te",date);// 通过format()方法对date进行格式化
s:表示当前日期的天数
%te:是转换符
转换符 | 说明 | 示例 |
%te | 一个月中的某一天(1~31) | 2 |
%tb | 指定语言环境的月份的简称 | Feb(英文)、二月(中文) |
%tB | 指定语言环境的月份的全称 | February(英文)、二月(中文) |
%tA | 指定语言环境的星期几全称 | Monday(英文)、星期一(中文) |
%ta | 指定语言环境的星期几的简称 | Mon(英文)、星期一(中文) |
%tc | 包括全部日期和时间信息 | 星期二 三月 25 13:37:22 CST 2018 |
%tY | 4位年份 | 2018 |
%tj | 一年中的第几天(001~366) | 085 |
%tm | 月份 | 03 |
%td | 一个月中的第几天(01~31) | 02 |
%ty | 2位年份 | 18 |
时间格式化
使用format()方法不仅可以完成日期的格式化,也可以实现时间的格式化。时间格式化转换符要比日期转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒。
转换符 | 说明 | 示例 |
%tH | 2位数字的24时制的小时(00~23) | 14 |
%tI | 2位数字的12时制的小时(01~12) | 05 |
%tk | 2位数字的24时制的小时(0~23) | 5 |
%tl | 2位数字的12时制的小时(1~12) | 10 |
%tM | 2位数字的分钟(000~59) | 05 |
%tS | 2位数字的秒数(000~60) | 12 |
%tL | 3位数字的毫秒数(000~999) | 920 |
%tN | 9位数字的微秒数(000000000~999999999) | 062000000 |
%tp | 指定语言环境下上午或下午标记 | 下午(中文)、pm(英文) |
%tz | 相对于GMT RFC 82 格式的数字时区偏移量 | +0800 |
%tZ | 时区缩写形式的字符串 | CST |
%ts | 1970-01-01 00:00:00至现在经过的秒数 | 1206426646 |
%tQ | 1970-01-01 00:00:00至现在经过的毫秒数 | 1206426737453 |
格式化常见的日期时间组合
格式化日期与时间 的转换符定义了各种日期时间组合的格式。
转换符 | 说明 | 示例 |
%tF | “年-月-日”格式(4位年份) | 2018-05-15 |
%tD | “月/日/年”格式(2位年份) | 03/05/18 |
%tc | 全部日期和时间信息 | 星期二 三月 25 15:20:00 CST 2018 |
%tr | “时:分:秒 PM(AM)”格式(12时制) | 03:22:06 下午 |
%tT | “时:分:秒”格式(24时制) | 15:23:50 |
%tR | “时:分”格式(24时制) | 15:25 |
常规类型格式化
转换符 | 说明 | 示例 |
%b、%B | 结果被格式化布尔类型 | true |
%h、%H | 结果被格式化为散列码 | A05A5198 |
%s、%S | 结果被格式化为字符串类型 | "abcd" |
%c、%C | 结果被格式化为字符类型 | 'a' |
%d | 结果被格式化为十进制整数 | 40 |
%o | 结果被格式化为八进制整数 | 11 |
%x、%X | 结果被格式化为十六进制整数 | 4b1 |
%e | 结果被格式化为用计算机科学计数法表示的十进制数 | 1.700000e+01 |
%a | 结果被格式化为带有效位数和指数的十六进制浮点值 | 0X1.C000000000001P4 |
%n | 结果为特定于平台的行分隔符 | |
%% | 结果为字面值'%' | % |
使用正则表达式
正则表达式通常用于判断语句中,用来检查某一字符串是否满足某一格式。正则表达式是含有一些具有特殊意义字符的字符串,这些特殊的字符称为正则表达式的元字符。
元字符 | 正则表达式中的写法 | 意义 |
. | . | 代表任意一个字符 |
\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} | \\p{Alpha} | 字母字符 |
\p{Digit} | \\p{Digit} | 十进制数字,即0~9 |
\p{Alnum} | \\p{Alnum} | 数字或字母字符 |
\p{Punct} | \\p{Punct} | 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_'{|}~ |
\p{Graph} | \\p{Graph} | 可见字符:[\p{Alnum}\p{Punct}] |
\p{Print} | \\p{Print} | 可打印字符:[\p{Graph}\x20] |
\p{Blank} | \\p{Blank} | 空格或制表符:[\t] |
\p{Cntrl} | \\p{Cntrl} | 控制字符:[\x00-\x1F\x7F] |
注意:在正则表达式中.代表任何一个字符,因此想使用普通意义的.必须使用转义字符。
在正则表达式中允许使用限定修饰符来限定元字符出现的次数。
限定修饰符 | 意义 | 示例 |
? | 0次或1次 | A? |
* | 0次或多次 | A* |
+ | 一次或多次 | A+ |
{n} | 正好出现n次 | A{2} |
{n,} | 至少出现n次 | A{3,} |
{n,m} | 出现n~m次 | A{2,6} |