String类和常量池的概念
java.lang.String类
public final class String extends Object
final类 不能被继承—-防止滥用继承
final方法 能被继承但是不能被重写
该类描述的字符串内容是个常量不可改变,因此可以被共享使用
常量池:
由于String类型描述的字符串内容是常量不可变的,因此java虚拟机将首次出现的字符串放入常量池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,提高了性能
public class StringpoorTest {
public static void main(String[] args) {
String str1="123";
String str2="123";
System.out.println(str1.equals(str2));//重写了equals方法,比较的是内容 true
System.out.println(str1 == str2);//比较的是地址 //true
}
}
常用的构造方法
String()
String(byte[] bytes,int offset,int length)
String(byte[] bytes)
String(char[] value,int offset,int count)
String(char[] value)
String(String original)
public class StringConstructerTest {
public static void main(String[] args) {
String str1=new String();
//""空字符串对象,有对象只是里面没有对象
System.out.println(str1); //""
byte[] bArr={97,98,99,100,101};
String str2=new String(bArr,1,4);
System.out.println("str="+str2);//自动调用toString()方法
// System.out.println(str2);
String str3 = new String(bArr);
System.out.println(str3);//abcde
char[] cArr={'c','b','d','e','c'};
String str4 = new String(cArr, 1, 3);
System.out.println(str4);//bde
String str5 = new String(cArr);
System.out.println(str5);//cbdec
String str6 = new String("1234");
System.out.println(str6);//1234
}
}
String类的笔试考点
常用的成员方法
数组与String类型之间的转换
方法声明 功能介绍
String toString() 返回字符串本身
byte[] getBytes() 将当前字符串内容转换为byte数组并返回
char[] toCharArray() 用于将当前字符串内容转换为char数组并返回
public class StringByteCharTest {
public static void main(String[] args) {
String str1=new String("hello");
System.out.println(str1.toString());
byte[] byt1= str1.getBytes();
// System.out.println(byt1);
for (int i = 0; i < byt1.length; i++) {
System.out.println(byt1[i]);
}
String str2=new String(byt1);
System.out.println(str2);
char[] char1=str2.toCharArray();
for (int i = 0; i < char1.length; i++) {
System.out.println(char1[i]);
}
String str3=new String(char1);
System.out.println(str3);
}
}
字符的获取和使用
方法声明 功能介绍
char charAt(int index) 方法charAt用于返回字符串指定位置的字符。
int length() 返回字符串字符序列的长度
boolean isEmpty() 判断字符串是否为空
public class StringCharTest {
public static void main(String[] args) {
String str1=new String("hello");
int a=str1.length();
System.out.println(a);
for (int i = 0; i <str1.length(); i++) {
System.out.println(str1.charAt(i));
}
//isEmpty()
System.out.println(str1.isEmpty()?"为空":"不为空");
System.out.println(0==str1.length()?"为空":"不为空");
//考点
//"12345"--->int 12345
//方式一
String str2=new String("12345");
int ia=Integer.parseInt(str2);
System.out.println(ia);
//方拾二 ASCII吗
int ib=0;
for (int i = 0; i < str2.length(); i++) {
ib=ib*10+str2.charAt(i)-'0';
}
System.out.println(ib);
//如何实现从整数到字符串
//方法一 valueOf()
String str3=String.valueOf(ib);
//方法二
String str4=""+ib;
}
}
String对象实现回文判断
public class StringJudgeTest {
public static void main(String[] args) {
String str1=new String("上海自来水来自海上");
for (int i = 0; i < str1.length()/2; i++) {
if(str1.charAt(i)!=str1.charAt(str1.length()-1-i)){
System.out.println(str1+"不是会问");
return;
}
}
System.out.println("是回文");
}
}
字符串之间的比较大小
int compareTo(String anotherString) 用于比较调用对象和参数对象的大小关系
int compareToIgnoreCase(String str) 不考虑大小写,也就是’a’和’A’是相等的关系
各种方法的使用
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) 判断字符串是否以参数字符串结尾
案例
提示用户从键盘输入用户名和密码信息,若输入”admin”和”123456”则提示“登录成功,欢迎使用”,否则提示“用户名或密码错误,您还有n次机会”,若用户输入三次后依然错误则提示“账户已冻结,请联系客服人员!”
public class StringEqualsTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
for (int i = 3; i >0; i--) {
System.out.println("请输入账号密码");
String user=sc.next();
String password=sc.next();
if("admin".equalsIgnoreCase(user)&&"123456".equals(password)){
System.out.println("登陆成功,欢迎使用");
break;
}
if(i==1){
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位置开始反向搜索的第一次出现的下标 |
public class StringIndex {
public static void main(String[] args) {
String str=new String("Good Good Study , Day Day Up");
//查找所有出现Day的索引
int pos=str.indexOf("Day");
while(pos!=-1){
System.out.println("Day索引位置为:"+pos);
pos=str.indexOf("Day",pos+1);
}
//优化
pos=0;
while((pos=str.indexOf("Day",pos))!=-1){
System.out.println("Day索引位置为:"+pos);
pos+="Day".length();
}
}
}
子字符串的获取
String subString(int beginIndex,int endIndex) | 返回字符串中从下标beginIndex(包括)开始到endIndex(不包括)结束的子字符串 |
---|---|
String subString(int beginIndex) | 返回字符串中从下标beginIndex(包括)开始到字符串结尾的子字符串 |
提示用户从键盘输入一个字符串和一个字符,输出该字符(不含)后面的所有子字符串。
public class SubStringTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串");
String str=sc.next();
System.out.println("请输入一个字符");
String str1=sc.next();
if(str.contains(str1)){
// System.out.println("包含");
int pos=str.indexOf(str1);
System.out.println(str.substring(pos+1));
}else{
System.out.println("不包含");
}
}
}
正则表达式
正则表达式本质就是一个“规则字符串”,可以用于对字符串数据的格式进行验证,以及匹配、查找、替换等操作。该字符串通常使用^运算符作为开头标志,使用$运算符作为结尾标志,当然也可以省略
boolean matches(String regex) 判断当前正在调用的字符串是否匹配参数指定的正则表达式规则
案例题目
使用正则表达式描述一下银行卡密码的规则:要求是由6位数字组成。
String reg=”\d{6}”;
使用正则表达式描述一下QQ号码的规则:要求是由非0开头的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]”;
String[] split(String regex) | 参数regex为正则表达式,以regex所表示的字符串为分隔符,将字符串拆分成字符串数组 |
---|---|
String replace(char oldChar, char newChar) |
使用参数newChar替换此字符串中出现的所有参数oldChar |
String replaceFirst(String regex, String replacement) |
替换此字符串匹配给定的正则表达式的第一个子字符串 |
String replaceAll(String regex, String replacement) |
将字符串中匹配正则表达式regex的字符串替换成replacement |