本周主要学习了黑马的92-115主要包含以下内容:
面向对象综合练习,String,ArrayList
请看我的上篇文章(~ ̄(OO) ̄)ブ
第十四周Java学习总结
public class Test1 {
public static void main(String[] args) {
//1.创建学生数组
Student[] arr = new Student[3];
//2.创建学生对象3.存到数组中
Student stu1 = new Student("1", "小明", 18);
Student stu2 = new Student("2", "小红", 19);
Student stu3 = new Student("3", "小壮", 20);
arr[0] = stu1;
arr[1] = stu2;
arr[2] = stu3;
//要求1.再次添加一个学生对象,并在添加的时候进行学号的唯一性判断。
Student stu4 = new Student("4", "小强", 21);
//(1).唯一性判断
boolean flag = contain(arr, stu4.getId());
if (flag) {
System.out.println("学号已存在,添加失败");
} else {
//(2).将对象存入数组中
//数组存满就创建新数组,长度为老数组长度+1
int count = arrNum(arr);
if (count == arr.length) {
//存满去创建新数组,将老数组的数据拷贝到新数组中
Student[] newArr = newArr(arr);
newArr[count] = stu4;
//要求2:遍历学生信息
bianLi(newArr);
} else {
//没存满
arr[count] = stu4;
//要求2:遍历学生信息
bianLi(arr);
}
}
}
//1.我需要干啥?---判断是否存在
//2.我干这件事,需要什么才能完成?----数组,id
//3.调用处是否需要继续使用方法的结果?---需要将结果拿出来判断q
public static boolean contain(Student[] arr, String id) {
for (int i = 0; i < arr.length; i++) {
Student stu = arr[i];//依次获取学生对象
String sid = stu.getId();//获取数组对象的id
if (id.equals(sid)) {
return true;
}
}
return false;
}
//定义方法判断数组中已存入多少元素
public static int arrNum(Student[] arr) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
count++;
}
}
return count;
}
//定义方法去创建新数组
public static Student[] newArr(Student[] arr) {
Student[] newArr = new Student[arr.length + 1];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
return newArr;
}
//定义方法遍历数组
public static void bianLi(Student[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i].getId() + "," + arr[i].getName() + "," + arr[i].getAge());
}
}
}
后三个要求的代码如下:
public class Test1 {
public static void main(String[] args) {
//1.创建学生数组
Student[] arr = new Student[3];
//2.创建学生对象3.存到数组中
Student stu1 = new Student("1", "小明", 18);
Student stu2 = new Student("2", "小红", 19);
Student stu3 = new Student("3", "小壮", 20);
arr[0] = stu1;
arr[1] = stu2;
arr[2] = stu3;
/*要求3:通过id刪除学生信息
如果存在,则删除,如果不存在,则提示删除失败。*/
//找到id在数组中的索引
int index = find(arr, "2");
if (index >= 0) {
//如果存在就删除
arr[index] = null;
} else System.out.println("该id不存在,删除失败");
//要求4:删除完之后,遍历所有学生信息
bianLi(arr);
//要求5:查询数组id为“2”的学生,如果存在,则将他的年龄+1岁
int index2 = find(arr, "2");
if (index2 > 0) {
//存在
Student stu = arr[index2];
int newAge = stu.getAge();
stu.setAge(newAge);
} else System.out.println("当前id不存在,修改失败");
}
//定义方法找到id在数组中的索引
public static int find(Student[] arr, String id) {
for (int i = 0; i < arr.length; i++) {
Student stu = arr[i];
String sid = stu.getId();
if (id == sid) {
return i;
}
}
return -1;
}
//定义方法遍历数组
public static void bianLi(Student[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i].getId() + "," + arr[i].getName() + "," + arr[i].getAge());
}
}
}
字符串的内容是不会发生改变的,它的对象在创建后不能被更改
String 变量名=“字符串”;
[1].public String()-------创建空白字符串
[2].public String(char[] chs)-------根据字符数组创建字符串对象
[3].public String(byte[] chs)-------根据字节数组创建字符串对象
例.
char[] chs= {'a','b','c','d'};
String s4=new String(chs);
System.out.println(s4);//abcd
byte[] chs= {97,98,99,100};
String s5=new String(chs);
System.out.println(s5);//abcd
方法:boolean equals(要比较的字符串)-------两个字符串比较
boolean equalsIgnoreCase(要比较的字符串)-------同上,但不区分大小写
package bb;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
//1.给定正确的用户名和密码
String rightName="piggyOne";
String rightPassword="123456";
//2.键盘输入
Scanner sc=new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.println("请输入用户名");
String name=sc.next();
System.out.println("请输入密码");
String password=sc.next();
if (name.equals(rightName) && password.equals(rightPassword)) {
System.out.println("登录成功");
break;
} else {
System.out.println("登录失败,您还剩"+(2-i)+"次机会");
}
}
}
}
注意:==号的使用,基本数据类型比的是数据值,引用数据类型比的是地址值
比较字符串建议用equals()方法
方法:char charAt(int index)-------返回index指定位置的字符
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串:");
String str=sc.nextLine();
int bigCount=0;
int smallCount=0;
int number=0;
for (int i = 0; i < str.length(); i++) {
char c=str.charAt(i);
if (c>='a'&&c<='z') {//ASCII表对照
//char类型的变量在参与计算时自动类型提升为int,查ascii
smallCount++;
}else if(c>='A'&&c<='Z'){
bigCount++;
}else if(c>='0'&&c<='9') {//数字字符比较
number++;
}
}
System.out.println("大写字母有"+bigCount+"个");
System.out.println("小写字母有"+smallCount+"个");
System.out.println("数字有"+number+"个");
package bb;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入字符串");
String str=sc.next();
System.out.println(reverse(str));
}
//创建方法时需要询问自己以下问题:
//1.我需要干啥?---字符串的反转
//2.我干这件事,需要什么才能完成?----字符串
//3.调用处是否需要继续使用方法的结果?---需要将结果输出
public static String reverse(String str) {
String result="";
for (int i =str.length()-1; i>=0;i--) {
char c=str.charAt(i);
result=result+c;//
}return result;
}
}
创建方法时需要询问自己以下问题:
1.我需要干啥?
2.我干这件事,需要什么才能完成?
3.调用处是否需要继续使用方法的结果?
package bb;
import java.util.Scanner;
public class Demo5 {
public static void main(String[] args) {
//1.键盘输入金额
Scanner sc=new Scanner(System.in);
int money;
while(true) {
System.out.println("请输入金额");
money=sc.nextInt();
if (money>=0&&money<=9999999) {
break;
} else {
System.out.println("金额无效,请重新输入");
}
}
//2.得到每一位数字,再转成中文
String moneyHanzi="";//定义一个变量表示钱的大写
while (true) {
//从右向左获取数字
int num=money%10;
//把转换后的大写拼接到moneyHanzi中
String numToHanzi=numToHanzi(num);
moneyHanzi=numToHanzi+moneyHanzi;//两个相加的顺序不能变
//第一次循环:"叁"+""="叁"
//第二次循环:"贰"+"叁"="贰叁"
//........
money=money/10;//去掉刚才获得的数据
if (money==0) {
break;
}
}
//3.补零
int count=7-moneyHanzi.length();
for (int i =count; i>0; i--) {
moneyHanzi="零"+moneyHanzi;
}
//4.插入单位
//遍历moneyHanzi,再将dw插进去
String[] dw= {"佰","拾","万","仟","佰","拾","元"};
String result="";
for (int i =0;i<moneyHanzi.length();i++) {
char c=moneyHanzi.charAt(i);
//把大写汉字和单位拼进去
result=result+c+dw[i];
}
System.out.println(result);
}
//1.定义一个方法把数字变成大写的汉字
public static String numToHanzi(int num) {
String[] chs= {"零","壹","贰","叁","肆","伍","陆","柒","扒","玖"};
return chs[num];
}
}
方法:String substring(int beginIndex,int endIndex)-------截取
注意点:包头不包尾
String substring(int endIndex)-------截取到末尾
package bb;
public class Demo5 {
public static void main(String[] args) {
String phoneNum="13497615736";//随便打的手机号
//1.截取前三位
String start=phoneNum.substring(0,3);
//2.截取后四位
String end=phoneNum.substring(7, 11);
//3.拼接
String result=start+"****"+end;
System.out.println(result);
}
}
方法:String replace(旧值,新值)-------替换
package bb;
public class Demo5 {
public static void main(String[] args) {
//1.获取要说的话
String talk= "你玩得很好,下次不要玩了,cnm,nmsl,tmd";
//2.创建敏感词库
String[] chs= {"cnm","nmsl","tmd","rnm"};
//3.替换
for (int i = 0; i < chs.length; i++) {
talk=talk.replace(chs[i], "***");
}
System.out.println(talk);
}
}
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
String str;
while (true) {
//1.创建字符串
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符");
str = sc.next();
if (checkStr(str)) {
break;
} else {
System.out.println("字符不合规,请重新输入`");
}
}
//2.将数字变成罗马数字
//查表法:数字跟数据产生对应关系
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int num = c - 48;//ascii中0对应48
sb.append(toLuoMa(num));
}
System.out.println(sb);
}
//2.定义方法校验字符串
public static boolean checkStr(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;
}
//定义将数字变成罗马数字的方法
public static String toLuoMa(int num) {
String[] chs = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
return chs[num];
}
}
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的
作用:提高字符串的操作效率
public StringBuilder()-------创建一个空白可变字符串对象,不含任何内容
public StringBuilder(String str)-------根据字符串的内容来创建可变字符串对象
pubilc StringBuilder append(任意类型)-------添加数据并返回对象本身
pubilc StringBuilder reverse()-------反转容器的内容
pubilc int length()-------返回长度(字符出现个数)
public String toString()-------把StringBuilder转换为String
例.
StringBuilder sb=new StringBuilder("abc");//创建对象
//1.添加字符串
sb.append(1.3);//abc1.3
//2.反转
sb.reverse();//cba
//3.获取长度
int len=sb.length();
System.out.println(len);//6
//4.再把StringBuilder变回字符串
String str=sb.toString();
System.out.println(str);
链式编程:当我们在调用一个方法时,不需要用变量接收它的结果,可以继续调用其他方法
例.
int len2=sb.append(1.3).length();
sb.append("aaa").append("bbb").append("ccc").append("ddd");
字符串的拼接和反转
package bb;
public class Demo5 {
public static void main(String[] args) {
int[] arr= {1,2,3};
//2.调用方法将数组变成字符串
String newArr=creatArr(arr);
System.out.println(newArr);
}
//1.定义一个方法拼接字符串
public static String creatArr(int[] arr) {
StringBuilder sb=new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i==arr.length-1) {
sb.append(arr[arr.length-1]).append("]");
} else {
sb.append(arr[i]).append(",");
}
}return sb.toString();
}
}
方便的拼接字符串
pubilc StringJoiner(间隔符号)-------创建对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)---------创建对象并…
例.
StringJoiner sj=new StringJoiner(",","[","]");
sj.add("aaa").add("bbb").add("ccc");
System.out.println(sj);//[aaa,bbb,ccc]
public StringJoiner add(添加的内容)-------添加数据
public int length()-------返回长度(字符出现的个数),如上方的例子长度为13
public String toString()-------返回字符串
用法与StringBuilder相似,所以不再给例子
集合
数组的长度是固定的,而集合的长度是可变的
数组中既可以存基本数据类型,也可以存引用数据类型
集合中可以存引用数据类型,而存储基本数据类型时需要把它变成相应的包装类
先引申一个概念
泛型:限定集合中存储数据的类型
ArrayList<String> list=new ArrayList<>();//创建对象的格式,string可替换
-表示只能存入字符串的空集合
其中list的打印结果是 [ ]
打印对象不是地址值,而是集合中存储的数据内容
在展示时会拿[ ]把所有的数据进行包裹
boolean add(E e)------添加元素,返回值表示是否添加成功
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);//结果是[aaa, bbb, ccc]
boolean remove(E e)------删除指定元素,返回值表示是否删除成功
boolean result1= list.remove("aaa");
System.out.println(result1);//删除成功,返回true
System.out.println(list);//集合变为[bbb, ccc]
boolean result2= list.remove("ddd");
System.out.println(result2);//集合中无ddd,删除失败,返回false
System.out.println(list);//集合变为[bbb, ccc]
E remove(int index)------删除指定索引的元素,返回被删除的元素
String str=list.remove(0);//删除索引在0处的元素
System.out.println(str);//返回被删除的索引为0的元素aaa
System.out.println(list);//集合变为[bbb, ccc]
E set(int index,E e)------修改指定索引的元素,返回原来的元素
String str= list.set(0,"ddd");//将0索引处的元素改为ddd
System.out.println(str);//返回改变前的元素aaa
System.out.println(list);//集合变为[ddd, bbb, ccc]
E get(int index)------获取指定索引的元素
String str= list.get(0);//获取0索引处的元素
System.out.println(str);//结果为aaa
int size()------集合的长度,也就是集合中元素的个数
应用:
for (int i = 0; i < list.size(); i++) {//打印出集合的各个元素
String str= list.get(i);
System.out.println(str);
}
import java.util.ArrayList;
public class Test1 {
public static void main(String[] args) {
ArrayList<Phone> list = new ArrayList<>();
Phone p1 = new Phone("小米", 1000);
Phone p2 = new Phone("苹果", 8000);
Phone p3 = new Phone("锤子", 2999);
list.add(p1);
list.add(p2);
list.add(p3);
ArrayList<Phone> resultList = findPhInfo(list);
for (int i = 0; i < resultList.size(); i++) {
Phone p = resultList.get(i);
System.out.println(p.getBrand() + "," + p.getPrice());
}
}
//定义一个方法返回价格低于3000的手机的信息
//技巧:如果要返回多个数据,可以把这些数据先放到一个容器中,再把容器返回
public static ArrayList<Phone> findPhInfo(ArrayList<Phone> list) {
ArrayList<Phone> resultList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Phone p = list.get(i);
int price = p.getPrice();
if (price < 3000) {
resultList.add(p);
}
}
return resultList;
}
其中的JavaBean类Phone如下
public class Phone {
private String brand;
private int price;
public Phone() {
}
public Phone(String brand, int price) {
this.brand = brand;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
本周学会了用markdown编写我的第二期博客,与第一期博客相比进步很多,上周写的我现在不忍直视 .
同时黑马程序员Java零基础视频教程_上部(2022新版)讲的很细,上面有啥没看懂,可以直接去他的视频找┑( ̄Д  ̄)┍.
继续学习,下周再见ヾ( ̄▽ ̄)ByeBye