简单学生系统
//定义一个长度为3的数组,数组存储1-3名学生对象作为初始数据
//要求1 再次加一个学生对象,并在添加时进行学号唯一性判断
//要求2 添加完毕后遍历所有学生信息
//要求3 通过id删除学生信息 存在删除,不存在表示删除失败
//要求4 删除完后,遍历所有学生信息
//要求5 查询数组id为002的学生,如果存在则将他的年龄加一
package Day04;
import java.util.Scanner;
public class StudentTest {
public static void main(String[] args){
//定义一个长度为3的数组,数组存储1-3名学生对象作为初始数据
Student[] studentArray = new Student[4];
Student s1 = new Student(001,"小姚",18);
Student s2 = new Student(002,"小张",19);
Student s3 = new Student(003,"小王",17);
studentArray[0] = s1;
studentArray[1] = s2;
studentArray[2] = s3;
Student[] arr = idJudgement(studentArray);
Student[] arr1 = delete(arr,004);
Student[] arr2 = addAge(arr,002);
for (int i = 0; i < arr2.length; i++) {
if(arr[i]!=null){
System.out.println(arr2[i].getId()+arr2[i].getName()+arr2[i].getAge());
}
}
}
//要求1 再次加一个学生对象,并在添加时进行学号唯一性判断
public static Student[] idJudgement(Student[] arr){
Student s = new Student();
Scanner sc = new Scanner(System.in);
System.out.println("请输入添加对象的id");
int id = sc.nextInt();
boolean flag = contains(arr,id);
if(flag){
System.out.println("id重复,请修改后输入!");
}else{
s.setId(id);
System.out.println("请输入添加对象的name");
String name = sc.next();
s.setName(name);
System.out.println("请输入添加对象的age");
int age = sc.nextInt();
s.setAge(age);
arr[3] = s;
return arr;
}
return arr;
}
//判断是否存在
public static boolean contains(Student[] arr,int number){
boolean flag = false;
for (int i = 0; i < arr.length - 1; i++) {
if(arr[i].getId()==number){
flag = true;
}
}
return flag;
}
//要求3 通过id删除学生信息 存在删除,不存在表示删除失败
public static Student[] delete(Student[] arr,int id){
for (int i = 0; i < arr.length; i++) {
if(arr[i].getId()==id){
arr[i] = null;
return arr;
}
}
System.out.println("不存在要删除的id");
return arr;
}
//要求5 查询数组id为002的学生,如果存在则将他的年龄加一
public static Student[] addAge(Student[] arr,int id){
for (int i = 0; i < arr.length; i++) {
if(arr[i].getId()==id){
int age = arr[i].getAge()+1;
arr[i].setAge(age);
return arr;
}
}
System.out.println("不存在要增加年龄的id");
return arr;
}
}
字符串
字符串内容是不会发生变化的,它的对象在创建以后不会改变
1 直接赋值 2 传递字符数组,根据字符数组内容在创建一个新的字符串对象 需求:修改字符串内容 abc Qbc 3 传递字节数组 需求:把字节信息转成字符串
2和3属于new关键字传教关键对象
字符串比较
==:对于基本数据类型比较的是数据值;对于引用数据类型比较的是地址值。
s1.equals(s2) s1和s2完全一致为true s1.equalsIgnoreCase(s2); 忽略大小写
键盘录入模拟账号登陆
//1 定义正确的用户名和密码
String rightUserName = "xiaoyao";
String rightUserPassword = "123456";
//2 键盘录入模拟登录的用户名密码
Scanner sc = new Scanner(System.in);
int count = 1;
while (count<4){
System.out.println("请输入用户名密码");
String userName = sc.next();
String userPassword = sc.next();
if(userName.equals(rightUserName)&&userPassword.equals(rightUserPassword)){
System.out.println("登录成功!");
break;
}else{
if(count==3){
System.out.println("输入次数超过3次,您的账号被锁定!");
break;
}
System.out.println("请重新输入用户名密码,您还剩下"+(3-count)+"次机会!");
count+=1;
}
}
字符串.charAt(索引) --- 表示字符串每个索引 s1.charAt(i)
统计字符数目
//统计字符次数
//大写字母,小写字母,数字分别长度
String s1 = "XiaoYao12345";
int bigLetter = 0;
int smellLetter = 0;
int number = 0;
for (int i = 0; i < s1.length(); i++) {
if(s1.charAt(i)>='0'&&s1.charAt(i)<='9'){
number+=1;
}else if(s1.charAt(i)>='a'&&s1.charAt(i)<='z'){
smellLetter+=1;
}else if(s1.charAt(i)>='A'&&s1.charAt(i)<='Z'){
bigLetter+=1;
}
}
金额转换
//金额转换
//1 键盘输入金额
Scanner sc = new Scanner(System.in);
int s1;
while (true){
System.out.println("请输入要转换的金额");
s1 = sc.nextInt();
if(s1>=0&&s1<=9999999){
break;
}else {
System.out.println("输入金额有误");
}
}
//2 查表法 把数据和索引一一对应 根据索引找数据
String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
//3 得到每一位数字 转成中文
String res = "";
while (s1!=0){
int ge = s1%10;
res=arr[ge] + res;
s1 = s1/10;
}
//4 在前面补0,补齐七位
int count = 7-res.length();
for (int i = 0; i < count; i++) {
res = "零"+res;
}
String result = "";
//5 加上单位
String[] arr2 = {"佰","拾","万","仟","佰","拾","元"};
for (int i = 0; i < arr2.length; i++) {
result += res.charAt(i)+arr2[i];
}
System.out.println(result);
字符串截取 substring :包头不包尾
用ASCII码把字符转为数字 -48
//敏感词替换
//1 获取内容
String talk = "你真6tmdsb";
//2 定义敏感词库
String[] arr = {"tmd","nmd","cnm","sb"};
for (int i = 0; i < arr.length; i++) {
String s1 = arr[i];
talk = talk.replace(s1,"***");
}
System.out.println(talk);
StringBuilder:容器,创建之后的内容是可以改变的 提高字符串的操作效率(不会创建很多空间 )
使用场景:字符串拼接,字符串反转
package Day04;
public class StringBuilderPractice {
public static void main(String[] args){
//1 创建对象
StringBuilder sb = new StringBuilder();
//2 添加元素
sb.append("xiaochen");
//3 反转
sb.reverse();
//4 获取长度
int num = sb.length();
//5 tostring()
String str = sb.toString();
System.out.println(str);
System.out.println(sb);
}
}
练习:字符串反转
//对称字符串
//键盘输入对称字符串,程序判断是否是对称字符串,并在控制台打印是或不是
//对称字符串 12321 111
//1 键盘输入对称字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入要判断的字符串");
String str1 = sc.next();
//2 程序判断是否是对称字符串
StringBuilder sb = new StringBuilder();
String str2 = sb.append(str1).reverse().toString();
boolean flag = true;
if(!str1.equals(str2)){
flag = false;
}
System.out.println(flag);
练习:字符串拼接
//拼接字符串
// int[] arr = {1,2,3} [1,2,3]
//1 定义数组
int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12};
//2 定义StringBuilder对象
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if(i!=arr.length-1){
sb.append(arr[i]).append(",");
}else{
sb.append(arr[i]);
}
}
sb.append("]");
System.out.println(sb.toString());
StringJoiner
StringJoiner sj1 = new StringJoiner("间隔符号"); StringJoiner sj2 = new StringJoiner("间隔符号","开始符号","结束符号");
StringJoiner.add(只能是String类型)
package Day04;
import java.util.StringJoiner;
public class StringJoinerPractice {
public static void main(String[] args){
String[] arr = {"1","2","3"};
StringJoiner sj1 = new StringJoiner("--");
StringJoiner sj2 = new StringJoiner(",","[","]");
for (int i = 0; i < arr.length; i++) {
sj1.add(arr[i]);
sj2.add(arr[i]);
}
System.out.println(sj1);
System.out.println(sj2);
}
}
字符串的拼接底层原理
拼接时没有变量都是字符串,触发字符串优化机制,在编译时已经是最终结果 没有创建对象
拼接时有变量参与,JDK8以前使用StringBuilder
结论:如果很多字符串变量拼接时,不要直接+,会在底层创建多个对象,浪费时间和性能
String str1 = "abc"; String str2 = "ab"; String str3 = str2+"c"; System.out.println(str1==str3); //false
字符串拼接时有变量
JDK8以前:系统底层自动创建StringBuilder对象,然后再调用append方法进行拼接;拼接后,再调用tostring()方法转换为String类型,而tostring()方法的底层是new了一个字符串对象
JDK8:系统会预估字符串拼接后的总大小,把拼接的内容放在数组中,此时也是产生了一个新的字符串
StringBuilder扩容:老容量*2+2 = 新容量 默认初始容量为16
练习1 罗马数字转换
package Day04;
import java.util.Scanner;
public class Practice {
public static void main(String[] args){
//键盘录入一个字符串
//要求1 长度小于等于9
//要求2 只能是数字
//对应关系:Ⅰ:1,Ⅱ:2,Ⅲ:3,Ⅳ:4,Ⅴ:5,Ⅵ:6,Ⅶ:7,Ⅷ:8,Ⅸ:9 罗马数字没有0,如果键盘录入包含0可以变成""
//键盘录入一个字符串
Scanner sc = new Scanner(System.in);
String str1 = "";
while (true){
System.out.println("请输入字符串!");
str1 = sc.next();
//检验
boolean check = flag(str1);
if(check){
break;
}else {
System.out.println("输入格式错误,请输入字符串!");
continue;
}
}
//
StringBuilder sb = new StringBuilder();
String[] arr = {"","Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ","Ⅷ","Ⅸ"};
for (int i = 0; i < str1.length(); i++) {
int num = str1.charAt(i)-48;
sb.append(arr[num]);
}
System.out.println(sb.toString());
}
//判断是否符号规则
public static boolean flag(String str1){
//要求1 长度小于等于9
if(str1.length()>9){
return false;
}
//要求2 只能是数字
for (int i = 0; i < str1.length(); i++) {
if(str1.charAt(i)<'0'||str1.charAt(i)>'9'){
return false;
}
}
return true;
}
}
str1.toCharArray() 字符串转换为字符数组 String res = new String(arr); 字符数组转换为字符串
练习2
给定一个字符串s,由若干个单词组成,单词前后用一些字符隔开,返回字符串中最后一个单词长度
public static void main(String[] args){
//给定一个字符串s,由若干个单词组成,单词前后用一些字符隔开,返回字符串中最后一个单词长度
//倒序遍历 遇到空格就停
String s = "hello world";
int count = 0;
for (int i = s.length()-1; i >=0; i--) {
if(s.charAt(i)!=' '){
count+=1;
}else {
break;
}
}
System.out.println(count);
}
练习3
给定两个字符串形式表示的非负整数num1和num2,以字符串的形式返回他们的乘积
public static void main(String[] args){
//给定两个字符串形式表示的非负整数num1和num2
//以字符串的形式返回他们的乘积
String str1 = "123";
String str2 = "234";
char[] arr1 = str1.toCharArray();
char[] arr2 = str2.toCharArray();
int res1 = 0;
for (int i = 0; i < arr1.length; i++) {
res1 = res1*10+(arr1[i]-48);
}
int res2 = 0;
for (int i = 0; i < arr2.length; i++) {
res2 = res2*10+(arr2[i]-48);
}
int multiplier = res1*res2;
System.out.println(multiplier);
}
练习4
生成验证码五位 数字顺序可以在任何地方
public static void main(String[] args){
//生成验证码五位 数字顺序可以在任何地方
//1 将大写、小写都放在一个数组中 随机获取四次
char[] arr = new char[52];
int index = 0;
for (char i = 'a'; i <='z'; i++) {
arr[index] = i;
index+=1;
}
for (char i = 'A'; i <='Z'; i++) {
arr[index] = i;
index+=1;
}
//2 随机获取4次
Random r = new Random();
String res = "";
for (int i = 0; i < 4; i++) {
int numIndex = r.nextInt(52);
res+=arr[numIndex];
}
//3 随机获取数字 将数字放在验证码末尾
int num1 = r.nextInt(10);
res+=num1;
//4 转为字符数组 将数组最后一位与前面4位进行随机交换
char[] arrRes = res.toCharArray();
int numIndex1 = r.nextInt(5);
char temp = arrRes[arrRes.length-1];
arrRes[arrRes.length-1] = arrRes[numIndex1];
arrRes[numIndex1] = temp;
//5 字符数组转为字符串
String result = new String(arrRes);
System.out.println(result);
}
练习5
键盘输入任意字符串,打乱里面内容
public static void main(String[] args){
// 键盘输入任意字符串,打乱里面内容
String str1 = "12345678aa";
char[] arr = str1.toCharArray();
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int num = r.nextInt(str1.length());
char temp = arr[i];
arr[i] = arr[num];
arr[num] = temp;
}
String res = new String(arr);
System.out.println(res);
}
练习6
给定两个字符A和B,A的旋转操作:将A的最左边字符移动到最右边字符 abcde ---- bcdea。如果A经过若干次旋转能变成B则返回True,否则false
public static void main(String[] args){
//给定两个字符A和B
//A的旋转操作:将A的最左边字符移动到最右边字符
//abcde ---- bcdea
//如果A经过若干次旋转能变成B则返回True,否则false
//1 定义两个字符串
String str1 = "abcdef";
String str2 = "cdefab";
//2 A的旋转操作
boolean flag = false;
for (int i = 0; i < str1.length(); i++) {
String str3 = str1.substring(i)+str1.substring(0,i);
if(str3.equals(str2)){
flag = true;
break;
}
}
System.out.println(flag);
}