1. 程式人生 > >Java基礎【自定義類 ArrayList集合】

Java基礎【自定義類 ArrayList集合】

第6天 Java基礎語法

今日內容介紹
 自定義類
 ArrayList集合

第1章 引用資料型別(類)

1.1 引用資料型別分類

提到引用資料型別(類),其實我們對它並不陌生,如使用過的Scanner類、Random類。
我們可以把類的型別為兩種:

 第一種,Java為我們提供好的類,如Scanner類,Random類等,這些已存在的類中包含了很多的方法與屬性,可供我們使用。
 第二種,我們自己建立的類,按照類的定義標準,可以在類中包含多個方法與屬性,來供我們使用。
這裡我們主要介紹第二種情況的簡單使用。

1.2 自定義資料型別概述

我們在Java中,將現實生活中的事物抽象成了程式碼。這時,我們可以使用自定義的資料型別(類)來描述(對映)現實生活中的事物。
類,它是引用資料型別,與之前學習的所有引用資料型別相同,自定義類也是一種資料型別。只是自定義型別並非Java為我們預先提供好的型別,而是我們自己定義的一種引用資料型別用來描述一個事物。

1.3 類的定義與使用

java程式碼對映成現實事物的過程就是定義類的過程。
我們就拿一部手機進行分析,它能用來做什麼呢?它可以打電話,上網,聊微信等,這些就是手機所提供的功能,也就是方法;手機也有它的特徵,如顏色、尺寸大小、品牌型號等,這些就是手機的特徵,也就是屬性。
目前,我們只關注類中的屬性,類中的方法在面向物件部分再進行學習。

1.3.1 類的定義格式

 類的定義格式:
建立java檔案,與類名相同

public class 類名{
資料型別  屬性名稱1;
資料型別  屬性名稱2;
…}

通過類的定義格式,來進行手機類的描述,如下所示

public class Phone {
	/*
	 * 屬性
	 */
	String brand;// 品牌型號
	String color;// 顏色
	double size; // 尺寸大小
}

上述程式碼,就是建立一個類的的過程,類的名稱我們給起名為Phone,類中包含了三個屬性(brand品牌型號、color顏色、size尺寸大小)。注意,類中定義的屬性沒有個數要求。

1.3.2 類的使用格式

Phone類定義好後,我們就可以使用這個類了,使用方式和使用引用資料型別Scanner類相似。格式如下:

導包:我們將所有的類放到同一個資料夾下,可以避免導包。
建立物件:資料型別 變數名 = new 資料型別();
呼叫方法:目前我們定義的自定義類不涉及方法,只是屬性(自定義類中的方法部分在面向物件部分講解)
訪問屬性:變數名.屬性 (這是當前的方式,後期會採取呼叫方法的方式替代掉直接訪問的方式來完成對屬性的訪問。)

當有了Phone資料型別的變數後,我們就可以使用Phone類中的屬性了。對屬性的訪問我們來演示一下,如下所示:

public class Test {
	public static void main(String[] args) {
		//定義了一個Phone型別的變數p
		Phone p = new Phone();
		/*
		 * 通過p,使用Phone中的屬性
		 */
		//訪問p中的brand品牌屬性
p.brand = "蘋果6s";
//訪問p中的color顏色屬性
		p.color = "白色";
//訪問p中的size尺寸大小屬性
p.size = 5.5;

System.out.println("手機品牌為" + p.brand);
System.out.println("手機顏色為" + p.color);
System.out.println("手機尺寸大小為" + p.size);
	}
}
執行結果如下所示

在這裡插入圖片描述 圖1-1 執行結果

1.3.3 自定義型別注意事項與記憶體圖

上述程式碼中,通過類Phone創建出來的變數p,它相當於我們生活中的盒子,裡面包含了它能夠使用的屬性。
 通過 p.屬性名 就可以對屬性進行操作
 與引用型別陣列類似,引用型別的自定義型別的變數,直接變數時,結果為物件地址值,這裡可以通過記憶體圖簡單解釋。
在這裡插入圖片描述

1.4 自定義型別練習

學習了引用資料型別(類)以後,我們就能夠使用類描述任何東西了。看幾個具體的描述,如下:

 電飯鍋,包含屬性(品牌、容量大小、顏色等)
 汽車,包含屬性(品牌、排量、型別等)
 學生,包含屬性(姓名,年齡,性別等)


第2章 ArrayList集合

在前面我們學習了陣列,陣列可以儲存多個元素,但在某些情況下無法確定到底要儲存多少個元素,此時陣列將不再適用,因為陣列的長度不可變。例如,要儲存一個學校的學生,由於不停有新生來報道,同時也有學生畢業離開學校,這時學生的數目很難確定。為了儲存這些數目不確定的元素,JDK中提供了一系列特殊的類,這些類可以儲存任意型別的元素,並且長度可變,統稱為集合。在這裡,我們先介紹ArrayList集合,其他集合以後在學習。
ArrayList集合是程式中最常見的一種集合,它屬於引用資料型別(類)。在ArrayList內部封裝了一個長度可變的陣列,當存入的元素超過陣列長度時,ArrayList會在記憶體中分配一個更大的陣列來儲存這些元素,因此可以將ArrayList集合看作一個長度可變的陣列

2.1 集合的建立

建立集合的常用格式在此說明一下:

導包:import java.util.ArrayList;
建立物件:與其他普通的引用資料型別建立方式完全相同,但是要指定容器中儲存的資料型別
ArrayList<要儲存元素的資料型別> 變數名 = new ArrayList<要儲存元素的資料型別>();
 集合中儲存的元素,只能為<>括號中指定的資料型別元素;
 “<要儲存元素的資料型別>”中的資料型別必須是引用資料型別,不能是基本資料型別;

下面給出8種基本資料型別所對應的引用資料型別表示形式:
在這裡插入圖片描述

我們通過舉幾個例子,來明確集合的建立方式:

儲存String型別的元素:

ArrayList<String> list = new ArrayList<String>();

儲存int型別的資料:

ArrayList<Integer> list = new ArrayList<Integer>(); 

儲存Phone型別的資料:

ArrayList<Phone> list = new ArrayList<Phone>();

2.2 集合中常用方法

接下來,我們來學習下ArrayList集合提供的一些常用方法,如下表:
在這裡插入圖片描述
通過程式碼演示上述方法的使用。ArrayListDemo01.java

import java.util.ArrayList;
public class ArrayListDemo01 {
	public static void main(String[] args) {
		// 建立ArrayList集合
		ArrayList<String> list = new ArrayList<String>();
		// 向集合中新增元素
		list.add("stu1");
		list.add("stu2");
		list.add("stu3");
		list.add("stu4");
		// 獲取集合中元素的個數
		System.out.println("集合的長度:" + list.size());
		// 取出並列印指定位置的元素
		System.out.println("第1個元素是:" + list.get(0));
		System.out.println("第2個元素是:" + list.get(1));
		System.out.println("第3個元素是:" + list.get(2));
		System.out.println("第4個元素是:" + list.get(3));
	}
}

強調一點,ArrayList集合相當於是一個長度可變的陣列,所以訪問集合中的元素也是採用索引方式訪問,第一個元素儲存在索引0的位置,第二個元素儲存在索引1的位置,依次類推。

2.3 集合的遍歷

通過集合遍歷,得到集合中每個元素,這是集合中最常見的操作。集合的遍歷與陣列的遍歷很像,都是通過索引的方式,集合遍歷方式如下:ArrayListDemo02.java

 1	import java.util.ArrayList;
 2	public class ArrayListDemo02 {
 3		public static void main(String[] args) {
 4			//建立ArrayList集合
 5			ArrayList<Integer> list = new ArrayList<Integer>();
 6			//新增元素到集合
 7			list.add(13);
 8			list.add(15);
 9			list.add(22);
 10			list.add(29);
 11			//遍歷集合
 12			for (int i = 0; i < list.size(); i++) {
 13				//通過索引,獲取到集合中每個元素
 14				int n = list.get(i);
 15				System.out.println(n);
 16			}
 17		}
 18	}

上述程式碼中,第5行定義了一個可以儲存int元素的集合;第7-10行,實現將int型別數值儲存到集合中;第12-16行,實現遍歷集合元素。這裡要強調一點,get方法返回值的型別為集合中元素的型別。

2.4 集合中的常用方法補充

ArrayList集合提供的一些常用方法,如下表:
在這裡插入圖片描述

 boolean add(int index, Object obj)
	功能:在集合中指定index位置,新增新元素obj
	功能說明:假設集合list中有元素[“java”,“javaEE”],當使用add(1,“javaWeb”)後,集合list中的元素為[“java”,“javaWeb”,“JavaEE”]。
 Object set(int index, Object obj)
	功能:用指定元素obj替代集合中指定index位置的元素
	功能說明:假設集合list中有元素[“java”,“javaEE”],當使用set(0,“javaWeb”)後,集合list中的元素為[“javaWeb”,“JavaEE”]。
 Object remve(int index)
	功能:從集合中刪除指定index處的元素,返回該元素
	功能說明:假設集合list中有元素[“java”,“javaEE”],當使用remove(0)後,集合list中的元素為[“JavaEE”],返回值為“java”。
 void clear()
	功能:清空集合中所有元素
	功能說明:假設集合list中有元素[“java”,“javaEE”],當使用clear()後,集合list中的元素為空[]。

第3章 隨機點名器案例

3.1 案例介紹
隨機點名器,即在全班同學中隨機的找出一名同學,列印這名同學的個人資訊。
此案例在我們昨天課程學習中,已經介紹,現在我們要做的是對原有的案例進行升級,使用新的技術來實現。
我們來完成隨機點名器,它具備以下3個內容:

 儲存所有同學姓名
 總覽全班同學姓名
 隨機點名其中一人,列印到控制檯

3.2 案例需求分析
全班同學中隨機的找出一名同學,列印這名同學的個人資訊。
我們對本案例進行分析,得出如下分析結果:

1.儲存全班同學資訊(姓名、年齡)
2.列印全班同學每一個人的資訊(姓名、年齡)
3.在班級總人數範圍內,隨機產生一個隨機數,查詢該隨機數所對應的同學資訊(姓名、年齡)
隨機點名器明確地分為了三個功能。如果將多個獨立功能的程式碼寫到一起,則程式碼相對冗長,我們可以針對不同的功能可以將其封裝到一個方法中,將完整獨立的功能分離出來。
而在儲存同學姓名時,如果對每一個同學都定義一個變數進行姓名儲存,則會出現過多孤立的變數,很難一次性將全部資料持有。此時,我們採用ArrayList集合來解決多個學生資訊的儲存問題。

3.3 實現程式碼步驟
每名學生都擁有多項個人資訊,為了方便管理每個人的資訊,我們對學生資訊進行封裝,編寫Student.java檔案

/**
 * 學生資訊類
 */
public class Student {
	String name; //姓名
	int age; //年齡
}
上述程式碼中,對學生資訊(姓名、年齡)進行了封裝。這樣做的好處在於,以後只要找到這名學生,就能夠知道他的每項個人資訊了。

接下來我們編寫CallName.java檔案,完成程式的編寫。

 main方法中呼叫三個獨立方法

public static void main(String[] args) {
	ArrayList<Student> list = new ArrayList<Student>(); //1.1建立一個可以儲存多個同學名字的容器
	/*
	 * 1.儲存全班同學資訊
	 */
	addStudent(list);
	/*
	 * 2.列印全班同學每一個人的資訊(姓名、年齡)
	 */
	printStudent(list);
	/*
	 * 3.隨機對學生點名,列印學生資訊
	 */
	randomStudent(list);
}

 儲存所有學生的個人資訊

/**
 * 1.儲存全班同學名字
 */
public static void addStudent(ArrayList<Student> list) {
	//鍵盤輸入多個同學名字儲存到容器中
	Scanner sc = new Scanner(System.in);
	for (int i = 0; i < 3; i++) {
		//建立學生
		Student s = new Student();
		System.out.println("儲存第"+i+"個學生姓名:");
		s.name = sc.next();
		System.out.println("儲存第"+i+"個學生年齡:");
		s.age = sc.nextInt();
		//新增學生到集合
		list.add(s);
	}
}
上述方法中,方法引數list中用來表示已儲存所有學生。通過Scanner,完成新學生資訊(姓名,年齡)的錄入,並將學生新增到集合中。

 列印全班同學每一個人的資訊

/**
 * 2.列印全班同學每一個人的資訊(姓名、年齡)
 */
public static void printStudent (ArrayList<Student> list) {
	for (int i = 0; i < list.size(); i++) {
		Student s = list.get(i);
		System.out.println("姓名:"+s.name +",年齡:"+s.age);
	}
}
上述方法中,方法引數list中用來表示已儲存所有學生。通過遍歷集合中的每個元素,得到每個同學資訊,並輸出列印。

 隨機對學生點名,列印學生資訊

/**
 * 3.隨機對學生點名,列印學生資訊
 */
public static void randomStudent (ArrayList<Student> list) {
	//在班級總人數範圍內,隨機產生一個隨機數
	int index = new Random().nextInt(list.size());
	//在容器(ArrayList集合)中,查詢該隨機數所對應的同學資訊(姓名、年齡)
	Student s = list.get(index);
	System.out.println("被隨機點名的同學:"+s.name + ",年齡:" + s.age);
}
上述方法中,通過隨機數類Random產生一個從0到集合長度的隨機索引。使用該索引獲取ArrayList集合中對應的值,便得到了全班同學的隨機學生資訊並列印。

第4章 庫存管理案例

4.1 案例介紹
現在,我們將原有的庫存管理案例,採用更好的集合方式實現。
在這裡插入圖片描述

將對下列功能進行方法封裝:
 列印庫存清單功能
 庫存商品數量修改功能
 退出程式功能

4.2 案例需求分析
管理員能夠進行的操作有3項(檢視、修改、退出),我們可以採用(switch)選單的方式來完成。
-------------庫存管理------------

1.檢視庫存清單
2.修改商品庫存數量
3.退出
請輸入要執行的操作序號:
每一項功能操作,我們採用方法進行封裝,這樣,可使程式的可讀性增強。
選擇“1.檢視庫存清單”功能,則控制檯列印庫存清單
選擇“2.修改商品庫存數量”功能,則對每種商品庫存數進行更新
選擇“3.退出”功能,則退出庫存管理,程式結束

4.3 實現程式碼步驟
每種庫存商品都擁有多項商品資訊,為了方便管理每種商品的資訊,我們對商品資訊進行封裝,編寫Goods.java檔案

/*
 * 庫存商品類
 */
public class Goods {
	String brand; // 商品品牌型號
	double size; // 商品尺寸大小
	double price; // 商品價格
	int count; // 商品庫存個數
}
上述程式碼中,對商品資訊(品牌、尺寸、價格、庫存數)進行了封裝。這樣做的好處在於,以後只要找到這個商品,就能夠知道該商品的每項資訊了。

編寫Demo庫存管理.java,完成如下功能:
 功能選單

/**
 * 庫存管理功能選單
 * @return 管理員鍵盤輸入的功能操作序號 
 */
public static int chooseFunction() {
	System.out.println("-------------庫存管理------------");
	System.out.println("1.檢視庫存清單");
	System.out.println("2.修改商品庫存數量");
	System.out.println("3.退出");
	System.out.println("請輸入要執行的操作序號:");
	//接收鍵盤輸入的功能選項序號
	Scanner sc = new Scanner(System.in); 
	int choose = sc.nextInt();
	return choose;
}
上述方法用來完成庫存管理功能選單的顯示、接收管理員選擇的功能操作序號。這是完成了案例的第一步。接下來完成“檢視、修改、退出”這三項功能。

 編寫main主方法,呼叫庫存管理功能選單方法,與“檢視、修改、退出”這三個方法。

public static void main(String[] args) {
	//記錄庫存商品資訊
	ArrayList<Goods> list = new ArrayList<Goods>();
	//新增商品到庫存
	addStore(list);
	
	//通過while迴圈模擬管理員進行功能重複選擇操作
	while (true) {
		//列印功能選單操作,接收鍵盤輸入的功能選項序號
		int choose = chooseFunction();
		//執行序號對應的功能
		switch (choose) {
		case 1://檢視庫存清單
			printStore(list);
			break;
		case 2://修改商品庫存數量
			update(list);
			break;
		case 3://退出
			exit();
			return;
		default:
			System.out.println("----------------------------------");
			System.out.println("功能選擇有誤,請輸入正確的功能序號!");
			break;
		}
	}
}

在主方法中,建立了ArrayList集合,用來儲存庫存商品資訊,通過接收到的功能選項序號,進行switch語句判斷後,呼叫對應的功能方法。

 檢視庫存清單功能

/**
 * 檢視庫存清單
 */
public static void printStore(ArrayList<Goods> list) {
	//統計總庫存個數、統計庫存總金額
	int totalCount = 0;
	double totalMoney = 0.0;
	//列表頂部
	System.out.println("---------------------------檢視庫存清單--------------------------");
	System.out.println("品牌型號		尺寸	價格	庫存數");
	//列表中部
	for (int i = 0; i < list.size(); i++) {
		Goods item = list.get(i);
		System.out.println(item.brand+"	"+item.size+"	"+item.price+"	"+ item.count);
		//統計總庫存個數、統計庫存總金額
		totalCount += item.count;
		totalMoney += item.count * item.price;
	}
	//列表底部
	System.out.println("-------------------------------------------------------------");
	System.out.println("總庫存數:"+totalCount); 
	System.out.println("庫存商品總金額:"+totalMoney);
}
上述方法用來完成列印庫存清單功能,引數list表示庫存商品相關資訊集合。

 修改商品庫存數量功能

/**
 * 修改商品庫存數量
 */
public static void update(ArrayList<Goods> list){
	System.out.println("------------修改商品庫存數量-----------");
	for (int i = 0; i < list.size(); i++) {
		Goods item = list.get(i);
		System.out.println("請輸入"+ item.brand +"商品庫存數量");
		item.count = new Scanner(System.in).nextInt();
		list.set(i, item);
	}
}
上述方法用來完成修改商品庫存數量功能,引數list表示庫存商品相關資訊集合。

 退出功能

/**
 * 退出
 */
public static void exit(){
	System.out.println("----------------退出---------------");
	System.out.println("您已退出系統");
}	
上述方法用來完成退出程式的功能

第5章 總結

5.1 知識點總結

1.	引用資料型別(類)

 類的型別為兩種:
 第一種,Java為我們提供好的類,如Scanner類,Scanner類等,這些已存在的類中包含了很多的方法與屬性,可供我們使用。
 第二種,我們自己建立的類,按照類的定義標準,可以在類中包含多個方法與屬性,來供我們使用。
 建立類的格式
public class 類名 {
//可以定義屬性
//也可以定義方法
}
 使用類的格式:
類名 變數名 = new 類名();
 使用類中的屬性與方法格式
使用屬性: 變數名.屬性
使用方法: 變數名.方法()

2.	ArrayList集合

 它屬於引用資料型別(類)。我們可以看作一個長度可變的陣列。
 建立集合的方式
ArrayList<要儲存元素的資料型別> 變數名 = new ArrayList<要儲存元素的資料型別>();

集合中的常用方法
 boolean add(Object obj)
 Object get(int index)
 int size()
 boolean add(int index, Object obj)
 Object set(int index, Object obj)
 Object remve(int index)
 void clear()**