1、String类的概念(重点)
- java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描 述,如:"abc"。
- 该类由final关键字修饰,表示该类不能被继承。
- 从jdk1.9开始该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一 些空间。
- 该类描述的字符串内容是个常量不可更改,因此可以被共享使用。
=》如: String str1 = “abc”; - 其中"abc"这个字符串是个常量不可改变。
=》str1 = “123”; - 将“123”字符串的地址赋值给变量str1。
=》- 改变str1的指向并没有改变指向的内容
2、常量池的概念(原理)
- 由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量 池中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对 象,从而提高了性能。
3、常用的构造方法(练熟、记住)
方法声明 | 功能介绍 |
String() | 使用无参方式构造对象得到空字符序列 |
String(byte[] bytes, int offset, int length) | 使用bytes数组中下标从offset位置开始的length个字节来 构造对象 |
String(byte[] bytes) | 使用bytes数组中的所有内容构造对象 |
String(char[] value, int offset, int count) | 使用value数组中下标从offset位置开始的count个字符来构 造对象 |
String(char[] value) | 使用value数组中的所有内容构造对象 |
String(String original) | 根据参数指定的字符串内容来构造对象,新创建对象为参 数对象的副本 |
/**
* @author XiceSberg
* @date 2020/8/2 16:46
* @description
*/
public class StringConstructorTest {
public static void main(String[] args) {
//1、使用无参方式构造对象并打印
String str1=new String();
//""表示空字符串对象,有对象只是里面没用内容
//null表示空,连对象都没有
System.out.println(str1);//为空
//97:a
//使用字节数组中一部分内容来构造对象
byte[] bArr={97,98,99,100,101};
String str2=new String(bArr,1,3);
System.out.println(str2);//bcd
//使用字节数组来构造对象
String str3=new String(bArr);
System.out.println(str3);//abcde
//使用字符数组中的一部分内容构造对象
char[] cArr={'h','e','l','l','o'};
String str4=new String(cArr,2,2);
System.out.println(str4);//ll
//使用整个字符数组构造对象
String str5=new String(cArr);
System.out.println(str5);//hello
//使用字符串来构造字符串对象
String str6=new String("world");
System.out.println(str6);//world
//常量池和堆区对象的对比
//1.请问下面的代码会创建几个对象?分别存放再什么地方?
String str11="hello"; //1个对象 存放再常量池中
String str12=new String("hello");//2个对象 1个在堆区,一个在常量池中
// 栈区(str12) -->(指向) 堆区(new)
// 常量池(hello)--|>(赋值给堆区new)
String str21="hello"; //常量池
String str22="hello"; //常量池
String str23=new String("hello"); //堆区
String str24=new String("hello"); //堆区
System.out.println(str21 == str22); //比较地址 true
System.out.println(str21.equals(str22)); //比较内容 true
System.out.println(str23 == str24); //比较地址 false
System.out.println(str23.equals(str24)); //比较内容 true
System.out.println(str22 == str24); //比较地址 false
System.out.println(str22.equals(str24)); //比较内容 true
System.out.println("-------------------------------");
//常量有优化机制,变量没用
String str31="abcd";
String str32="ab"+"cd";//常量优化机制
System.out.println(str31 == str32); //比较地址 true
String str41="ab";
String str42=str41+"cd";//比较地址 false
}
}
方法声明 | 功能介绍 |
char charAt(int index) | 方法charAt用于返回字符串指定位置的字符。 |
int length() | 返回字符串字符序列的长度 |
boolean isEmpty() | 判断字符串是否为空 |
/**
* @author XiceSberg
* @date 2020/8/2 20:59
* @description
*/
public class StringCharTest {
public static void main(String[] args) {
//采用两种方式把字符串"12345"转换成整型12345
//方式一:调用Integer类中的parseInt
String str1=new String("12345");
int i1=Integer.parseInt(str1);
System.out.println(i1);
//方法二:利用ASCII来实现类型转换
int ib=0;
for (int i = 0; i < str1.length(); i++) {
ib=ib*10+(str1.charAt(i)-'0');
}
System.out.println(ib);
}
}
方法声明 | 功能介绍 |
int compareTo(String anotherString) | 用于比较调用对象和参数对象的大小关系 |
int compareToIgnoreCase(String str) | 不考虑大小写,也就是'a'和'A'是相等的关系 |
- this.charAt(k)-anotherString.charAt(k),字符串比较大小,使用字符串的顺序做对应的索引值的字符串的ASCII码做减法计算
方法声明 | 功能介绍 |
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) | 判断字符串是否以参数字符串结尾 |
String str2=new String(" Let Me Give You Some Color To See See!");
boolean b1=str2.contains("some");
System.out.println(b1); //false 区分大小写
b1=str2.contains("Some");
System.out.println(b1); //true
String str3=str2.toUpperCase();
System.out.println(str3); // LET ME GIVE YOU SOME COLOR TO SEE SEE!
System.out.println(str2); // Let Me Give You Some Color To See See! 常量
String str4=str2.toLowerCase();
System.out.println(str4); // let me give you some color to see see!
String str5=str2.trim();
System.out.println(str5); //Let Me Give You Some Color To See See!
//判断字符串是否以...开头 以...结尾
b1=str2.startsWith("Let");
System.out.println(b1); //false
b1=str2.startsWith(" ");
System.out.println(b1); //true
//从下标5开始,是否以"Let"开头
b1=str2.startsWith("Let",5);
System.out.println(b1); //true
b1=str2.endsWith("See");
System.out.println(b1); //false
b1=str2.endsWith("See!");
System.out.println(b1); //true
方法声明 | 功能介绍 |
boolean equals(Object anObject) | 用于比较字符串内容是否相等并返回 |
int hashCode() | 获取调用对象的哈希码值 |
boolean equalsIgnoreCase(String anotherString) | 用于比较字符串内容是否相等并返回,不考虑大小写, 如:'A'和'a'是相等 |
/**
* @author XiceSberg
* @date 2020/8/3 3:26
* @description
*/
public class StringTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
for(int i=3;i>0;i--)
{
String userName=sc.next();
String userPass=sc.next();
if("admin".equalsIgnoreCase(userName) && "12345".equals(userPass))
{
System.out.println("输入正常");
break;
}
if(i>1)
{
System.out.println("输入错误,还剩"+(i-1)+"次机会");
}else
{
System.out.println("请联系管理员");
}
}
}
}
方法声明 | 功能介绍 |
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 StringTest {
public static void main(String[] args) {
String str1="good good study,day day up";
int pos=str1.indexOf("day");
while (-1 != pos) {
System.out.println(pos);
pos=str1.indexOf("day",pos+1);
}
//优化一下
pos=0;
while ((pos=str1.indexOf("day",pos)) != -1)
{
System.out.println(pos);
pos+="day".length();
}
}
}
4、正则表达式
- 正则表达式本质就是一个“规则字符串”,可以用于对字符串数据的格式进行验证,以及匹配、查找、替换等操作。该字符串通常使用^运算符作为开头标志,使用$运算符作为结尾标志,当然也可以省略。