一、基本内容:
1.String类:即字符串类,其主要构造方法为:
String(String Original),把字符串封装成字符串对象;
举例:String s1 = new String(“hello”);
String(char[] value),把字符数组的数据封装成字符串对象;
举例:char[] chs = {‘h’,‘e’,‘l’,‘l’,‘o’};
String s2 = new String(chs);
String(char[] value,int index, int count),从索引index开始把count个字符数组值封装成字符串对象。
举例:char[] chs = {‘h’,‘e’,‘l’,‘l’,‘o’};
String s3 = new String(chs,1,3);
最为简单的一种方法是直接构造法:
举例:String s4 = “hello”;
2.new创建与直接赋值:针对创建的String类的对象,通过构造方法创建的String对象,存放在java虚拟机的堆内存,堆内存里存放的是字符串常量的地址,字符串常量存放在方法区的常量池中;通过直接赋值所创建的对象直接是方法区中的常量池中的字符串常量。而语句(s1==s2)是比较s1和s2中存放的地址,显然不相同,但是s2和s3的地址相同,则会得到true结果。其示意图如下图所示:
3.String类的判断功能:
Object类:是类层次结构的根类,所有的类都直接或者间接继承自Object类;
如果一个方法的形参是Object,那么这里我们就可以传递Object类的任意子类对象;
boolean equals(Object obj):比较字符串的内容是否相同(区分大小写);
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同(忽略大小写);
boolean startsWith(String str):判断字符对象是否以指定的str开头;
boolean endsWith(String str):判断字符对象是否以指定的str结尾;
4.String类运用举例(模拟用户登录):
public class UserLogin {
public static void main(String [] args) {
String username = "hxf1688";
String password = "2e5y8hxf";
for(int i=0; i < 3; i++) {
Scanner sc = new Scanner(System.in); //创建sc为输入类
System.out.println("请输入用户名:");
String user = sc.nextLine();
System.out.println("请输入密码:");
String psw = sc.nextLine();
if(username.equals(user)&&password.equals(psw)) {
System.out.println("登录成功");
break;
}
else {
if(i==2) {
System.out.println("您输入错误次数过多,请联系管理员");
}
else {
System.out.println("输入失败,您还有"+(2-i)+"尝试机会");
}
}
}
}
}
nextLine()方法:
5.String类的获取功能:
int length():获取字符串的长度,也即字符个数;
char charAt(int index):获取指定索引处的字符;
int indexOf(String str):获取字符串str在字符串对象中出现的位置索引,返回str的第一个字符的索引位置;
String substring(int start):从索引start处开始截取字符串,一直到结尾;
String substring(int start, int end):从索引start(包括start)开始截取字符串,到end(不包括end)结束。
6.字符串的遍历:
for(int i=0; i < str.length() ;i++){ //注意这里使用的是str.length(),这是String类中的方法,若str为数组,则使用str.length,这里的length为属性
System.out.println(i);
}
7.统计字符串中大写字符、小写字符、数字字符的个数:
由于英文字母不论大小写和数字,从小到大都有一定顺序,比如统计大写字符,只需判断:ch >= ‘A’ && ch <= ‘Z’,即可。
8.String类的转换功能(将String类转换为字符数组、大小写的转换):
char[] toCharArray(): 把字符串转换为字符数组;
String toLowerCase(): 把字符串转换为小写字符;
String toUpperCase():把字符串转换为大写字符;
练习:将输入的字符串首字母大写,其余为小写!
解题思路:利用字符串截取的方法substring(int start, int end),将首字母与其余字母分别截取到两个字符串中,再将两个字符串拼接。
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
s1 = substring(0,1);
s2 = substring(1);
s3 = s1 + s2;
9.String类的去空格和按照指定符号分割功能:
String trim(): 去除字符串两端空格;
String[] split(String str): 按照指定符号分割字符串;
举例:
String s1 = "aa,bb,cc";
String[] ArrayStr = s1.split("bb");
for(int i=0; i < ArrayStr.length; i++) {
System.out.println(ArrayStr[i]);
}
结果:
aa,
,cc
10.字符串的反转:
例如:输入abc,输出cba;
解法一:将字符串倒着遍历,再将得到的字符拼接成字符串;
解法二:把字符串转换为字符数组,再将字符数组进行反转,再将字符数组转换成字符串;
public static String reverse(String s){ //解法一倒着遍历法
String ss = "";
for(int x = length-1; x > 0; x--){
ss += charAt(x);
}
return ss;
}
public static String reverse(String s){
char[] str = s.toCharArray(); //将字符串转换成字符数组
for(int start = 0,int end = length - 1; start <= end ; start++, end--){ //逐个进行首尾交换
char temp = str[start];
str[start] = str[end];
str[end] = temp;
}
String ss = new String(str); //通过创建对象的方式把字符数组转换成字符串
return ss;
}
11.数组元素按指示格式拼接:
举例:输入:int [] = {1,2,3}; 输出:[1,2,3]
public static String arrayToString(int[] arr){
String s = "";
s += '['; //这里的s += '['也可以使用s += "[",单引号和双引号均可
for(int x=0; x < arr.length; x++){
if(x == arr.length - 1){
s += arr[x];
}
else {
s += arr[x]; //字符串拼接也可以将int型数据拼接成字符串;
s += ", ";
}
}
s += ']';
return s;
}
12.StringBuilder类的概述:
(1)虚拟机角度描述:首先,我们实例化一个String类的字符串对象s,让其存储字符串“hello”,这时s存储的是“hello”的地址(假设在常量池中的地址为001),这时我们运行代码s += “world”,此时“world”会存储在常量池中的地址为002,而字符串“helloworld”则会存储在常量池中的地址003中,并且此时对象s存储的地址为003,即“helloworld”的地址,而此时001和002地址中的常量就浪费了,使用StringBuilder类可以避免拼接字符串时造成的资源浪费这个问题。
(2)StringBuilder类基本属性描述:
String类与StringBuilder类的区别:String类的内容是固定的,StringBuilder类的内容是可变的。
构造方法:
StringBuilder() : 构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符。
StringBuilder(String str) : 构造一个字符串生成器,并初始化为指定的字符串内容,这里如果入参为“helloworld”,则其容量变为16+10 = 26。
成员方法:
public int capacity():返回当前容量。
public int length():返回长度(字符数)。
注意:容量为理论值,长度为实际值。
(3)StringBuilder类的添加方法和反转方法:
添加方法: public StringBuilder append(任意类型)
StringBuilder s1 = StringBuilder(hello);
s2 = s1.append("world");
(s1 == s2) //结果为true
说明s1的内容是可变的,s1和s2指向同一片地址,该地址存储的内容是可变的,从hello变成“helloword”.
另外,append可以将任意类型的值变为字符串:
s1.append("hello");
s1.append("world");
s1.append(true);
s1.append(100);
//输出结果为:helloworldtrue100
s1.append("hello").append("world").append(true).append(100); //链式编程
//因为append返回的是StringBuilder对象,所以可以连续调用append成员方法,输出结果和上面一样。
反转方法:
public StringBuilder reverse();
s1.reverse();
输入:helloworldtrue100
输出:001eurtdleodolleh
(4)StringBuilder类的对象和String类的对象之间相互转化:
StringBuilder转String:StringBuilder类中有一个成员方法为toString()
StringBuilder s1 = new StringBuilder("hello");
String s2 = s1.toString();
String转StringBuilder:直接利用StringBuilder类的构造方法StringBuilder(String str)
String s1 = "hello";
StringBuilder s2 = new StringBuilder(s1);
(5)练习:数组按照格式拼接成字符串:
public String arrayToString(int[] arr){
StringBuilder s1 = new StringBuilder();
s1.append("[");
for(int i=0; i < arr.length; i++){
if(i == arr.length - 1){
s1.append(arr[i]);
}
else {
s1.append(arr[i]).append(", ");
}
}
s1.append("]");
String result = s1.toString();
return result;
}
(6)练习:利用StringBuilder进行字符串反转:
public String toReverse(String s){
StringBuilder s1 = new StringBuilder(s); //首先将String类对象转换成StringBuilder类对象
s1.reverse(); //使用reverse方法
String s2 = s1.toString(); //再将StringBuilder转换成String类对象
}
(7)练习:利用StringBuilder进行对称字符串判断:
public boolean isSymmetry(String s){ //若字符串反转前等于反转后,则认为两个字符串对称
StringBuilder s1 = new StringBuilder(s);
s1.reverse();
String result = s1.toString();
return s.equals(result);
}