續簡單學生管理系統、包裝類--day18

Day18

一、刪除的思考題

思考題:刪除功能可以省略第一步嗎?不可以

有第一步判斷學生信息合法性,如果信息不合法會直接結束返回

如果沒有第一步,將會在第二步判斷是否有該學生query循環匹配查找,數據量大情況,效率很低

二、學生管理系統 --功能實現

StudentManagerSystemImpl類

查詢功能

1.根據性別查詢學生對象數組

步驟

1.驗證學生信息合法性

2.獲取符合條件的人數

3.創建新數組

4.遍歷數據源,把符合條件的學生對象存入新數組中

@Override
public Student[] getStusByName(String name) {
//1.驗證學生信息合法性
if (!StuInfoUtil.isName(name)) {
return null;
}
//2.獲取符合條件的人數
int count = 0;
for (int i = 0; i < size; i++) {
if (stus[i].getName().equals(name)) {
count++;
}
}
if (count == 0) {
return null;
}
//3.創建新數組
Student[] newStus = new Student[count];
//4.遍歷數據源,把符合條件的學生對象存入新數組中
int index = 0;
for (int i = 0; i < size; i++) {
if (stus[i].getName().equals(name)) {
newStus[index++] = stus[i];
}
}
return newStus;
}

后面幾個相似

2.根據性別查詢學生對象數組

getStusBySex判斷時用“==”,不使用equals無法對基元類型char調用equals(char)

3.根據年齡查詢學生對象數組
4.根據班級號查詢學生對象數組

queryMenu

main方法中封裝前端查詢方法(多態)

步驟

  1. 查詢功能展示
  2. 聲明一個學生數組為空
  3. swicth匹配對應功能
  4. 優化基礎辦法,提示輸入查詢條件,學生系統調用相應方法查詢,根據條件獲取到的學生信息賦值給學生數組(多態)
  5. 對學生數組條件判斷,查詢成功打印數組(打印數組做成默認方法放在接口中),失敗打印錯誤信息
private static void queryMenu(Scanner scan, StudentManagerSystemImpl sms) {System.out.println("請選擇查詢的條件:");System.out.println("1 - 根據姓名查詢");System.out.println("2 - 根據性別查詢");System.out.println("3 - 根據年齡查詢");System.out.println("4 - 根據班級號查詢");int num = scan.nextInt();//第二種Student[] stus = null;//2switch (num) {case 1:System.out.println("請輸入需要查詢的姓名:");String name = scan.next();//2stus = sms.getStusByName(name);//第一種最基礎的辦法
//					 String name = scan.next();//1
//					 Student[] stus = sms.getStusByName(name);
//					 for (Student stu : stus) {
//						System.out.println(stu);
//					}break;case 2:System.out.println("請輸入需要查詢的性別:");char sex  = scan.next().charAt(0);stus = sms.getStusBySex(sex);break;case 3:System.out.println("請輸入需要查詢的起始年齡(包含):");int start = scan.nextInt();System.out.println("請輸入需要查詢的結束年齡(不包含):");int end = scan.nextInt();stus = sms.getStusByAge(start, end);break;case 4:System.out.println("請輸入需要查詢的班級號:");String classId = scan.next();stus = sms.getStusByClassId(classId);break;}if (stus != null) {//2
//打印數組做成默認方法sms.printStus(stus);
//					for (Student stu : stus) {
//						System.out.println(stu);
//					}} else {System.out.println("查詢錯誤");}}

三、包裝類

理解:

8種基本數據類型對應類

出現原因:

Java為純面向對象語言(萬物皆對象),8種基本數據類型不能new對象,

就破壞Java為純面向對象語言的特征,Java為8種基本數據類型分別匹配

了對應的類,這種類叫做包裝類/封裝類

基本數據類型包裝類繼承關系
byteByteObject.Number.Byte
shortShortObject.Number.Short
intIntegerObject.Number.Integer
longLongObject.Number.Long
floatFloatObject.Number.Float
doubleDoubleObject.Number.Double
charCharacterObject.Character
booleanBooleanObject.Boolean

注意:

1.int的包裝類的寫法為:Integer

2.char的包裝類的寫法為:Charater

3.其余基本數據類型的包裝類均是基本類型的首字母大寫

裝箱和拆箱

手動裝箱:

基本數據類型 -> 包裝類

int num =100;
Integer integer = Integer.valueOf(num);//靜態方法
System.out.println(integer);//String類型的100
手動拆箱:

? 包裝類 -> 基本數據類型

Integer integer = new Integer(100);
int num = integer.intValue();
System.out.println(num);//int類型的100
自動裝箱

Window的show View的Navigator查看bin目錄的class文件,再反編譯查看底層

JDK1.5開始的新特性

基本數據類型 -> 包裝類

int num = 100;
Integer integer = num;//底層實現:Integer.valueOf(num);
System.out.println(integer);
自動拆箱

包裝類 -> 基本數據類型

Integer integer = new Integer(100);
int num = integer;//底層實現:integer.intValue();
System.out.println(num);

深入Integer的底層原理

面試題

描述下列代碼的運行結果

	Integer integer1 = Integer.valueOf(100);Integer integer2 = Integer.valueOf(100);System.out.println(integer1 == integer2);//引用類型比較內存地址,trueInteger integer3 = Integer.valueOf(200);Integer integer4 = Integer.valueOf(200);System.out.println(integer3 == integer4);//引用類型比較內存地址,false

面試題:描述Integer的valueOf的底層原理
答:判斷輸入的int值是否在-127~128的區間內,如果在就從Integer的緩存類數組中獲取對象
如果不在,就重新new Integer的對象

MyInteger MyInteger1 = MyInteger.valueOf(100);
MyInteger MyInteger2 = MyInteger.valueOf(100);
System.out.println(MyInteger1 == MyInteger2);//true

MyInteger MyInteger3 = MyInteger.valueOf(200);
MyInteger MyInteger4 = MyInteger.valueOf(200);
System.out.println(MyInteger3 == MyInteger4);//超過范圍new對象,false

編寫MyInteger

步驟:

  1. 定義一個int變量

  2. 有參構造獲值

  3. intValue()返回值

  4. 重寫toSting使用valueOf()將int值轉換為String字符串再返回

  5. 編寫緩存類(靜態)

  6. 在緩存類中編寫靜態代碼塊初始化緩存數組

public class MyInteger {private int value;public MyInteger(int value) {super();this.value = value;}public int intValue(){return value;}//編寫MyInteger的valueOf判斷輸入的int值是否在-127~128的區間內,如果在就從Integer的緩存類數組中獲取對象,不在就重新new Integer的對象public static MyInteger valueOf(int i){if (i>=MyIntegerCache.low && i<=MyIntegerCache.hight) {return MyIntegerCache.cache[i + (-MyIntegerCache.low)];}return new MyInteger(i);}@Overridepublic String toString() {return String.valueOf(value);//將int值轉換為String字符串}//緩存類private static class MyIntegerCache {//沒有用到外部類的成員屬性就可制成靜態private static final int low = -128;//低位private static final int hight = 127;//高位private static final MyInteger[] cache;//緩存數組(-127~128的MyInteger的對象)static{//可用代碼塊//初始化緩存數組cache = new MyInteger[hight - low +1];int j = low;for (int i = 0; i < cache.length; i++) {cache[i] = new MyInteger(j++);}}}
}

測試

Integer integer = new Integer(100);System.out.println(integer);//100int num1 = integer.intValue();System.out.println(num1);//100MyInteger myInteger = new MyInteger(100);System.out.println(myInteger);//直接打印類的全路徑com.qf.package_class.MyInteger@15db9742//MyInteger中重寫toSting方法轉化value值之后,100int num2 = myInteger.intValue();
System.out.println(nm2);//100

四學生管理系統 --功能實現

StudentManagerSystemImpl類(多態,包裝類)

修改功能

注意:

用Object原因:ps:sex自動裝箱將char裝箱成Character,再將Character向上轉型成Object(多態),方法里面又要向下轉型

步驟:

  1. 判斷學生信息的合法性

  2. 判斷是否有該學生

  3. 判斷修改類型

  4. switch判斷修改類型,對應修改功能

    ? 優化:利用實現類中定義的靜態常量,提高代碼可讀性(程序定死的可以用)

  5. 對應功能:判斷修改的數據的合法性

    ? 修改數據

@Override
public int update(String classId, String id, int type, Object val) {//用Object原因:ps:sex自動裝箱將char裝箱成Character,再將Character向上轉型成Object(多態),方法里面又要向下轉型//1.判斷學生信息的合法性if (!StuInfoUtil.isClassId(classId) && !StuInfoUtil.isId(id)) {return -1;}//2.判斷是否有該學生int index = query(classId, id);if (index == -1) {return -2;}//3.判斷修改類型switch (type) {//		利用實現類中定義的靜態常量,提高代碼可讀性(程序定死的可以用)case NAME:String nameVal = (String)val;
//			外部傳進來的val處理,前端可以屏蔽掉
//			if (val instanceof String) {
//				String name = (String)val;
//			}//判斷修改的數據的合法性if (!StuInfoUtil.isName(nameVal)) {return -3;}//修改數據stus[index].setName(nameVal);break;case SEX:char sexVal = (Character) val;//強轉成Character類型,再自動拆箱成char類型//判斷修改的數據的合法性if (!StuInfoUtil.isSex(sexVal)) {return -3;}//修改數據stus[index].setSex(sexVal);break;case AGE:int ageVal = (Integer) val;//強轉成Integer類型,再自動拆箱成int類型//判斷修改的數據的合法性if (!StuInfoUtil.isAge(ageVal)) {return -3;}//修改數據stus[index].setAge(ageVal);break;case CLASS_ID:String classIdVal = (String)val;//判斷目標班級上是否有重復學生(即修改班級號對應班級是否已經存在學生 ps:2041 001 -> 2042 001)if (query(classIdVal, id) != -1) {return -4;}//判斷修改的數據的合法性if (!StuInfoUtil.isClassId(classIdVal)) {return -3;}//修改數據stus[index].setClassId(classIdVal);break;case ID:String idVal = (String)val;//判斷目標學號上是否有重復學生(即修改學號對應學號是否已經存在學生 ps:2041 001 -> 2041 002)if (query(classId, idVal) != -1) {return -5;}//判斷修改的數據的合法性if (!StuInfoUtil.isId(idVal)) {return -3;}//修改數據stus[index].setId(idVal);break;}return 1;}

updateMenu

main方法中封裝前端查詢方法(多態)

步驟:

  1. 提示輸入班級號、學號
  2. 查詢功能展示
  3. 聲明一個Object為空
  4. swicth匹配對應功能
  5. 優化基礎辦法,提示輸入查詢條件,學生系統調用相應方法查詢,根據條件獲取到的學生信息賦值給Object(多態,向上轉型)
  6. 獲取修改狀態碼:學生系統調用添加方法返回修改狀態碼
  7. 根據修改狀態碼進行條件判斷修改的情況息
private static void updateMenu(Scanner scan, StudentManagerSystemImpl sms) {System.out.println("請輸入需要修改學生的班級號:");String classId = scan.next();System.out.println("請輸入需要修改學生的學號:");String id = scan.next();System.out.println("請選擇需要修改的類型:");System.out.println("1 - 修改姓名");System.out.println("2 - 修改性別");System.out.println("3 - 修改年齡");System.out.println("4 - 修改班級號");System.out.println("5 - 修改學號");int type = scan.nextInt();System.out.println("請輸入修改的值");Object val = null;switch (type) {case 1:case 4:case 5://					String val = scan.next();val = scan.next();//String -> Objectbreak;case 2:val = scan.next().charAt(0);//char -> Character -> Objectbreak;case 3:val = scan.nextInt();//int -> Integer -> Objectbreak;default:System.out.println("修改失敗  -- 修改類型錯誤");return;}int updateCode = sms.update(classId, id, type, val);if (updateCode == -1) {System.out.println("修改失敗 -- 學生信息不合法");}else if (updateCode == -2) {System.out.println("修改失敗 -- 沒有該學生");	}else if (updateCode == -3) {System.out.println("修改失敗 -- 修改值的信息不合法");	}else if (updateCode == -4) {System.out.println("修改失敗 -- 目標班級上有學生");	}else if (updateCode == -5) {System.out.println("修改失敗 -- 目標學號上有學生");	}else if (updateCode == 1) {System.out.println("修改成功");	}}

總結

1.學生管理系統 – 刪除的思考題

2.學生管理系統 – 查詢功能

3.包裝類
概念
出現原因
手動裝箱、手動拆箱
自動裝箱、自動拆行
深入Integer的底層原理 – 重要!!!!

4.學生管理系統 – 修改功能

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717204.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯倒計時 43天 - 前綴和,單調棧

最大數組和 算法思路&#xff1a;利用前綴和化簡 for 循環將 n^2 簡化成 nn&#xff0c;以空間換時間。枚舉每個 m&#xff0c;m是刪除最小兩個數&#xff0c;那k-m就是刪除最大數&#xff0c;m<k&#xff0c;求和最大的值。暴力就是枚舉 m-O(n)&#xff0c;計算前 n-(k-m)的…

PCSA時鐘控制集成之時鐘門控級別

這一部分描述了&#xff1a; ? 時鐘門控的級別。 ? 實現最大效果的時鐘門位置。 ? 實現有效和高效時鐘門控的集成方法。 時鐘樹是由時鐘緩沖器構建的&#xff0c;這些緩沖器在時鐘源&#xff08;時鐘輸入或PLL&#xff09;與時鐘終端&#xff08;寄存器或RAM&#xff09…

ULN2003(COM的作用)

單路內部電路原理圖 三極管多級放大電路&#xff0c;最大可達到500ma&#xff1b; 典型應用&#xff1a; ULN2003屬于灌電流驅動方式&#xff1b;輸入與輸出電平反向&#xff0c;下拉4K電阻&#xff0c;為解決單片機上電IO瞬間不穩定&#xff1b; COM端 1.可懸空&#xff1a…

Java面題總結7

spring事務什么時候會失效 1:發生自調用&#xff0c;類里面使用this調用本類的方法&#xff08;&#xff09;此時這個this對象不是代理類&#xff0c;而是UserService對象本身 2&#xff1a;方法不是public 3&#xff1a;數據庫不支持事務 4&#xff1a;沒有被spring管理 …

git標簽操作

一.標簽管理 1.理解標簽 標簽 tag &#xff0c;可以簡單的理解為是對某次 commit 的?個標識&#xff0c;相當于起了?個別名,當我們需要回退到某個重要版本時&#xff0c;直接使?標簽就能很快定位到 2.創建標簽 ?先&#xff0c;切換到需要打標簽的分?上,然后&#xf…

經典目標檢測網絡Yolo——原理部分

目標檢測問題 分為兩個子問題: 找到圖片中哪些位置、哪些區域含有目標對象識別這些區域中的目標對象是什么基于CNN的目標檢測算法能夠很好的解決第二個問題,在一張圖片僅含一個對象,且該對象占據了整張圖片絕大部分面積時,基于CNN的對象識別算法具有很高的準確率。 一種定…

操作系統(1)——學習導論(Ⅱ)

目錄 小程一言專欄鏈接: [link](http://t.csdnimg.cn/6grrU) 學習導論&#xff08;Ⅱ&#xff09;操作系統-賞前人佳作大型操作系統大型操作系統的一些特點和功能舉例 服務器操作系統服務器操作系統特點和功能舉例 多處理器操作系統舉例 個人計算機操作系統舉例 掌上計算機操作…

什么是ACID屬性。在MySQL中,如何使用事務?給出一個使用事務的示例,并解釋其工作原理。

解釋什么是ACID屬性 ACID是數據庫事務正確執行的四個基本要素的縮寫&#xff0c;包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔離性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。這四個屬性…

設計模式:什么是設計模式?①

一、什么是設計模式&#xff1f; 1. 是一類程序設計思想 2. 是在大量實踐過程中摸索總結出的標準經驗提煉 3. 具有多樣性和豐富性&#xff0c;不同情況應用的思想不同 二、設計模式的好處 1. 代碼生產力和效率的提升 2. 讓代碼表現更為規整&#xff0c;簡潔。閱讀維護管理的成本…

【競技寶】DOTA2-夢幻聯賽S22:AR命懸一線 XG確定晉級淘汰賽

北京時間2024年2月28日&#xff0c;DOTA2夢幻聯賽S22的比賽在昨日進入小組賽第三個比賽日&#xff0c;本次夢幻聯賽共有AR、XG、IG三支中國區的隊伍參賽&#xff0c;那么經過三日激烈的比賽之后&#xff0c;目前三支隊伍的積分情況以及晉級形勢如何呢&#xff1f; XG XG是小組…

貪心(基礎算法)--- 區間選點

905. 區間選點 思路 &#xff08;貪心&#xff09;O(nlogn) 根據右端點排序 將區間按右端點排序 遍歷區間&#xff0c;如果當前區間左端點不包含在前一個區間中&#xff0c;則選取新區間&#xff0c;所選點個數加1&#xff0c;更新當前區間右端點。如果包含&#xff0c;則跳…

常見的算法

查找算法 基本查找 package MyApi.search;public class a01BasicSearchdemo01 {public static void main(String[] args) { int[] arr{131,127,147,81,103,23,7,79}; int number82;System.out.println(BasicSearch(arr,number));}public static boolean BasicSearch(int[] ar…

Java二叉樹(1)

&#x1f435;本篇文章將對二叉樹的相關概念、性質和遍歷等知識進行講解 一、什么是樹 在講二叉樹之前&#xff0c;先了解一下什么是樹&#xff1a;樹是一種非線性結構&#xff0c;其由許多節點和子節點組成&#xff0c;整體形狀如一顆倒掛的樹&#xff0c;比如下圖&#xff1…

給nginx部署https及自簽名ssl證書

一、生成服務器root證書 openssl genrsa -out root.key 2048 openssl req -new -key root.key -out root.csr#Country Name (2 letter code) [XX]:---> CN#Country Name (2 letter code) [XX]:---> CN#State or Province Name (full name) []:---> Shanghai#Locality…

多層感知機 + 代碼實現 - 動手學深度學習v2 | 李沐動手學深度學習課程筆記

感知機 感知機≈二分類問題 感知機和其他問題的對比 訓練感知機 如果小于等于零&#xff0c;說明預測錯啦 &#xff0c;其實就是同號為正&#xff0c;異號為負 舉個分類的例子 增加樣本&#xff0c;改變分類線 繼續分類 感知機的收斂定理 XOR問題 XOR問題其實就是第1、3象限數…

【踩坑】一條指令解決torch_scatter等安裝報錯安裝不上問題

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhang.cn] 目錄 背景說明 (推薦方法)解決方法一&#xff1a;使用conda安裝。 解決方法二&#xff1a;指定pip的網站。 解決方法三&#xff1a;直接去下載whl文件。 (終極方法)解決方法四&#xff1a;配置MSVC 特殊情況…

Linux系統運維腳本:掃描主機上多個端?狀態

目 錄 一、要求 二、解決方案 &#xff08;一&#xff09;解決思路 &#xff08;二&#xff09;方案 三、腳本程序實現 &#xff08;一&#xff09;腳本代碼和解釋 1、腳本代碼 2、代碼解釋 &#xff08;二&#xff09;腳本驗證 1、腳本編輯 2、給予執…

構建 ESLint 內存泄露檢測插件入門:提升代碼質量與防范運行時風險

前言 本文目的是介紹如何創建開發一個自定義規則 ESLint 插件。利用其能力,檢測一些代碼中可能存在的內存泄露并及時進行提示,避免潛在的后期影響。 本文實現其中一部分功能–檢測事件監聽器的使用是否存在內存泄露為例來演示基本的 ESLint 自定義規則插件開發的過程。用以…

nginx筆記整理

目錄 一.Nginx基礎介紹 二.nginx安裝配置 三.Nginx配置文件 3.1nginx主配置文件(/etc/nginx/nginx.conf) 3.2默認的網站配置文件(/etc/nginx/conf.d/default.conf) 四.創建新的虛擬主機 五.Nginx日志 5.1nginx日志格式 5.2查看日志 5.3日志緩存(了解) 5.4日志輪轉(/…

COMPOSER安裝使用WIN下升級PHP-V

想用TP6使用phpspreadsheet但是說我PHP版本低&#xff0c;原來是PHP7.0 composer要求至少7.4 直接修改環境變量&#xff0c;把PHP目錄切換到7.4 composer升級比較簡單&#xff0c;在PHP目錄下CMD然后官網的命令執行下即可 下面就可以在TP根目錄下執行命令安裝PHPSPREADSHEET…