ZQL-5.30作业
一、范型回顾:
1.范型1-数组回顾及优缺点
数组的特点:
1、属于引用数据类型。
2、只能保存同一种数据类型。
3、数组的长度一旦分配不可改变。
优点:可高效运行。
缺点:无法直接删除和增加元素。
2.范型2-ArrayList的使用及缺点分析
操作:
1、定义ArrayList对象
ArrayList list = new ArrayList();
2、添加元素为 1,2,3
list.add(1);
list.add(2);
list.add(3);
3、修改第一个元素为100
list.set(0)=100;
4、删除最后一个元素
list.remove(list.size()-1)
5、遍历所有元素,在增加100后输出。
遍历时注意转型
优点:
不必在最开始就确定长度,当数据数量超过默认长度会自动增加,可以实现对数据的自动装箱,可以存放多种数据类型,可以直接进行数据的增删。
缺点:
默认为Object类型,这样保存的数据在使用时有时需要强转,容易出错。
3.范型3-入门-用范型解决隐患问题
范型:
1、概念:将数据类型作为可以变化的“参数",就是"范型"。
2、先定义:<数据类型占位符>
3、后使用:在使用时只能是"引用"数据类型。
如:对于集合类(如ArrayList),如果没有指定范型,则默认为<0bject>。
小结:
1、范型定义就是写在<>中的一个占位符,通常是一个大写字母。
习惯上常用字母:E、T、K、V。
2、范型的使用是指在定义容器类(如ArrayList)时指定
具体的引用数据类型,如: Integer。
范型作用:
1、保证了类型的安全性。
说明:没有泛型,则容器中可以加入任何数据类型的元素,不安全。
2、提升性能
说明:避免了不必要的装箱、拆箱操作,提高程序的性能
4.范型4-定义-范型类
语法:public class 类名<字母>
5.范型5-定义-范型方法
1、在定义方法时,先定义范型参数并马上用在返回值或形参中。
这样的方法的就是范型方法。
2、范型方法与所在类是否为范型类无关。
范型:将数据类型作为可以变化的“参数",就是“范型"。
三种语法:
1、: <T> void方法名(T变量名)
2、:<T> T 方法名()
3、:<T> T 方法名(T 变量名)
6.范型6-定义-范型接口
范型接口:指在接口定义时指定范型。
定义
public interface Ishow<T> {
void show(T value);{}
7.范型7-通配符1-问号
1、List<?>就声明了List中包含的元素类型是未知的。
通配符所代表的其实是"一种数据类型",但具体的类型是未知的。
2、ListList<?>并不等同于List<0bject>。
List<0bject>集合中可以包含任何"多种数据类型"的元素。
8.范型8-通配符2-问号extends类
语法: List<? extends类>
作用:限定只能是某个类或者这个类子类呢。
List<? extends类>:
限制条件理解
1、可以接受的集合的数据类型为该类类型
2、或者为该类的子类类型
9.范型9-通配符3-问号super类
语法: List<?super类>
作用:限定只能是某个类或者这个类的"父类"
10.范型10-通配符4-问号extends接口
语法: List<?extends 接口>
作用:限定只能是实现了这个接口的类
二、项目检查:
定时编程作业:(40分钟) 需求:用户注册功能。用户通过控制台输入姓名和密码,如果用户名和密码满足规则,则打印注册成功。 提示: 1、目前规则是用户名必须以字母打头,后面可以跟字母和数字,其中字母必须同时包含大小时字母。同时两次密码要相同。 2、用户提出的规则可能会变化。假设每次规则都会被不同的系统在使用。 3、使用Scanner类。 4、使用Character类,可以查API文档。 5、可以考虑使用“测试先行”的开发方法。 6、可以考虑将界面数据和业务数据分开(仅提示,不懂没关系)。
注册界面:
package com.iit.demo; import com.iit.entity.User; import java.util.Scanner; public class Start { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.next(); System.out.println("请输入密码:"); String password1 = sc.next(); System.out.println("请再次输入密码:"); String password2 = sc.next(); User user = new User(username, password1, password2); boolean b1 = user.checkUsername(); boolean b2 = user.checkPassword(); user.register(b1, b2); } }
用户界面:
package com.iit.entity; public class User { public String username; public String password1; public String password2; public User() { } public User(String username, String password1, String password2) { this.username = username; this.password1 = password1; this.password2 = password2; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword1() { return password1; } public void setPassword1(String password1) { this.password1 = password1; } public String getPassword2() { return password2; } public void setPassword2(String password2) { this.password2 = password2; } @Override public String toString() { return "User{" + "username='" + username + '\'' + '}'; } public void register(boolean b1, boolean b2) { if (b1 && b2) { System.out.printf("用户%s注册成功!", username); } else { System.out.printf("注册失败!"); } } public boolean checkPassword() { return password1.equals(password2); } public boolean checkUsername() { //用户名合法 boolean check = false; //用户名必须以字母打头 boolean check1=false; //后面可以跟字母和数字 boolean check2 = true; //字母必须同时包含大小字母 boolean check3; //包含大写字母 boolean check4 = false; //包含小写字母 boolean check5 = false; //获取首字母 char firstChar = username.charAt(0); //判断首字母是否是字母 if(firstChar>=65&&firstChar<=90 || firstChar>=97&&firstChar<=122){ check1 =true; } //后面可以跟字母和数字 for (int i = 1; i < username.length(); i++) { if (!Character.isAlphabetic(username.charAt(i)) && !Character.isDigit(username.charAt(i))) { check2 = false; break; } } //判断包含大写字母 for (int i = 0; i < username.length(); i++) { if (Character.isAlphabetic(username.charAt(i))) { if (Character.isLowerCase(username.charAt(i))) { check4 = true; } } } //判断包含小写字母 for (int i = 0; i < username.length(); i++) { if (Character.isAlphabetic(username.charAt(i))) { if (Character.isUpperCase(username.charAt(i))) { check5 = true; } } } //字母必须同时包含大小字母 check3 = check4 && check5; //用户名合法 if (check1 && check2 && check3) { check = true; } return check; } }
测试:
package user; import com.iit.entity.User; import org.junit.Assert; import org.junit.Test; public class TestUser { @Test public void testPassword1(){ User user = new User("张三", "123456", "123456"); boolean actual = user.checkPassword(); Assert.assertEquals("测试不通过",true,actual); } @Test public void testPassword2(){ User user = new User("张三", "dasdasd", "1234"); boolean actual = user.checkPassword(); Assert.assertEquals("测试不通过",false,actual); } @Test public void testUsername1(){ User user = new User("啊sM123", "1235", "1234"); boolean actual = user.checkUsername(); Assert.assertEquals("测试不通过",false,actual); } @Test public void testUsername2(){ User user = new User("Mike", "1235", "1234"); boolean actual = user.checkUsername(); Assert.assertEquals("测试不通过",true,actual); } }
package com.iit.entity;
public class User {
public String username;
public String password1;
public String password2;
public User() {
}
public User(String username, String password1, String password2) {
this.username = username;
this.password1 = password1;
this.password2 = password2;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword1() {
return password1;
}
public void setPassword1(String password1) {
this.password1 = password1;
}
public String getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
public void register(boolean b1, boolean b2) {
if (b1 && b2) {
System.out.printf("用户%s注册成功!", username);
} else {
System.out.printf("注册失败!");
}
}
public boolean checkPassword() {
return password1.equals(password2);
}
public boolean checkUsername() {
//用户名合法
boolean check = false;
//用户名必须以字母打头
boolean check1=false;
//后面可以跟字母和数字
boolean check2 = true;
//字母必须同时包含大小字母
boolean check3;
//包含大写字母
boolean check4 = false;
//包含小写字母
boolean check5 = false;
//获取首字母
char firstChar = username.charAt(0);
//判断首字母是否是字母
if(firstChar>=65&&firstChar<=90 || firstChar>=97&&firstChar<=122){
check1 =true;
}
//后面可以跟字母和数字
for (int i = 1; i < username.length(); i++) {
if (!Character.isAlphabetic(username.charAt(i)) && !Character.isDigit(username.charAt(i))) {
check2 = false;
break;
}
}
//判断包含大写字母
for (int i = 0; i < username.length(); i++) {
if (Character.isAlphabetic(username.charAt(i))) {
if (Character.isLowerCase(username.charAt(i))) {
check4 = true;
}
}
}
//判断包含小写字母
for (int i = 0; i < username.length(); i++) {
if (Character.isAlphabetic(username.charAt(i))) {
if (Character.isUpperCase(username.charAt(i))) {
check5 = true;
}
}
}
//字母必须同时包含大小字母
check3 = check4 && check5;
//用户名合法
if (check1 && check2 && check3) {
check = true;
}
return check;
}
}

浙公网安备 33010602011771号