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;
}

}
posted @ 2022-05-30 14:32  zhaqiliang  阅读(31)  评论(0)    收藏  举报