记录学习Java基础中有关应用程序接口(API)的基础知识,包括两个常用类String和ArrayList类的介绍。
API是Application Programming Interface(应用程序编程接口)的缩写,它是一组预先定义的规则和规范,用于定义软件系统如何交互、通信或调用彼此的功能。
简单理解API就是封装好可直接调用的方法。
String s = “字符内容”;
public class Main {
public static void main(String[] args) {
System.out.println(generateVerificationCode());
}
public static String generateVerificationCode() {
// 定义一个字符串,包含所有可能的字符
String allChar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
StringBuilder sb = new StringBuilder();
Random random = new Random();
// 循环6次,随机获取一个字符并添加到StringBuilder中
for (int i = 0; i < 6; i++) {
int index = random.nextInt(allChar.length());
sb.append(allChar.charAt(index));
}
// 返回生成的验证码
return sb.toString();
}
}
上述代码首先定义了一个包含所有可能字符(数字、大写字母和小写字母)的字符串allChar
,然后创建了一个StringBuilder
对象来构建验证码。在循环中,每次随机生成一个索引,并通过该索引从allChar
中获取一个字符,将其添加到StringBuilder
中。最后返回由这6个随机字符组成的验证码字符串。
泛型(Generics)是一种编程语言特性,允许在定义类、接口和方法时使用类型参数(Type Parameters),这些类型参数在编译时可以被实际的类型所替换。通过这种方式,程序员可以在编写代码时推迟指定具体的数据类型,从而创建可重用性强、类型安全的代码组件。
例如,在Java中可以定义一个泛型类:
public class MyGenericClass<T> {//声明时使用T表示未知类型
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
// 使用该泛型类
MyGenericClass<String> stringBox = new MyGenericClass<>();
stringBox.setValue("Hello");
String s = stringBox.getValue(); // 返回 "Hello"
在这个例子中,T
是一个类型参数,代表某种未知的类型。当实例化 MyGenericClass
时,我们可以将 T
替换为具体的类型,如 String
。这样,setValue
和 getValue
方法就能保证操作的是同一类型的对象,提高了类型安全性。
同样地,泛型也可以应用于接口、方法以及容器类,比如Java中的 List
或 Map
等。
由于在遍历过程中修改了集合长度,所以需要从后往前遍历以避免“并发修改异常”(漏掉未检)。
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> scores = new ArrayList<>();
//往ArrayList对象scores中添加数值
scores.add(98);
scores.add(77);
scores.add(66);
scores.add(89);
scores.add(79);
scores.add(50);
scores.add(100);
// 从后往前遍历,遇到低于80分的成绩就删除
for (int i = scores.size() - 1; i >= 0; i--) {
if (scores.get(i) < 80) {
scores.remove(i);
}
}
// 打印过滤后的成绩
for (int score : scores) {
System.out.println(score);
}
}
}
这样做的缺点是效率相对较低,因为每次删除元素后,列表后面的元素都需要向前移动一位。当需求中数据量较小,这种影响可以忽略不计。对于大量数据的处理,建议采用迭代器或Stream API的方式进行操作。
public class Student {
private int stuNum;//学号
private String stuName;//姓名
private int age;//年龄
private String stuClass;//班级
public Student(int stuNum, String stuName, int age, String stuClass) {
this.stuNum = stuNum;
this.stuName = stuName;
this.age = age;
this.stuClass = stuClass;
}
// Getter and Setter 方法
public int getStuNum() {
return stuNum;
}
public void setStuNum(int stuNum) {
this.stuNum = stuNum;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getStuClass() {
return stuClass;
}
public void setStuClass(String stuClass) {
this.stuClass = stuClass;
}
@Override
public String toString() {
return "Student{" +
"stuNum=" + stuNum +
", stuName='" + stuName + '\'' +
", age=" + age +
", stuClass='" + stuClass + '\'' +
'}';
}
}
接下来是基于ArrayList实现存储、展示学生信息和搜索功能的后台程序:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
// 添加学生信息
students.add(new Student(114514, "张三", 20, "软件工程1班"));
students.add(new Student(114214, "李四", 21, "软件工程2班"));
// ... 其他学生信息
// 展示所有学生信息
for (Student student : students) {
System.out.println(student);
}
Scanner scanner = new Scanner(System.in);
while (true) { // 使用死循环让用户可以不停搜索
System.out.println("\n请输入要搜索的学生学号:");
int searchId = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
Student foundStudent = searchById(students, searchId);
if (foundStudent != null) {
System.out.println("找到的学生信息:");
System.out.println(foundStudent);
} else {
System.out.println("未找到对应学号的学生信息!");
}
}
}
// 定义按学号搜索学生的函数
public static Student searchById(ArrayList<Student> students, int id) {
for (Student student : students) {
if (student.getStuNum() == id) {
return student;
}
}
return null; // 如果没有找到,则返回null
}
}