ctrl+alt+T 选择语句包裹
目录
1.API
2.String创建
3.字符串的比较
4.字符串——练习
(1):用户登录
(2)遍历字符串和统计字符个数
(3)字符串拼接和反转
(4)金额转换
(5)手机号屏蔽,游戏敏感词替换
5.StringBuilder
6.字符串相关类的底层原理
7.较难练习
(1)罗马数字的两种写法
(2)调整字符串内容并比较
8.后续练习思路分析
1.API
API: 应用程序编程接口。
简单解释:就是别人写好的东西,我们不需要编写,直接使用即可。
Java API:指JDK中提供的各种功能的Java类。
API帮助文档,可以在这个文档里查询API。
2.String创建
字符串不可变,它们的值被创建后不能被更改。
chatAt();能够用来检索特定索引下的字符
substring();截取
replace();替换
equals();相等
toCharArray();字符串转字符数组
new String(arr);字符数组转字符串
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在,不存在就创建新的,存在就复用。
直接复制好处:代码简单,节约内存。
new的方式创建字符串,字符串不会被复用。
3.字符串的比较
想要比较字符串的内容,必须用String里的方法。
4.字符串——练习
(1):用户登录
- 已知正确的用户名和密码,请用程序实现模拟用户登录。
- 总共给3次机会,登录之后,给出相应提示。
import java.util.Scanner;
public class Login {
public static void main(String[] args) {
String rightUser="zhangsan";
String rightPass="123456";
Scanner sc=new Scanner(System.in);
for (int i = 0; i <3 ; i++) {
System.out.print("请输入账号:");
String user=sc.next();
System.out.print("请输入密码:");
String pass=sc.next();
if(rightUser.equals(user)&&rightPass.equals(pass)){
System.out.println("登录成功");
break;
}
else{
System.out.println("登录失败,账号或密码有误。还有"+(2-i)+"次机会登录");
if((2-i)==0){
System.out.println("您的"+user+"账号已经被锁定,请联系xxxx人员");
}
}
}
}
}
(2)遍历字符串和统计字符个数
- 键盘录入一个字符串,使用程序在控制台遍历该字符串。
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str=sc.next();
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
}
}
- 统计字符次数
- 键盘录入一个字符串,统计该字符串中,大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str=sc.next();
int bigCount=0;
int smallCount=0;
int numCount=0;
// char类型在计算时,会提升为int,然后查询ascii码表
for (int i = 0; i < str.length(); i++) {
char c=str.charAt(i);
if(c>='A'&&c<='Z'){
bigCount++;
}
else if(c>='a'&&c<='z'){
smallCount++;
}
else if(c>='0'&&c<='9'){
numCount++;
}
}
System.out.println("大写字符个数:"+bigCount);
System.out.println("小写字符个数:"+smallCount);
System.out.println("数字字符个数:"+numCount);
}
}
(3)字符串拼接和反转
- 拼接字符串
- 定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。
- 例如:数组为int[]arr={1,2,3}; 执行方法后的输出结果为:[1,2,3]
public class StringTest {
public static void main(String[] args) {
int[]arr={1,2,3};
arrToString(arr);
}
public static String arrToString(int[]arr){
if(arr==null){
return "";
}
if(arr.length==0){
return "[]";
}
// 数组不为null,长度不为0,说明数组中一定有数据
String left="[";
for (int i = 0; i < arr.length; i++) {
if(i<arr.length-1){
left=left+arr[i]+',';
}
else {
left=left+arr[i];
}
}
left=left+']';
System.out.println(left);
return left;
}
}
- 定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果。
- 例如,键盘输入abc,输出结果cda。
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个字符串:");
String c=sc.next();
reverseArr(c);
}
public static void reverseArr(String str){
String result="";
//倒着遍历
for (int i = str.length()-1; i >=0 ; i--) {
char c=str.charAt(i);
result=result+c;
}
System.out.println(result);
}
}
(4)金额转换
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
//1.输入
Scanner sc = new Scanner(System.in);
System.out.print("请输入金额:");
int number = sc.nextInt();
//判断金额是否有效
if (number >= 1 && number <= 9999999) {
String left = "";
//4.获得数字的每一位,并转换、拼接
while (true) {
int ge = number % 10;
number = number / 10;
String geNew = ExchangeCapitalNum(ge);
left = geNew + left;
if (number == 0) {
break;
}
}
//5.不足7位,在前面补0
String leftStr = left;
for (int i = 0; i < (7 - left.length()); i++) {
leftStr = '零' + leftStr;
}
//6.满足7位数字,调用方法,补齐单位
MoneyStr(leftStr);
}
else {
System.out.println("输入金额无效");
}
}
//2.转换,1-壹
public static String ExchangeCapitalNum(int ge) {
String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
String geNew = arr[ge];
return geNew;
}
//3.加单位
public static void MoneyStr(String left) {
String[] arr = {"佰", "拾", "万", "仟", "佰", "拾", "元"};
String result = "";
for (int i = arr.length - 1; i >= 0; i--) {
char moneystr = left.charAt(i);
result = moneystr + arr[i] + result;
}
System.out.println(result);
}
}
(5)手机号屏蔽,游戏敏感词替换
- 手机号屏蔽:将12387634991变成123****4991
public class StringTest {
public static void main(String[] args) {
//1.输入
String phoneNum="12387634991";
String result=phoneNum.substring(0,3)+"****"+phoneNum.substring(7,11);
System.out.println(result);
}
}
- 游戏敏感词替换
public class StringTest {
public static void main(String[] args) {
//1.输入
String talk="玩的很好,下次不要再玩了,TMD,SB";
String[]arr={"TMD","SB","2B","CNM"};
for (int i = 0; i < arr.length; i++) {
talk=talk.replace(arr[i],"***");
}
System.out.println(talk);
}
}
5.StringBuilder
StringBuilder可以看成一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率。
使用场景:1.字符串的拼接;2.字符串的反转。
注:StringBuilder是Java已经写好的类,Java在底层对其做了特殊处理,打印对象不是地址值而是属性值。(用完可以转换为String,用方法:toString())
链式编程举例:
- 练习:键盘接收一个字符串,程序判断该字符串是否是对称字符串,并在控制台打印是或者不是
- 对称字符串:123321、111
- 非对称字符串:123123
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
//输入
Scanner sc=new Scanner(System.in);
System.out.println("判断该字符串是否为对称字符串");
System.out.println("请输入一个字符串:");
String str=sc.next();
StringBuilder sb=new StringBuilder(str);
String str1=sb.reverse().toString();
if(str.equals(str1)){
System.out.println("是");
}
else {
System.out.println("不是");
}
}
}
- 练习:拼接字符串。定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回。
- 调用该方法,并在控制台输出结果。
- 例如:数组为int[]arr={1,2,3};
- 执行方法后输出结果为:[1,2,3]
public class StringTest {
public static void main(String[] args) {
int[]arr={1,2,3};
String str=arrToString(arr);
System.out.println(str);
}
public static String 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]).append(",");
}
}
sb.append("]");
return sb.toString();
}
}
6.StringJoiner
StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率,而且代码编写特别简洁。
7.字符串相关类的底层原理
一个加号,堆内存里两个对象。
结论:如果很多字符串变量拼接,不要直接“+”。在底层会创建多个对象,浪费时间,浪费性能。
8.较难练习
(1)罗马数字的写法
- 转换罗马数字
- 要求1:长度为小于等于9
- 要求2:只能是数字
- 将内容变成罗马数字
- 下面是阿拉伯数字跟罗马数字的对比关系:
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
//1~9:I ,II ,III,IV ,V ,VI,VII ,VIII ,IX
//1。输入字符串
Scanner sc=new Scanner(System.in);
while (true) {
System.out.print("请输入都为数字的字符串:");
String str=sc.next();
//2.判断字符串是否符合条件,全为数字,数据有误就重新输入
boolean flag=checkNum(str);
if(flag){
//3.将数字变成罗马数字,并拼接
String result=changeLuoMa(str);
System.out.println(result);
break;
}
}
}
//这里还可以使用switch case实现。case'1'->str="I";
public static String changeLuoMa(String str){
String result="";
String[]arr={" ","I","II","III","IV","V","VI","VII","VIII","IX"};
for (int i = 0; i < str.length(); i++) {
//str.charAt(i)-48是将字符转换成数字。比如9的ascii码是57,57-48=9。
int strSingleNum=str.charAt(i)-48;
String strSingle=arr[strSingleNum];
result=result+strSingle+" ";
}
return result;
}
public static boolean checkNum(String str){
if(str.length()>9){
System.out.println("数据范围有误,请重新输入");
return false;
}
for (int i = 0; i < str.length(); i++) {
char strSingle=str.charAt(i);
if(strSingle<=48||strSingle>=57){
System.out.println("数据有误,请重新输入");
return false;
}
}
return true;
}
}
(2)调整字符串内容并比较
- 给定两个字符串,A和B。A的旋转操作就是将A最左边的字符移动到最右边。
- 例如:若A=‘abcde’,在移动一次之后结果就是‘bcdea’。
- 如果在若干次调整操作之后,A能变成B,那么返回True。
- 如果不能匹配成功,则返回false
//方法一
public class StringTest {
public static void main(String[] args) {
//1.定义字符串
String strA="abcde";
String strB="cdeab";
//2.旋转字符串A,方法:rotate
//3.循环判断A,B字符串是否相同,调用check方法
boolean flag=check(strA,strB);
System.out.println(flag);
}
public static boolean check(String strA,String strB) {
for (int i = 0; i < strA.length(); i++) {
strA=rotate(strA);
if(strA.equals(strB)){
return true;
}
}
return false;
}
public static String rotate(String str) {
String first=str.substring(0,1);
String end=str.substring(1, str.length());
String result=end+first;
return result;
}
}
//方法二
public class StringTest {
public static void main(String[] args) {
//1.定义字符串
String strA="abcde";
String strB="cdeab";
//2.旋转字符串A,方法:rotate
//3.循环判断A,B字符串是否相同,调用check方法
boolean flag=check(strA,strB);
System.out.println(flag);
}
public static boolean check(String strA,String strB) {
//字符转字符数组toCharArray(),然后再将字符数组变成字符串
char[]arr=strA.toCharArray();
for (int j = 0; j < strA.length(); j++) {
char temp=arr[0];
for (int i = 0; i < strA.length()-1; i++) {
arr[i]=arr[i+1];
}
arr[strA.length()-1]=temp;
//字符数组变成字符串
String result=new String(arr);
if (result.equals(strB)){
System.out.println(result);
return true;
}
}
return false;
}
}
9.后续练习思路分析
- 键盘输入任意字符串,打乱里面的内容
import java.util.Random;
import java.util.Scanner;
public class StringTest {
public static void main(String[] args) {
//1.输入任意字符串
Scanner sc=new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str=sc.next();
//2.字符串转字符数组
char[]arr=str.toCharArray();
//3.生成随机数
Random r=new Random();
//4.随机交换
for (int i = 0; i < arr.length; i++) {
int random=r.nextInt(arr.length);
char temp=arr[i];
arr[i]=arr[random];
arr[random]=temp;
}
String result=new String(arr);
System.out.println(result);
}
}
- 生成验证码
- 内容:可以是小写字母,也可以是大写字母,还可以是数字
- 规则:
- 长度为5
- 内容中是四位字母,1位数字。
- 其中数字只有1位,但是可以出现在任意的位置。
import java.util.Random;
public class StringTest {
public static void main(String[] args) {
//1.定义两个数组分别存放A-Z、a-z和0-9
char[]arr={
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'
};
char[]arrNum={'0','1','2','3','4','5','6','7','8','9',};
//2.生成随机数,获取4个字母,1个数字
String resultEnd=getWordsNum(arr,arrNum);
//3.将4字母+1数字的结果打乱
exchange(resultEnd);
}
public static String getWordsNum(char[]arr,char[]arrNum) {
Random r=new Random();
String result="";
for (int i = 0; i < 4; i++) {
int randomIndex=r.nextInt(arr.length);
result=result+arr[randomIndex];
}
int randomIndexNum=r.nextInt(arrNum.length);
char resultNum=arrNum[randomIndexNum];
String resultEnd=result+resultNum;
return resultEnd;
}
public static void exchange(String resultEnd) {
Random r=new Random();
char []arrNew=resultEnd.toCharArray();
int index=r.nextInt(arrNew.length);
for (int i = 0; i < arrNew.length; i++) {
char temp=arrNew[i];
arrNew[i]=arrNew[index];
arrNew[index]=temp;
}
String result=new String(arrNew);
System.out.println(result);
}
}
- 给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。
public class StringTest {
public static void main(String[] args) {
//1.定义字符串
String num1="123456";
String num2="123";
//2.将字符串换成数字进行拼接
int number1=strToNum(num1);
int number2=strToNum(num2);
//查看转换结果是否正确
// System.out.println(number1);
// System.out.println(number2);
//3.计算乘积
int result=number1*number2;
System.out.println(result);
}
public static int strToNum (String num) {
char[]arr1=num.toCharArray();
int result1=0;
for (int i = 0; i < arr1.length; i++) {
result1=result1*10+(arr1[i]-48);
}
return result1;
}
}
- 给你一个字符串s,由若干单词组成,单词前后有一些空格字符隔开。返回最后一个单词的长度。单词是指仅由字母组成,不包含任何空格字符的最大子字符串。
- 例如:输入s="Hello World" 输出:5
public class StringTest {
public static void main(String[] args) {
//1.给定字符串s
String s="Today is unlucky day";
//2.反向遍历,遇到空格就结束
char[]arr=s.toCharArray();
int count=0;
for (int i = arr.length-1; i >=0 ; i--) {
if (arr[i]==' '){
break;
}
else {
count++;
}
}
System.out.println(count);
}
}