8.String
8.2String
String类代表字符串,Java中所有的字符串文字都被实现为此类的实例,也就是说,Java中所有的双引号字符串,都是String类的对象。
字符串特点:字符串不可变,它们的值在创建后不能被更改。虽然String的值是不可变的,但是它们可以被共享。字符串效果上相当于字符数组(char【】),但底层原理是字节数组(byte【】)。
8.2.1String 构造方法
- public String():创建一个空白字符串对象,不含有任何内容。
- public String(char[] chs):根据字符数组的内容来创建字符串对象
- public String(byte[] bys):根据字节数组的内容来创建字符串对象
- String s=“abc”; :直接赋值的方式创建字符串对象,内容就是abc。
8.2.2String 对象的特点
- 通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址不同。
- 以双引号“ ”方式给出的字符串,只要字符串序列相同(即顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池中维护。
8.2.3.字符串的比较
equls和==的区别就在此
public Boolean equls(Obiect anObject):将此字符串与指定对象进行比较。由于我们是比较的字符串对象,所以参数直接传递一个字符串。
equls方法源码:
public boolean equals(Object obj) {
return (this == obj);
}
由上可见,equls在未重写时是与==相同的,而连等“= =”比较基本类型时是比较基本类型的值,比较引用类型则是比较在栈内存中的地址。
equls不能被用来比较基本类型,它只能用于比较引用类型,因此在被引用的类中经常需要重写equls方法。
equls比较字符串的内容,而==比较的是字符串在栈内存中的地址。
//登录功能
public class test {
public static void main(String[] args) {
String username = "liuliyue";
String password = "woaini";
for (int i = 0; i < 3; i++) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入账户");
String name = sc.nextLine();
System.out.println("请输入密码");
String pswd = sc.nextLine();
if (name.equals(username) && pswd.equals(password)) {
System.out.println("登录成功");
} else {
if (2 - i == 0) {
System.out.println("你的账户已被锁定,请与管理员联系。");
}
System.out.println("登录失败,你还有" + (2 - i) + "次机会");
}
}
}
}
//遍历字符串数组
public class test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串");
String line=sc.nextLine();
for (int i=0;i<line.length();i++){
System.out.println(line.charAt(i));
}
}
}
在判断字符串的字符属于字母(大小写)或是数字时,我们采用对象比较值的办法,例如:
- 大写字母:ch>=‘A’&&ch<=‘Z’;
- 小写字母:ch>=‘a’&&ch<=‘z’;
- 数字:ch>=‘0’&&ch<=‘9’;
//统计字符次数
public class test {
public static void main(String[] args) {
//键盘录入一个字符串用Scanner实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串");
String line = sc.nextLine();
int bigcount = 0;
int smallcount = 0;
int numbercount = 0;
for (int i = 0; i < line.length(); i++) {
char at = line.charAt(i);
if (at >= 'A' && at <= 'Z') {
bigcount++;
} else if (at >= 'a' && at <= 'z') {
smallcount++;
} else if (at >= '0' && at <= '9') {
numbercount++;
}
}
System.out.println("大写字母" + bigcount);
System.out.println("小写字母" + smallcount);
System.out.println("数字" + numbercount);
}
}
//拼接字符串
public class test {
public static void main(String[] args) {
//键盘录入一个字符串用Scanner实现
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串");
String line = sc.nextLine();
String s = arrayToString(line);
System.out.println(s);
}
public static String arrayToString(String line) {
String a = "";
a += "爱你哟";
a += line;
a += "加油哦";
return a;
}
}
8.2.4StringBuilder字符串的拼接
概述:对字符串进行拼接操作时,每一次拼接都会构造一个新的String对象,产生内存浪费。StringBuilder类就是为此而生的。
概念:StringBuilder是一个可变的字符序列,我们可以将它视作一个容器。这里的可变指的是StringBuilder对象中的内容是可变的。
构造方法:
- public StringBuilder() 构造一个空的可变的字符串对象,不含有任何内容
- public StringBuilder(String str) 根据字符串的内容来创建可变的字符串对象。
添加和反转方法
- public StringBuilder append(任意类型) 添加数据,并返回对象本身
- public StringBuilder resverse() 返回相反的字符串序列。
转为String用toString()方法即可。转为StringBuilder使用构造方法StringBuilder(String str)
append()方法用于拼接字符串,split(”参数“)方法用于剪切字符串,参数即剪切的标点