1.ArrayList
集合和陣列的優勢對比:
- 長度可變
- 新增資料的時候不需要考慮索引,預設將資料新增到末尾
1.1 ArrayList類概述
什麼是集合
提供一種儲存空間可變的儲存模型,儲存的資料容量可以發生改變
ArrayList集合的特點
長度可以變化,只能儲存引用資料型別。
泛型的使用
用於約束集合中儲存元素的資料型別
1.2 ArrayList類常用方法
1.2.1 構造方法
方法名 | 說明 |
---|---|
public ArrayList() | 建立一個空的集合物件 |
1.2.2 成員方法
方法名 | 說明 |
---|---|
public boolean add(要新增的元素) | 將指定的元素追加到此集合的末尾 |
public boolean remove(要刪除的元素) | 刪除指定元素,返回值表示是否刪除成功 |
public E remove(int index) | 刪除指定索引處的元素,返回被刪除的元素 |
public E set(int index,E element) | 修改指定索引處的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引處的元素 |
public int size() | 返回集合中的元素的個數 |
1.2.3 示例程式碼
public class ArrayListDemo02 {
public static void main(String[] args) {
//建立集合
ArrayList<String> array = new ArrayList<String>();
//新增元素
array.add("hello");
array.add("world");
array.add("java");
//public boolean remove(Object o):刪除指定的元素,返回刪除是否成功
// System.out.println(array.remove("world"));
// System.out.println(array.remove("javaee"));
//public E remove(int index):刪除指定索引處的元素,返回被刪除的元素
// System.out.println(array.remove(1));
//IndexOutOfBoundsException
// System.out.println(array.remove(3));
//public E set(int index,E element):修改指定索引處的元素,返回被修改的元素
// System.out.println(array.set(1,"javaee"));
//IndexOutOfBoundsException
// System.out.println(array.set(3,"javaee"));
//public E get(int index):返回指定索引處的元素
// System.out.println(array.get(0));
// System.out.println(array.get(1));
// System.out.println(array.get(2));
//System.out.println(array.get(3)); //?????? 自己測試
//public int size():返回集合中的元素的個數
System.out.println(array.size());
//輸出集合
System.out.println("array:" + array);
}
}
1.3 ArrayList儲存字串並遍歷
1.3.1 案例需求
建立一個儲存字串的集合,儲存3個字串元素,使用程式實現在控制檯遍歷該集合
1.3.2 程式碼實現
public class ArrayListDemo3 {
public static void main(String[] args) {
//1.建立集合物件
ArrayList<String> list = new ArrayList<>();
//2.新增元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
//3.遍歷
//快捷鍵: list.fori 正向遍歷
//list.forr 倒著遍歷
System.out.print("[");
for (int i = 0; i < list.size(); i++) {
//i 依次表示集合裡面的每一個索引
if(i == list.size() - 1){
//最大索引
System.out.print(list.get(i));
}else{
//非最大索引
System.out.print(list.get(i) + ", ");
}
}
System.out.print("]");
}
}
1.4 ArrayList儲存學生物件並遍歷
1.4.1 案例需求
建立一個儲存學生物件的集合,儲存3個學生物件,使用程式實現在控制檯遍歷該集合
1.4.2 程式碼實現
public class ArrayListDemo4 {
public static void main(String[] args) {
//1.建立集合物件,用來儲存資料
ArrayList<Student> list = new ArrayList<>();
//2.建立學生物件
Student s1 = new Student("zhangsan",16);
Student s2 = new Student("lisi",15);
Student s3 = new Student("wangwu",18);
//3.把學生物件新增到集合中
list.add(s1);
list.add(s2);
list.add(s3);
//4.遍歷
for (int i = 0; i < list.size(); i++) {
//i 依次表示集合中的每一個索引
Student stu = list.get(i);
System.out.println(stu.getName() + ", " + stu.getAge());
}
}
}
1.5 查詢使用者的索引
需求:
1,main方法中定義一個集合,存入三個使用者物件。
使用者屬性為:id,username,password
2,要求:定義一個方法,根據id查詢對應的學生資訊。
如果存在,返回索引
如果不存在,返回-1
程式碼示例:
public class ArrayListDemo6 {
public static void main(String[] args) {
/*需求:
1,main方法中定義一個集合,存入三個使用者物件。
使用者屬性為:id,username,password
2,要求:定義一個方法,根據id查詢對應的學生資訊。
如果存在,返回索引
如果不存在,返回-1*/
//1.建立集合物件
ArrayList<User> list = new ArrayList<>();
//2.建立使用者物件
User u1 = new User("001", "zhangsan", "123456");
User u2 = new User("002", "lisi", "1234");
User u3 = new User("003", "wangwu", "1234qwer");
//3.把使用者物件新增到集合當中
list.add(u1);
list.add(u2);
list.add(u3);
//4.呼叫方法,透過id獲取對應的索引
int index = getIndex(list, "001");
System.out.println(index);
}
//1.我要幹嘛? 根據id查詢對應的學生資訊
//2.我幹這件事情需要什麼才能完成? 集合 id
//3.方法的呼叫處是否需要繼續使用方法的結果?
//要用必須返回,不要用可以返回也可以不返回
//明確說明需要有返回值 int
public static int getIndex(ArrayList<User> list, String id) {
//遍歷集合得到每一個元素
for (int i = 0; i < list.size(); i++) {
User u = list.get(i);
String uid = u.getId();
if(uid.equals(id)){
return i;
}
}
//因為只有當集合裡面所有的元素都比較完了,才能斷定id是不存在的。
return -1;
}
}
1.6 判斷使用者的是否存在
public class ArrayListDemo5 {
public static void main(String[] args) {
/* 需求:
1,main方法中定義一個集合,存入三個使用者物件。
使用者屬性為:id,username,password
2,要求:定義一個方法,根據id查詢對應的學生資訊。
如果存在,返回true
如果不存在,返回false*/
//1.定義集合
ArrayList<User> list = new ArrayList<>();
//2.建立物件
User u1 = new User("001","zhangsan","123456");
User u2 = new User("002","lisi","12345678");
User u3 = new User("003","wangwu","1234qwer");
//3.把使用者物件新增到集合當中
list.add(u1);
list.add(u2);
list.add(u3);
//4.呼叫方法,查詢id是否存在
boolean result = contains(list, "001");
System.out.println(result);
}
//定義在測試類中的方法需要加static
//1.我要幹嘛? 我要根據id查詢學生是否存在
//2.我幹這件事情,需要什麼才能完成? 集合 id
//3.方法的呼叫處是否需要使用方法的結果?
//如果要用,必須返回,如果不用,可以返回也可以不返回
//但是本題明確說明需要返回
public static boolean contains(ArrayList<User> list, String id){
//迴圈遍歷集合,得到集合裡面的每一個元素
//再進行判斷
for (int i = 0; i < list.size(); i++) {
//i 索引 list.get(i); 元素
User u = list.get(i);
//判斷id是否存在,我是拿著誰跟誰比較
//需要把使用者物件裡面的id拿出來再進行比較。
String uid = u.getId();
if(id.equals(uid)){
return true;//return 關鍵字:作用就是結束方法。
}
}
//只有當集合裡面所有的元素全部比較完畢才能認為是不存在的。
return false;
}
}
2.學生管理系統
2.1學生管理系統實現步驟
案例需求
針對目前我們的所學內容,完成一個綜合案例:學生管理系統。該系統主要功能如下:
新增學生:透過鍵盤錄入學生資訊,新增到集合中
刪除學生:透過鍵盤錄入要刪除學生的學號,將該學生物件從集合中刪除
修改學生:透過鍵盤錄入要修改學生的學號,將該學生物件其他資訊進行修改
檢視學生:將集合中的學生物件資訊進行展示
退出系統:結束程式
實現步驟
定義學生類,包含以下成員變數
private String sid // 學生id
private String name // 學生姓名
private String age // 學生年齡
private String address // 學生所在地
學生管理系統主介面的搭建步驟
2.1 用輸出語句完成主介面的編寫
2.2 用Scanner實現鍵盤輸入
2.3 用switch語句完成選擇的功能
2.4 用迴圈完成功能結束後再次回到主介面學生管理系統的新增學生功能實現步驟
3.1 定義一個方法,接收ArrayList<Student>集合
3.2 方法內完成新增學生的功能
①鍵盤錄入學生資訊
②根據錄入的資訊建立學生物件
③將學生物件新增到集合中
④提示新增成功資訊
3.3 在新增學生的選項裡呼叫新增學生的方法學生管理系統的檢視學生功能實現步驟
4.1 定義一個方法,接收ArrayList<Student>集合
4.2 方法內遍歷集合,將學生資訊進行輸出
4.3 在檢視所有學生選項裡呼叫檢視學生方法學生管理系統的刪除學生功能實現步驟
5.1 定義一個方法,接收ArrayList<Student>集合
5.2 方法中接收要刪除學生的學號
5.3 遍歷集合,獲取每個學生物件
5.4 使用學生物件的學號和錄入的要刪除的學號進行比較,如果相同,則將當前學生物件從集合中刪除
5.5 在刪除學生選項裡呼叫刪除學生的方法學生管理系統的修改學生功能實現步驟
6.1 定義一個方法,接收ArrayList<Student>集合
6.2 方法中接收要修改學生的學號
6.3 透過鍵盤錄入學生物件所需的資訊,並建立物件
6.4 遍歷集合,獲取每一個學生物件。並和錄入的修改學生學號進行比較.如果相同,則使用新學生物件替換當前學生物件
6.5 在修改學生選項裡呼叫修改學生的方法退出系統
使用System.exit(0);退出JVM
2.2學生類的定義
public class Student {
private String id;
private String name;
private int age;
private String address;
//下面是空參,有參,get和set方法
}
2.3測試類的定義
public class StudentSystem {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
loop:
while (true) {
System.out.println("-----------------歡迎來到學生管理系統-------------------");
System.out.println("1:新增學生");
System.out.println("2:刪除學生");
System.out.println("3:修改學生");
System.out.println("4:查詢學生");
System.out.println("5:退出");
System.out.println("請輸入您的選擇:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch (choose) {
case "1" -> addStudent(list);
case "2" -> deleteStudent(list);
case "3" -> updateStudent(list);
case "4" -> queryStudent(list);
case "5" -> {
System.out.println("退出");
//break loop;
System.exit(0);//停止虛擬機器執行
}
default -> System.out.println("沒有這個選項");
}
}
}
//新增學生
public static void addStudent(ArrayList<Student> list) {
//利用空參構造先建立學生物件
Student s = new Student();
Scanner sc = new Scanner(System.in);
String id = null;
while (true) {
System.out.println("請輸入學生的id");
id = sc.next();
boolean flag = contains(list, id);
if(flag){
//表示id已經存在,需要重新錄入
System.out.println("id已經存在,請重新錄入");
}else{
//表示id不存在,表示可以使用
s.setId(id);
break;
}
}
System.out.println("請輸入學生的姓名");
String name = sc.next();
s.setName(name);
System.out.println("請輸入學生的年齡");
int age = sc.nextInt();
s.setAge(age);
System.out.println("請輸入學生的家庭住址");
String address = sc.next();
s.setAddress(address);
//把學生物件新增到集合當中
list.add(s);
//提示一下使用者
System.out.println("學生資訊新增成功");
}
//刪除學生
public static void deleteStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入要刪除的id");
String id = sc.next();
//查詢id在集合中的索引
int index = getIndex(list, id);
//對index進行判斷
//如果-1,就表示不存在,結束方法,回到初始選單
if(index >= 0){
//如果大於等於0的,表示存在,直接刪除
list.remove(index);
System.out.println("id為:" + id + "的學生刪除成功");
}else{
System.out.println("id不存在,刪除失敗");
}
}
//修改學生
public static void updateStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入要修改學生的id");
String id = sc.next();
int index = getIndex(list, id);
if(index == -1){
System.out.println("要修改的id" + id + "不存在,請重新輸入");
return;
}
//當程式碼執行到這裡,表示什麼?表示當前id是存在的。
//獲取要修改的學生物件
Student stu = list.get(index);
//輸入其他的資訊並修改
System.out.println("請輸入要修改的學生姓名");
String newName = sc.next();
stu.setName(newName);
System.out.println("請輸入要修改的學生年齡");
int newAge = sc.nextInt();
stu.setAge(newAge);
System.out.println("請輸入要修改的學生家庭住址");
String newAddress = sc.next();
stu.setAddress(newAddress);
System.out.println("學生資訊修改成功");
}
//查詢學生
public static void queryStudent(ArrayList<Student> list) {
if (list.size() == 0) {
System.out.println("當前無學生資訊,請新增後再查詢");
//結束方法
return;
}
//列印表頭資訊
System.out.println("id\t\t姓名\t年齡\t家庭住址");
//當程式碼執行到這裡,表示集合中是有資料的
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getId() + "\t" + stu.getName() + "\t" + stu.getAge() + "\t" + stu.getAddress());
}
}
//判斷id在集合中是否存在
public static boolean contains(ArrayList<Student> list, String id) {
//迴圈遍歷集合得到裡面的每一個學生物件
/*for (int i = 0; i < list.size(); i++) {
//拿到學生物件後,獲取id並進行判斷
Student stu = list.get(i);
String sid = stu.getId();
if(sid.equals(id)){
//存在,true
return true;
}
}
// 不存在false
return false;*/
return getIndex(list,id) >= 0;
}
//透過id獲取索引的方法
public static int getIndex(ArrayList<Student> list, String id){
//遍歷集合
for (int i = 0; i < list.size(); i++) {
//得到每一個學生物件
Student stu = list.get(i);
//得到每一個學生物件的id
String sid = stu.getId();
//拿著集合中的學生id跟要查詢的id進行比較
if(sid.equals(id)){
//如果一樣,那麼就返回索引
return i;
}
}
//當迴圈結束之後還沒有找到,就表示不存在,返回-1.
return -1;
}
}