String类的概述和使用
String类的概念------------------------------
public final class String
extends Object
implements Serializable , Comparable < String > , CharSequence
java.lang.String类用于描述字符串
IDEA里面按下ctrl+shift+a到帮助里的Find Action…里面,可以搜索很多东西,如里面的Classes里可以搜索源码,如String类的源码
由于java.lang.String够浪,所以不用导包,java.lang.* 是默认导入的,如果你导入了对应的包,那么他不操作,否则默认导入
多个字符"串"起来,就叫字符串,由"abc"双引号引起来的固定数值就是字面值
与直接量类似,也可叫直接量,因为是直接写出来的
直接量是直接写出来的,如直接写出来的整数数据,小数数据等
Java程序中所有的字符串字面值都可以使用该类的对象加以描述,如:“abc”
该类由final关键字修饰,表示该类不能被继承
从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一些空间
因为char两字节,byte一个字节,所以节约空间
该类描述的字符串内容是个常量不可更改,因此可以被共享使用
String str1 = "abc" ;
str1 = "123" ;
package com. lagou. task12 ;
public class StringPoolTest {
public static void main ( String [ ] args) {
String str1 = "abc" ;
String str2 = "abc" ;
System . out. println ( str1 == str2) ;
String str3 = new String ( "abc" ) ;
System . out. println ( str2 == str3) ;
}
}
常量池的概念------------------------------
由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量池中
若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能
常量也是固定不变的数,如直接写的1,1.1等等,都可以叫做常量,即用final修饰的也可叫常量
只要是常量都有常量优化机制,如byte a = 1+2,由优化机制将1+2化成3(编译期操作的哦),赋值给a,当然变量不可以哦
package com. lagou. task12 ;
public class StringExamTest {
public static void main ( String [ ] args) {
String str1 = "hello" ;
String str2 = "hello" ;
String str3 = new String ( "hello" ) ;
String str4 = new String ( "hello" ) ;
System . out. println ( str1 == str2) ;
System . out. println ( str1. equals ( str2) ) ;
System . out. println ( str3 == str4) ;
System . out. println ( str3. equals ( str4) ) ;
System . out. println ( str2 == str4) ;
System . out. println ( str2. equals ( str4) ) ;
System . out. println ( "------------------------------------------------------------" ) ;
String str5 = "abcd" ;
String str6 = "ab" + "cd" ;
System . out. println ( str5 == str6) ;
String str7 = "ab" ;
String str8 = str7 + "cd" ;
System . out. println ( str5 == str8) ;
}
}
常用的构造方法------------------------------
String ( ) ,使用无参方式构造对象得到空字符序列
String ( byte [ ] bytes, int offset, intlength) ,使用bytes数组中下标从offset位置开始的length个字节来构造对象
String ( byte [ ] bytes) ,使用bytes数组中的所有内容构造对象
String ( char [ ] value, int offset, intcount) ,使用value数组中下标从offset位置开始的count个字符来构造对象
String ( char [ ] value) ,使用value数组中的所有内容构造对象
String ( String original) ,根据参数指定的字符串内容来构造对象,新创建对象为参数对象的副本
package com. lagou. task12 ;
public class StringConstructorTest {
public static void main ( String [ ] args) {
String str1 = new String ( ) ;
System . out. println ( "str1 = " + str1) ;
System . out. println ( "----------------------------------------------------" ) ;
byte [ ] bArr = { 97 , 98 , 99 , 100 , 101 } ;
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) ;
}
}
常用的成员方法------------------------------
String toString ( ) ,返回字符串本身
byte [ ] getBytes ( ) ,将当前字符串内容转换为byte 数组并返回
char [ ] toCharArray ( ) ,用于将当前字符串内容转换为char 数组并返回
char charAt ( int index) ,方法charAt用于返回字符串指定位置的字符
int length ( ) ,返回字符串字符序列的长度
boolean isEmpty ( ) ,判断字符串是否为空
package com. lagou. task12 ;
public class StringByteCharTest {
public static void main ( String [ ] args) {
String str1 = new String ( "world" ) ;
System . out. println ( "str1 = " + str1) ;
System . out. println ( "-----------------------------------------------" ) ;
byte [ ] bArr = str1. getBytes ( ) ;
for ( int i = 0 ; i < bArr. length; i++ ) {
System . out. println ( "下标为i的元素是:" + bArr[ i] ) ;
}
String str2 = new String ( bArr) ;
System . out. println ( "转回字符串为:" + str2) ;
System . out. println ( "-----------------------------------------------" ) ;
char [ ] cArr = str1. toCharArray ( ) ;
for ( int i = 0 ; i < cArr. length; i++ ) {
System . out. println ( "下标为" + i + "的字符是:" + cArr[ i] ) ;
}
String str3 = new String ( cArr) ;
System . out. println ( "转回字符串为:" + str3) ;
}
}
package com. lagou. task12 ;
public class StringCharTest {
public static void main ( String [ ] args) {
String str1 = new String ( "hello" ) ;
System . out. println ( "str1 = " + str1) ;
System . out. println ( "字符串的长度是:" + str1. length ( ) ) ;
System . out. println ( "下标为0的字符是:" + str1. charAt ( 0 ) ) ;
System . out. println ( "下标为1的字符是:" + str1. charAt ( 1 ) ) ;
System . out. println ( "下标为2的字符是:" + str1. charAt ( 2 ) ) ;
System . out. println ( "下标为3的字符是:" + str1. charAt ( 3 ) ) ;
System . out. println ( "下标为4的字符是:" + str1. charAt ( 4 ) ) ;
System . out. println ( "----------------------------------------------" ) ;
for ( int i = 0 ; i < str1. length ( ) ; i++ ) {
System . out. println ( "下标为" + i + "的字符是:" + str1. charAt ( i) ) ;
}
System . out. println ( "----------------------------------------------" ) ;
System . out. println ( 0 == str1. length ( ) ? "字符串为空" : "字符串不为空" ) ;
System . out. println ( str1. isEmpty ( ) ? "字符串为空" : "字符串不为空" ) ;
System . out. println ( "----------------------------------------------" ) ;
String str2 = new String ( "12345" ) ;
int ia = Integer . parseInt ( str2) ;
System . out. println ( "转换出来的整数是:" + ia) ;
int ib = 0 ;
for ( int i = 0 ; i < str2. length ( ) ; i++ ) {
ib = ib* 10 + ( str2. charAt ( i) - '0' ) ;
}
System . out. println ( "转换出来的结果是:" + ib) ;
System . out. println ( "----------------------------------------------" ) ;
String str3 = "" + ib;
System . out. println ( "str3 = " + str3) ;
}
}
案例题目------------------------------
判断字符串"上海自来水来自海上"是否为回文并打印"
所谓回文是指一个字符序列无论从左向右读还是从右向左读都是相同的句子
package com. lagou. task12 ;
public class StringJudgeTest {
public static void main ( String [ ] args) {
String str1 = new String ( "上海自来水来自海上" ) ;
System . out. println ( "str1 = " + str1) ;
for ( int i = 0 ; i < str1. length ( ) / 2 ; i++ ) {
if ( str1. charAt ( i) != str1. charAt ( str1. length ( ) - i- 1 ) ) {
System . out. println ( str1 + ":不是回文!" ) ;
return ;
}
}
System . out. println ( str1 + ":是回文!" ) ;
}
}
int compareTo ( String anotherString) ,用于比较调用对象和参数对象的大小关系
int compareToIgnoreCase ( String str) ,不考虑大小写,也就是'a' 和'A' 是相等的关系
案例题目------------------------------
编程实现字符串之间大小的比较并打印
package com. lagou. task12 ;
public class StringCompareTest {
public static void main ( String [ ] args) {
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 ( "hehe" ) ) ;
System . out. println ( str1. compareTo ( "heihei" ) ) ;
System . out. println ( str1. compareTo ( "helloworld" ) ) ;
System . out. println ( str1. compareTo ( "HELLO" ) ) ;
System . out. println ( str1. compareToIgnoreCase ( "HELLO" ) ) ;
}
}
String concat ( String str) ,用于实现字符串的拼接
boolean contains ( CharSequence s) ,用于判断当前字符串是否包含参数指定的内容
String toLowerCase ( ) ,返回字符串的小写形式
String toUpperCase ( ) ,返回字符串的大写形式
String trim ( ) ,返回去掉前导和后继空白的字符串
boolean startsWith ( String prefix) ,判断字符串是否以参数字符串开头
boolean startsWith ( String prefix, int toffset) ,从指定位置开始是否以参数字符串开头
boolean endsWith ( String suffix) ,判断字符串是否以参数字符串结尾
案例题目------------------------------
编程实现上述方法的使用
package com. lagou. task12 ;
public class StringManyMethodTest {
public static void main ( String [ ] args) {
String a = "1" ;
System . out. println ( a. concat ( "2" ) ) ;
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) ;
b1 = str1. contains ( "Some" ) ;
System . out. println ( "b1 = " + b1) ;
System . out. println ( "----------------------------------------------" ) ;
String str2 = str1. toUpperCase ( ) ;
System . out. println ( "str2 = " + str2) ;
System . out. println ( "str1 = " + str1) ;
String str3 = str1. toLowerCase ( ) ;
System . out. println ( "str3 = " + str3) ;
System . out. println ( "str1 = " + str1) ;
String str4 = str1. trim ( ) ;
System . out. println ( "str4 = " + str4) ;
System . out. println ( "----------------------------------------------" ) ;
b1 = str1. startsWith ( "Let" ) ;
System . out. println ( "b1 = " + b1) ;
b1 = str1. startsWith ( " " ) ;
System . out. println ( "b1 = " + b1) ;
b1 = str1. startsWith ( "Let" , 5 ) ;
System . out. println ( "b1 = " + b1) ;
b1 = str1. endsWith ( "See" ) ;
System . out. println ( "b1 = " + b1) ;
b1 = str1. endsWith ( "See!" ) ;
System . out. println ( "b1 = " + b1) ;
}
}
boolean equals ( Object anObject) ,用于比较字符串内容是否相等并返回
int hashCode ( ) ,获取调用对象的哈希码值
boolean equalsIgnoreCase ( String anotherString) ,用于比较字符串内容是否相等并返回,不考虑大小写
如:'A' 和'a' 是相等
案例题目------------------------------
提示用户从键盘输入用户名和密码信息,若输入"admin"和"123456"则提示"登录成功,欢迎使用"
否则提示"用户名或密码错误,您还有n次机会",若用户输入三次后依然错误则提示"账户已冻结,请联系客服人员!"
package com. lagou. task12 ;
import java. util. Scanner ;
public class StringEqualsTest {
public static void main ( String [ ] args) {
String a = "1" ;
System . out. println ( a. hashCode ( ) ) ;
Scanner sc = new Scanner ( System . in) ;
for ( int i = 3 ; i > 0 ; i-- ) {
System . out. println ( "请输入您的用户名和密码信息:" ) ;
String userName = sc. next ( ) ;
String password = sc. next ( ) ;
if ( "admin" . equalsIgnoreCase ( userName) && "123456" . equals ( password) ) {
System . out. println ( "登录成功,欢迎使用!" ) ;
break ;
}
if ( 1 == i) {
System . out. println ( "账户已冻结,请联系客服人员!" ) ;
} else {
System . out. println ( "用户名或密码错误,您还有" + ( i - 1 ) + "次机会!" ) ;
}
}
sc. close ( ) ;
}
}
int indexOf ( int ch) ,用于返回当前字符串中参数ch指定的字符第一次出现的下标
int indexOf ( int ch, int fromIndex) ,用于从fromIndex位置开始查找ch指定的字符
int indexOf ( String str) ,在字符串中检索str返回其第一次出现的位置,若找不到返回- 1
int indexOf ( String str, int fromIndex) ,表示从字符串的fromIndex位置开始检索str第一次出现的位置
int lastIndexOf ( int ch) ,用于返回参数ch指定的字符最后一次出现的下标
int lastIndexOf ( int ch, int fromIndex) ,用于从fromIndex位置开始查找ch指定字符出现的下标
int lastIndexOf ( String str) ,返回str指定字符串最后一次出现的下标
int lastIndexOf ( String str, int fromIndex) ,用于从fromIndex位置开始反向搜索的第一次出现的下标
案例题目------------------------------
编写通用的代码可以查询字符串"Good Good Study, Day Day Up!"中所有"Day"出现的索引位置并打印出来
package com. lagou. task12 ;
public class StringIndexTest {
public static void main ( String [ ] args) {
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) ;
pos = str1. indexOf ( 'G' ) ;
System . out. println ( "pos = " + pos) ;
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) ;
pos = str1. indexOf ( "Day" ) ;
System . out. println ( "pos = " + pos) ;
pos = str1. indexOf ( "Day" , 17 ) ;
System . out. println ( "pos = " + pos) ;
pos = str1. indexOf ( "Day" , 18 ) ;
System . out. println ( "pos = " + pos) ;
System . out. println ( "------------------------------------------------------" ) ;
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) ;
pos = str1. lastIndexOf ( 'G' , 5 ) ;
System . out. println ( "pos = " + pos) ;
pos = str1. lastIndexOf ( 'G' , 6 ) ;
System . out. println ( "pos = " + pos) ;
pos = str1. lastIndexOf ( 'G' , 4 ) ;
System . out. println ( "pos = " + pos) ;
System . out. println ( "------------------------------------------------------" ) ;
pos = str1. lastIndexOf ( "Day" ) ;
System . out. println ( "pos = " + pos) ;
pos = str1. lastIndexOf ( "Day" , 21 ) ;
System . out. println ( "pos = " + pos) ;
pos = str1. lastIndexOf ( "Day" , 20 ) ;
System . out. println ( "pos = " + pos) ;
pos = str1. lastIndexOf ( "Day" , 15 ) ;
System . out. println ( "pos = " + pos) ;
}
}
String substring ( int beginIndex, int endIndex)
返回字符串中从下标beginIndex(包括)开始到endIndex(不包括)结束的子字符串
String substring ( int beginIndex) ,返回字符串中从下标beginIndex(包括)开始到字符串结尾的子字符串
案例题目------------------------------
提示用户从键盘输入一个字符串和一个字符,输出该字符(不含)后面的所有子字符串
package com. lagou. task12 ;
import java. util. Scanner ;
public class SubStringTest {
public static void main ( String [ ] args) {
String str1 = new String ( "Happy Wife, Happy Life!" ) ;
System . out. println ( "str1 = " + str1) ;
String str2 = str1. substring ( 12 ) ;
System . out. println ( "str2 = " + str2) ;
String str3 = str1. substring ( 6 , 10 ) ;
System . out. println ( "str3 = " + str3) ;
System . out. println ( "---------------------------------------------------------" ) ;
System . out. println ( "请输入一个字符串:" ) ;
Scanner sc = new Scanner ( System . in) ;
String str4 = sc. next ( ) ;
System . out. println ( "请输入一个字符:" ) ;
String str5 = sc. next ( ) ;
int pos = str4. indexOf ( str5) ;
System . out. println ( "pos = " + pos) ;
String str6 = str4. substring ( pos+ 1 ) ;
System . out. println ( "获取到的子字符串是:" + str6) ;
}
}
在Java中几乎所有方法都是前面包含,后面不包含
static double random ( ) ,返回0.0 到1.0 的随机数,[ 0.0 ~ 1.0 ) ,包括0.0 ,不包括1.0
实际上String是一个包含了Char数组的类,也是为什么String比较特殊,与Char有联系,由于String非常重要,所以有上面的一些独有的性质,如常量池等等
正则表达式的概念------------------------------
正则表达式本质就是一个"规则字符串",可以用于对字符串数据的格式进行验证,以及匹配、查找、替换等操作
该字符串通常使用^运算符作为开头标志,使用$运算符作为结尾标志,当然也可以省略
正则表达式也称规则表达式,其实也可以说是字符串,只是存在一些规则的操作而已,就比如遇到1变成2等等类似的规则,或者说只能大于6等等类似的规则
正则表达式的规则------------------------------
[ abc] ,可以出现a、b、c中任意一个字符
[ ^ abc] ,可以出现任何字符,除了a、b、c的任意字符
[ a- z] ,可以出现a、b、c、……、z中的任意一个字符
[ a- zA- Z0 - 9 ] ,可以出现a~ z、A ~ Z 、0 ~ 9 中任意一个字符
. ( 这是一个点) = > 任意一个字符(通常不包含换行符),这里需要注意:再split分割. 时,一般需要\\来进行转义,大多数情况下,正则里面的\\除了特殊的字母或者符号(如\\d),一般就是他自己,大多数正则都是如此,当然,不同语言都可能也会不同,因为正则的处理可能不同,再怎么说,这只是正则表达式的一个规定而已
\d,任意一个数字字符,相当于[ 0 - 9 ]
\D ,任意一个非数字字符
\s,空白字符,相当于[ \t\n\xOB\f\r]
\S ,非空白字符
\w,任意一个单词字符,相当于[ a- zA- Z_0 - 9 ] , 包括下划线
\W ,任意一个非单词字符
[ \t\n\xOB\f\r] :\t制表符,\n换行符,\xOb垂直制表符,\f换页符( 将当前位置移到下一页的开头) ,\r回车不换行
String a = "a\nb" ;
System . out. println ( a) ;
boolean matches = a. matches ( "a\nb" ) ;
X ? ,表示X 可以出现一次或一次也没有,也就是0 ~ 1 次
X * ,表示X 可以出现零次或多次,也就是0 ~ n次
X + ,表示X 可以出现一次或多次,也就是1 ~ n次
X { n} ,表示X 可以出现恰好 n 次
X { n,} ,表示X 可以出现至少 n 次,也就是>= n次
X { n,m} ,表示X 可以出现至少 n 次,但是不超过 m 次,也就是>= n并且<= m次
正则表达式相关的方法------------------------------
(regular expression)是正则表达式的全称
boolean matches ( String regex) ,判断当前正在调用的字符串是否匹配参数指定的正则表达式规则
其中regex最好是正则表达式的字符串,当然其他字符串也可以,但通常都是正则表达式的字符串
案例题目------------------------------
使用正则表达式描述一下银行卡密码的规则:要求是由6位数字组成
使用正则表达式描述一下QQ号码的规则:要求是由非0开头的5~15位数组成
使用正则表达式描述一下手机号码的规则:要求是由1开头,第二位数是3、4、5、7、8中的一位,总共11位
描述身份证号码的规则:总共18位
6位数字代表地区,4位数字代表年,2位数字代表月,2位数字代表日期, 3位数字代表个人,最后一位可能数字也可能是X
package com. lagou. task12 ;
import java. util. Scanner ;
public class StringRegTest {
public static void main ( String [ ] args) {
String a = "[0-9]{3}" ;
String b = "122" ;
System . out. println ( a. matches ( b) ) ;
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 ( "请输入您的身份证号码:" ) ;
String str = sc. next ( ) ;
if ( str. matches ( reg) ) {
System . out. println ( "输入字符串的格式正确!" ) ;
break ;
} else {
System . out. println ( "输入字符串的格式错误!" ) ;
}
}
}
}
String [ ] split ( String regex) ,参数regex为正则表达式,以regex所表示的字符串为分隔符,将字符串拆分成字符串数组,但是如果首部是该分隔符,那么认为首部是空数据,而尾部有该分隔符,那么就是直接的去掉,比如, s, s, s, s, ,那么长度就是5 ,即第一个是空数据,而不是没有,即相当于字符串值为""
String replace ( char oldChar, charnewChar) ,使用参数newChar替换此字符串中出现的所有参数oldCharString
replaceFirst ( String regex, String replacement) ,替换此字符串匹配给定的正则表达式的第一个子字符串String
replaceAll ( String regex, String replacement) ,将字符串中匹配正则表达式regex的字符串替换成replacement
package com. lagou. task12 ;
public class StringRegMethodTest {
public static void main ( String [ ] args) {
String str1 = "1001,zhangfei,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) ;
String str8 = str7. replaceAll ( "[a-z]+" , "A" ) ;
System . out. println ( "str8 = " + str8) ;
}
}
当然,正则表达式有很多,比如: