1.String
- String概述
String类在java.lang包下,所以使用的时候不需要导包
String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都被实现为此类的实例,也就是说,Java程序中所有的双引号字符串,都是String类的对象。
-
字符串的特点
①:字符串不可变,它们的值在创建后不能被更改
②:虽然String的值是不可变的,但是它们可以被共享
③:字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[]).
2.String构造方法
推荐:推荐使用直接赋值的方式得到字符串对象
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容来创建字符串对象 |
public String(byte[]bys) | 根据字节数组的内容,来创建字符串对象 |
String s = “abc” | 直接赋值的方式创建字符串对象,内容就是abc |
// | public String() | 创建一个空白字符串对象,不含有任何内容 |
// | ------------------------- | ----------------------------------------- |
// | public String(char[] chs) | 根据字符数组的内容来创建字符串对象 |
// | public String(byte[]bys) | 根据字节数组的内容,来创建字符串对象 |
// | String s = “abc” | 直接赋值的方式创建字符串对象,内容就是abc |
public class minglei {
public static void main(String[] args) {
// 1. public String() : 创建一个空白字符串对象,不含有任何内容
String s1 = new String();
System.out.println("s1:"+s1);
// 2. public String(char[] chs) : 根据字符数组的内容来创建字符串对象
char [] chs = {'a','b','c'};
String s2 = new String(chs);
System.out.println("s2:"+s2);
// 3. public String(byte[]bys) : 根据字节数组的内容,来创建字符串对象
byte [] bys = {97,98,99};
String s3 = new String(bys);
System.out.println("s3:"+s3);
// 4. String s = “abc” :直接赋值的方式创建字符串对象,内容就是abc
String s4 = "abc";
System.out.println("s4:"+s4);
}
}
3.String对象的特点
- 通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同。
char[] chs = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
上面代码中,JVM会首先创建一个字符串数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相的。
- 以“ ”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会创建一个String对象,并在字符串池中维护。
String s3 = "abc";
String s4 = "abc";
在上面的代码中,针对第一行代码,JVM会建立一个String对象放在字符串池中,并给s3参考,第二行则让s4直接参考字符串池中的String对象,也就是说它们本质上是同一个对象。
public class minglei {
public static void main(String[] args) {
char[] chs = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
System.out.println(s1 == s2);
//结果为false,因为new一个对象就会分配一个地址,所以s1和s2的地址值不同
String s3 = "abc";
String s4 = "abc";
System.out.println(s3 == s4);
//结果为true,使用" "方法时,“ ”中的字符串相同时(顺序和大小写都相同时),系统会只给分配一个地址值
System.out.println(s1 == s4);
}
}
4.字符串的比较
- 使用==做比较
①:基本类型:比较的是数据值是否相同
②:引用类型:比较的是地址值是否相同
- 字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()
①:public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串
public class minglei {
public static void main(String[] args) {
//构造方法创建对象
char[] chs = {'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);
//赋值方法创建对象
String s3 = "abc";
String s4 = "abc";
//比较地址值
System.out.println(s1 == s2);
System.out.println(s3 == s4);
System.out.println(s4 == s1);
//比较字符串内容是否相同
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s4));
System.out.println(s4.equals(s1));
}
}
/*结果:
false
true
false
true
true
true
Process finished with exit code 0*/
1.案例:用户登录
需求:已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示。
import java.util.Scanner;
public class minglei {
public static void main(String[] args) {
//已有的账号和密码
String userName = "123456";
String passWord = "000001";
Scanner sc = new Scanner(System.in);
System.out.println("注意:用户名和密码只能输错3次");
for (int i=0 ; i<=3 ; i++) {
//处理三次全错的情况
if(i==3){
System.out.println("三次输入全错,账号锁死");
break;
}
//第一次输入的时候,不提示剩余输入次数
if(i==0){
//输入用户名和密码
System.out.println("请输入用户名:");
String s1 = sc.nextLine();
System.out.println("请输入用户密码:");
String s2 = sc.nextLine();
//判断是否登录成功
if (userName.equals(s1)&&passWord.equals(s2)){
System.out.println("登录成功");
break;
}else {
System.out.println("登录失败,您的用户名或密码错误,请重新输入");
}
}else {
//第一次以后输入的情况,提示剩余输入次数
//输入用户名和密码
System.out.println("剩余输入次数"+(3-i)+"次,请再次输入用户名:");
String s1 = sc.nextLine();
System.out.println("剩余输入次数"+(3-i)+"次,请再次输入用户密码:");
String s2 = sc.nextLine();
if (userName.equals(s1)&&passWord.equals(s2)){
System.out.println("登录成功");
break;
}else {
//区别最后一次输入和前几次登录失败的情况---最后一次登录成败不提示请重新输入
if(i==2){
System.out.println("登录失败,您的用户名或密码错误");
}else {
System.out.println("登录失败,您的用户名或密码错误,请重新输入");
}
}
}
}
}
}
2.遍历字符串
需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串。
提示:public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的。
字符串的长度:public int length():返回此字符串的长度
① 字符串对象.length()
import java.util.Scanner;
public class stringTtraversal {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
for(int i = 0;i<line.length();i++){
System.out.println(line.charAt(i));
}
}
}
3.案例:统计字符次数
需求:键盘录入一个字符串,统计该字符串中大小写字母字符,数字字符出现的次数(不考虑其他字符)
①:判断该字符属于哪种类型,直接判断该字符是否在对应范围即可----例、大写字母:ch>=’A’&&ch<=’Z’
小写字母:ch>=‘a’&&ch<=‘z’
数字:ch>=‘0’&&ch<=‘9’
import java.util.Scanner;
public class stringTtraversal {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
int uppercase =0;//记录大写字母个数
int b =0;//记录小写字母个数
int number =0;//记录数字个数
//循环遍历字符串
for(int i = 0;i<line.length();i++){
char a = line.charAt(i);
//计算各种字符的个数
if (a>='a'&&a<='z'){
b++;
}
else if (a>='A'&&a<='Z'){
uppercase++;
}
else if(a>='0'&&a<='9'){
number++;
}
}
//输出各种字符个数
System.out.println("大写字母一共有:"+uppercase+"个");
System.out.println("小写字母一共有:"+b+"个");
System.out.println("数字一共有:"+number+"个");
}
}
4.案例:拼接字符串
需求:定义一个方法,把int数组中的数据按照指定格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如、数组int[]arr={1,2,3};,执行方法后输出结果为:{1,2,3}
public class stringTtraversal {
public static void main(String[] args) {
int []arr = {1,2,3};
String a=ArrToString(arr);
System.out.println(a);
}
//定义拼接方法
public static String ArrToString(int []arr){
String s ="";
s+='{';
for (int i=0;i<arr.length;i++){
if (i==arr.length-1){
s+=arr[i];//最后一个字符后面不带逗号
}else {
s+=arr[i];
s+=',';//除了最后一个字符外,其他字符后面都带逗号
}
}
s+='}';
return s;
}
}
5.案例:字符串反转
需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果。例如、键盘录入abc,输出结果cba。
import java.util.Scanner;
public class stringTtraversal {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String s = rollback (line);
System.out.println(s);
}
public static String rollback(String L){
//定义一个字符串存储反转过来的字符串L
String l ="";
//从后往前遍历字符串L,并逐个赋值给l,以实现反转
for (int i=L.length()-1;i>=0;i--){
l+=L.charAt(i);
}
//返回反转好的字符串
return l;
}
}