3.1 String字符串

1.String概述:

java.lang.String类代表字符串,java程序中的所有字符串文字(例如”abc”)都为此类的对象
String是java定义好的一个类,定义在java.lang包中,所以使用的时候不需要导包

2.String注意点:

字符串的内容是不会发生改变的,它的对象在创建后不能被更改

3.创建String对象的两种方式

1. 直接赋值 ——- String name = “IT梦”;
2. new(构造方法)

图片[1]-3.1 String字符串-IT熊技术站

代码演示:

public class IT梦 {  
	public static void main(String[] args) {  
		//直接赋值  
		String s1 = "IT梦";  
		//使用new的方式获取字符串的对象  
		//空参构造  
		String s2 = new String();  
		System.out.println("IT" + s2 + "梦");  
		//传递一个字符串,根据传递的字符串内容创建一个新的字符串  
		String s3 = new String("abc");  
		System.out.println(s3);  
		//传递一个字符数组,根据字符数组的内容创建一个新的字符串  
		char[] arr = {'a','b','c','d'};  
		String s4 = new String(arr);  
		System.out.println(s4);  
		//传递一个字节数组,根据字节数组的内容创建一个新的字符串  
		byte[] arr1 = {97,98,99,100};  
		String s5 = new String(arr1);  
		System.out.println(s5);  
	}  
}

图片[2]-3.1 String字符串-IT熊技术站

String的内存模型:

1.直接赋值:

图片[3]-3.1 String字符串-IT熊技术站

总结:当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在
不存在:创建新的
存在:复用

2.new

图片[4]-3.1 String字符串-IT熊技术站

字符串比较:

在比较开始之前,我们先考虑一个问题 ——  == 号比的到底是什么?
基本数据类型:比较的是具体的数据值
引用数据类型:比较的是地址值

代码演示:

public class IT梦 {  
	public static void main(String[] args) {  
		String s1 = "abc";  
		String s2 = "abc";  
		if(s1 == s2){  
			System.out.println("true");  
		}else {  
			System.out.println("false");  
		}  
		String s3 = "abcd";  
		String s4 = new String("abcd");  
		if(s3 == s4){  
			System.out.println("true");  
		}else {  
			System.out.println("false");  
		}  
	}  
}

图片[5]-3.1 String字符串-IT熊技术站

字符串内容的比较:

1. boolean equals(要比较的字符串)                完全一样结果为true,否则为false(不忽略大小写)
2. boolean equalsIgnoreCase(要比较的字符串)            一样为true,否则为false(忽略大小写)

代码演示:

public class IT梦 {  
	public static void main(String[] args) {  
		String s1 = "abc";  
		String s2 = "ABC";  
		boolean flag1 = s1.equals(s2);  
		boolean flag2 = s1.equalsIgnoreCase(s2);  
		System.out.println(flag1);  
		System.out.println(flag2);  
	}  
}

图片[6]-3.1 String字符串-IT熊技术站

遍历字符串:

1. public char charAt(int index):根据索引返回字符
2. public int length():返回此字符串的长度
3. 字符串的长度:字符串对象.length()

截取:

1.String substring(int beginIndex,int endIndex):从第一个索引开始截取到第二个索引结束
注意点:包头不包尾,包左不包右
只有返回值才是截取的字符串,原先的字符串不会改变
2.String substring(beginIndex):从索引开始截取到末尾

替换:

1.String replace(旧值,新值):将旧值替换成新值
注意点:只有返回值是替换后的结果,原先的字符串不会改变

练习:

1.用户登录:

需求:已知正确的用户名和密码,请用程序实现模拟用户登录
总共给三次机会,登录之后,给出相应的提示

答案:

[content_hide]

import java.util.Scanner;  
  
public class IT梦 {  
	public static void main(String[] args) {  
		//正确的用户名和密码  
		String TrueUserID = "IT梦001";  
		String TrueUserPassword = "qwer1234";  
		Scanner sc = new Scanner(System.in);  
		for (int i = 2; i >= 0; i--) {  
			System.out.println("请输入用户名");  
			String userID = sc.next();  
			System.out.println("请输入密码");  
			String userPassword = sc.next();  
			boolean flagID = TrueUserID.equals(userID);  
			boolean flagPassword = TrueUserPassword.equals(userPassword);  
			if(flagID && flagPassword){  
				System.out.println("登陆成功");  
				break;  
			}else{  
				if(i == 0){  
					System.out.println("登录次数已用完,账户" + userID + "被冻结");  
				}else {  
					System.out.println("用户名或密码错误,还剩下" + i + "次机会");  
				}  
			}  
		}  
	}  
}

图片[7]-3.1 String字符串-IT熊技术站

[/content_hide]

2.统计字符个数:

键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符分别有几个(不考虑其他字符)

答案:

[content_hide]

import java.util.Scanner;  
  
public class IT梦 {  
	public static void main(String[] args) {  
		Scanner sc = new Scanner(System.in);  
		System.out.println("请输入一个字符串");  
		String s = sc.next();  
		int bigCount = 0;  
		int smallCount = 0;  
		int numberCount = 0;  
		for (int i = 0; i < s.length(); i++) {  
			char c = s.charAt(i);  
			if(c >= 'A' && c <= 'Z'){  
				bigCount++;  
			} else if (c >= 'a' && c <= 'z') {  
				smallCount++;  
			} else if (c >= '0' && c <= '9') {  
				numberCount++;  
			}  
		}  
		System.out.println("大写字母一共有" + bigCount + "个");  
		System.out.println("小写字母一共有" + smallCount + "个");  
		System.out.println("数字一共有" + numberCount + "个");  
	}  
}

图片[8]-3.1 String字符串-IT熊技术站

[/content_hide]

3.拼接字符串

定义一个方法,把int数组的数组按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
例:数组为int [] arr = {1,2,3};
执行方法后的输出结果为:[1,2,3,]

答案:

[content_hide]

public class IT梦 {  
	public static void main(String[] args) {  
		int[] arr = {1,2,3,4,5};  
		String s = arrToString(arr);  
		System.out.println(s);    
	}  
	public static String arrToString(int[] arr){  
		if(arr == null){  
			return "";  
		}  
		if(arr.length == 0){  
			return "[]";  
		}  
		String result = "[";  
		for (int i = 0; i < arr.length; i++) {  
			if(i == arr.length - 1){  
				result = result + arr[i];  
			}else {  
				result = result + arr[i] + ",";  
			}  
		}  
		result = result + "]";  
		return result;  
	}  
}

图片[9]-3.1 String字符串-IT熊技术站

[/content_hide]

4.字符串反转

定义一个方法,实现字符串反转,键盘录入一个字符串,调用该方法后,在控制台输出结果
例:键盘录入abc,输出结果cba

答案:

[content_hide]

import java.util.Scanner;  
  
public class IT梦 {  
	public static void main(String[] args) {  
		Scanner sc = new Scanner(System.in);  
		System.out.println("请输入一个字符串");  
		String s = sc.next();  
		String result = reversal(s);  
		System.out.println(result);  
	}  
	public static String reversal(String s){  
		String result = "";  
		for (int i = s.length() - 1; i >= 0; i--) {  
			char c = s.charAt(i);  
			result = result + c;  
		}  
		return result;  
	}  
}

图片[10]-3.1 String字符串-IT熊技术站

[/content_hide]

5.金额转换

键盘录入一个七位数的金额,将他改成中文大写的格式
例:2018元——–>零佰零拾零万贰仟零佰壹拾捌元

答案:

[content_hide]

import java.util.Scanner;  
  
public class IT梦 {  
	public static void main(String[] args) {  
		Scanner sc = new Scanner(System.in);  
		int money;  
		System.out.println("请输入一个七位数的金额");  
		while (true){  
			money = sc.nextInt();  
			if(money >= 0 && money <= 9999999){  
				break;  
			}else {  
				System.out.println("金额不正确,请重新输入");  
			}  
		}  
		String capsNumber = "";  
		while (true) {  
			int ge = money % 10;  
			String number = getCapitalNumber(ge);  
			money = money / 10;  
			capsNumber = number + capsNumber;  
			if(money == 0){  
				break;  
			}  
		}  
		int count = 7 - capsNumber.length();  
		for (int i = 0; i < count; i++) {  
			capsNumber = "零" + capsNumber;  
		}  
		String[] unitArr = {"佰","拾","万","仟","佰","拾","元"};  
		String result = "";  
		for (int i = 0; i < capsNumber.length(); i++) {  
			char c = capsNumber.charAt(i);  
			result = result + c + unitArr[i];  
		}  
		System.out.println(result);  
	}  
	public static String getCapitalNumber(int number){  
		String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};  
		return arr[number];  
	}  
}

图片[11]-3.1 String字符串-IT熊技术站

[/content_hide]

6.手机号屏蔽

将手机号15898648251变成158****8251

答案:

[content_hide]

public class IT梦 {  
	public static void main(String[] args) {  
		String phoneNumber = "15898648251";  
		String s1 = phoneNumber.substring(0,3);  
		String s2 = phoneNumber.substring(7);  
		String result = s1 + "****" + s2;  
		System.out.println(result);  
	}  
}

图片[12]-3.1 String字符串-IT熊技术站

[/content_hide]

7.身份证信息查看

身份证7-14位:出生年,月,日
身份证第17位:性别(奇数男性,偶数女性)

最终效果:

图片[13]-3.1 String字符串-IT熊技术站

答案:

[content_hide]

public class IT梦 {  
	public static void main(String[] args) {  
		String id = "331023200110284523";  
		String year= id.substring(6,10);  
		String month = id.substring(10,12);  
		String day = id.substring(12,14);  
		char c = id.charAt(16);  
		System.out.println("人物信息为:");  
		System.out.println("出生年月日:" + year + "年" + month + "月" + day + "日"); 
		int gender = c - 48;  
		if(gender % 2 ==0){  
			System.out.println("性别为:女");  
		}else {  
			System.out.println("性别为:男");  
		}  
	}  
}

图片[14]-3.1 String字符串-IT熊技术站

[/content_hide]

7.敏感词替换

将脏话替换成***

答案:

[content_hide]

public class IT梦 {  
	public static void main(String[] args) {  
		String talk = "你sb吧,不会玩就别玩,nc,真晦气";  
		String[] arr = {"cnm","sb","mlgb","nc"};  
		for (int i = 0; i < arr.length; i++) {  
			talk = talk.replace(arr[i],"**");  
		}  
		System.out.println(talk);  
	}  
}

图片[15]-3.1 String字符串-IT熊技术站

[/content_hide]

 

StringBuilder:

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率

StringBuilder构造方法:

public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象

StringBuilder常用方法:

public StringBuilder append(任意类型):添加数据,并返回对象本身
public StringBuilder reverse():反转容器中的内容
public int length():返回长度(字符出现的个数)
public String toString():把StringBuilder类型转换为String类型,转换完之后就可以调用String的方法

StringBuilder的使用场景:

1.字符串的拼接
2.字符串的反转

普及:

因为StringBuilder是java已经写好的类,java在底层对他做了一些特殊处理,所以在打印对象时打印的不是地址值而是属性值

代码演示:

public class IT梦 {  
	public static void main(String[] args) {  
		//创建对象  
		StringBuilder sb = new StringBuilder("abc");  
		System.out.println(sb);  
  
		//添加内容  
		sb.append("IT梦");  
		System.out.println(sb);  
  
		//反转内容  
		sb.reverse();  
		System.out.println(sb);  
  
		//返回长度  
		int i = sb.length();  
		System.out.println(i);  
  
		//转换为字符串  
		String str = sb.toString();  
		System.out.println(str);  
	}  
}

图片[16]-3.1 String字符串-IT熊技术站

拓展:

链式编程:当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法

代码演示:

public class IT梦 {  
	public static void main(String[] args) {  
		StringBuilder sb = new StringBuilder("IT梦");
		//链式编程  
		String str = sb.append(2023).reverse().toString();  
		System.out.println(str);  
	}  
}

图片[17]-3.1 String字符串-IT熊技术站

练习:

1.对称字符串:

键盘接收一个字符串, 程序判断该字符串是否是对称字符串,并在控制台打印是或不是
对称字符串:123321,111
非对称字符串:123123

答案:

[content_hide]

import java.util.Scanner;  
  
public class IT梦 {  
	public static void main(String[] args) {  
		Scanner sc = new Scanner(System.in);  
		String str = sc.next();  
		String newStr = new StringBuilder(str).reverse().toString();  
		boolean result = str.equals(newStr);  
		if(result){  
			System.out.println("是");  
		}else {  
			System.out.println("不是");  
		}  
	}  
}

图片[18]-3.1 String字符串-IT熊技术站

图片[19]-3.1 String字符串-IT熊技术站

[/content_hide]

 

2.拼接字符串

定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
例:数组为int[] arr = {1,2,3};
执行方法后的输出结果为:[1,2,3]

答案:

[content_hide]

public class IT梦 {  
	public static void main(String[] args) {  
		int[] arr = {1,2,3};  
		arrToString(arr);  
	}  
	public static void arrToString(int[] arr){  
		StringBuilder sb = new StringBuilder();  
		sb.append("[");  
		for (int i = 0; i < arr.length; i++) {  
			if(i == arr.length - 1){  
				sb.append(arr[i]);  
			}else {  
				sb.append(arr[i] + ", ");  
			}  
		}  
		sb.append("]");  
		System.out.println(sb.toString());  
	}  
}

图片[20]-3.1 String字符串-IT熊技术站

[/content_hide]

StringJoiner:

1.StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的
2.作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用
3.JDK8出现的

StringJoiner的构造方法:

public StringJoiner(间隔符号):创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号):创建一个StringJoiner对象,指定拼接时的间隔符号,开始符号,结束符号

StringJoiner的成员方法:

public StringJoiner add(添加的内容):添加数据,并返回对象本身
public int length():返回长度(字符出现的个数)
public String toString():返回一个字符串(该字符串就是拼接后的结果)

代码演示:

import java.util.StringJoiner;  
  
public class IT梦 {  
	public static void main(String[] args) {  
		StringJoiner sj = new StringJoiner("---");  
		String str = sj.add("a").add("b").add("c").toString();  
		System.out.println(str);  
		StringJoiner sj1 = new StringJoiner(", ","[","]");  
		String str1 = sj1.add("a").add("b").add("c").toString();  
		System.out.println(str1);  
		int len = sj1.length();  
		System.out.println(len);  
	}  
}

图片[21]-3.1 String字符串-IT熊技术站

拓展:

字符串拼接的底层原理:

1.拼接过程中没有变量参与:

图片[22]-3.1 String字符串-IT熊技术站

2.拼接过程中有变量参与(在内存中创建了很多对象,浪费空间,速度也非常慢):

图片[23]-3.1 String字符串-IT熊技术站

结论:如果有很多字符串变量拼接,不要直接用+,在底层会创建多个对象,浪费时间,浪费性能

3.StringBuilder原理图:

图片[24]-3.1 String字符串-IT熊技术站

4.StringBuilder源码分析:

默认创建一个长度为16的字节数组
添加的内容长度小于16,直接存
添加的内容长度大于16会扩容(原来的容量*2+2)
如果扩容之后还不够,以实际长度为准

小结:

1.如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串
2.如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存

综合练习:

1.转换罗马数字

键盘录入一个字符串(长度小于等于9且只能是数字),将内容变成罗马数字
注意:罗马数字里面是没有0的,如果键盘录入的数字包含0,可以变成” “(长度为0的字符串)
图片[25]-3.1 String字符串-IT熊技术站

答案:

[content_hide]

import java.util.Scanner;  
  
public class IT梦 {  
	public static void main(String[] args) {  
		Scanner sc = new Scanner(System.in);  
		String str;  
		while (true){  
			str = sc.next();  
			boolean flag = judgeString(str);  
			if(flag){  
				break;  
			}else {  
				System.out.println("输入的字符串不符合要求,请重新输入");  
				continue;  
			}  
		}  
		StringBuilder sb = new StringBuilder();  
		for (int i = 0; i < str.length(); i++) {  
			char c = str.charAt(i);  
			int number = c - 48;  
			String s = changeLuoMa(number);  
			sb.append(s);  
		}  
		System.out.println(sb);  
	}  
	public static String changeLuoMa(int number){  
		String[] arr = {"","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ"};  
		String s = arr[number];  
		return s;  
	}  
	public static boolean judgeString(String str){  
		if(str.length() > 9){  
			return false;  
		}  
		for (int i = 0; i < str.length(); i++) {  
			char c = str.charAt(i);  
			if(c < '0' || c > '9'){  
				return false;  
			}  
		}  
		return true;  
	}  
}

图片[26]-3.1 String字符串-IT熊技术站

[/content_hide]

2.调整字符串

给定两个字符串,A和B,A的旋转操作就是将A最左边的字符移动到最右边
例:若A等于”abcde”,在旋转一次后结果就是”bceda”
如果在若干次调整操作之后,A能变成B,那么返回true,否则返回false

答案:

[content_hide]

public class IT梦 {  
	public static void main(String[] args) {  
		String A = "abcde";  
		String B = "cdeab";  
		boolean flag = judge(A,B);  
		System.out.println(flag);  
	}  
	public static boolean judge(String A,String B){  
		for (int i = 0; i < A.length(); i++) {  
			A = spin(A);  
			if(A.equals(B)){  
				return true;  
			}  
		}  
		return false;  
	}  
	public static String spin(String str){  
		char c = str.charAt(0);  
		String end = str.substring(1);  
		String result = end + c;  
		return result;  
	}  
}

图片[27]-3.1 String字符串-IT熊技术站

[/content_hide]

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容