Java基本類型哪些,所佔位元組
byte :1個位元組
short :2個位元組
char :2個位元組
int :4個位元組
long :8個位元組
float :4個位元組
double :8個位元組java集合以及底層原理
Java集合框架的根介面有Collection和Map。Collection根介面包含List和Set二個子介面。
List介面
它的特點是:元素有序、且可重複,主要包含三個實現類:ArrayList,vector,LinkedList
ArrayList的特點:底層是數組,線程不安全,查找快,增刪慢(數組的特點)。
ArrayList的底層實現原理:通過ArrrayList空參構造器創建對象。
底層創建一個長度為10的數組,當我們向數組中添加11個元素時,底層會進行擴容,擴容為原來的1.5倍
(創建一個新的數組,長度為原數組長度的1.5倍,將原數組複製到新數組中)。
vector的特點:古老的實現類,底層是數組,線程安全的,JDK1.0就有了,Vector總是比ArrayList慢,所以盡量避免使用。
LinkedList的特點:底層是使用雙向鏈表。增刪快,查找慢。Set介面
它的特點:
無序性:通過HashCode方法算出的值來決定在數組中存放的位置;
不可重複性:進行equals方法比較,結果為true則兩個數據相同,若為false則不同。
主要包含三個實現類:HashSet,LinkedHashSet,TreeSet
HashSet特點:線程不安全,集合元素可以為null,不能保證元素的排列順序
HashSet的底層實現原理:
當向HashSet添加數據時,首先調用HashCode方法決定數據存放在數組中的位置,該位置上沒有其他元素,
則將數據直接存放,若該位置上有其他元素,調用equals方法進行比較。若返回true則認為兩個數據相同,
若返回false,則以鏈表的形式將該數據存在該位置上,(jdk1.8)如果數量達到8則將鏈表換成紅黑樹。
HashSet的底層就是一個HashMap,向HashSet中添加的數據實際上添加到了HashMap中的key里。
所以HashMap的key可以看成是Set的集合。
LinkedHashSet特點:繼承了HashSet,底層實現原理和HashSet一樣,可以安照元素添加的順序進行遍歷
根據元素的hashCode值來決定元素的存儲位置,它維護了一張鏈表該鏈表記錄了元素添加的順序。
底層就是一個LinkedHashMap。
TreeSet特點:底層為紅黑樹;可以安照指定的元素進行排序;TreeSet中的元素類型必須保持一致,
底層就是TreeMap。TreeSet必須(自然排序)實現Comparable介面,重寫compareTo()方法,
按照某個屬性進行排序,相結合添加元素或(定製排序)創建一個Comparator實現類的對象,
並傳入到TreeSet的構造器中,按照某個屬性進行排序,向集合添加元素。定製排序比自然排序靈活。
如果即有自然排序又有定製排序誰起作用? 定製排序Map介面
Map的特點:
Map存儲的是鍵值對(key,value),Map中的key是無序的且不可重複的,所有的key可以看成是一個set集合。
Map中的key如果是自定義類的對象必須重寫hashCode和equals方法,Map中的value是無序的可重複的,
所有的value可以看成是Collection集合,Map中的value如果是自定義類的對象必須重寫equals方法,
Map中的鍵值對可以看成是一個一個的Entry.Entry所存放的位置是由key來決定的。
Entry是無序的不可重複的。主要的實現類:HashMap,LinkedHashMap,TreeMap,HashTable.
HashMap特點
1.底層是一個數組 + 鏈表 + 紅黑樹(jdk1.8)
2.數組的類型是一個Node類型
3.Node中有key和value的屬性
4.根據key的hashCode方法來決定Node存放的位置
5.線程不安全的 ,可以存放null
HashMap的底層實現原理:
當我們向HashMap中存放一個元素(k1,v1),先根據k1的hashCode方法來決定在數組中存放的位置。
如果該位置沒有其它元素則將(k1,v1)直接放入數組中,如果該位置已經有其它元素(k2,v2),調用k1的equals方法和k2進行比較。
如果結果為true則用v1替換v2,如果返回值為false則以鏈表的形式將(k1,v1)存放,
當元素達到8時則會將鏈表替換成紅黑樹以提高查找效率。
HashMap的構造器:new HashMap() :創建一個容量為16的數組,載入因子為0.75。
當我們添加的數據超過12時底層會進行擴容,擴容為原來的2倍。
LinkedHashMap:繼承了HashMap底層實現和HashMap一樣.
可以安照元素添加的順序進行遍歷底層維護了一張鏈表用來記錄元素添加的順序。
TreeMap特點:可以對Key中的元素安照指定的順序進行排序 ( 不能對value進行排序)
HashTable特點:線程安全的 ,不可以存放null,map中的key不能重複,如果有重複的,後者的value覆蓋前者的value四大作用域和九大內置對象
四大作用域:
page :當前頁面有效時間最短(頁面執行期)
request :HTTP請求開始到結束這段時間
session :HTTP會話開始到結束這段時間
application :伺服器啟動到停止這段時間九大內置對象:
request :請求對象 作用域 Request
response :響應對象 作用域 Page
pageContext :頁面上下文對象 作用域 Page
session :會話對象 作用域 Session
application :應用程序對象 作用域 Application
out :輸出對象 作用域 Page
config :配置對象 作用域 Page
page :頁面對象 作用域 Page
exception :例外對象 作用域 pagejsp和servlet的區別
1.jsp經編譯後就變成了Servlet.(JSP的本質就是Servlet,JVM只能識別java的類,
不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)
2.jsp更擅長表現於頁面顯示,servlet更擅長於邏輯控制.
3.Servlet中沒有內置對象,Jsp中的內置對象都是必須通過HttpServletRequest象,
HttpServletResponse對象以及HttpServlet對象得到.
Jsp是Servlet的一種簡化,使用Jsp只需要完成程序員需要輸出到客戶端的內容,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成。
而Servlet則是個完整的Java類,這個類的Service方法用於生成對客戶端的響應。servlet生命周期
1.載入和實例化
2.初始化
3.請求處理
4.服務終止
載入(伺服器啟動時,會到web.xml文件中去找到Servlet文件的配置並創建servlet的實例)
→初始化(init()此方法只執行一次) →執行(service(),doGet(),doPost()) →銷毀(銷毀destory())
service():
方法本身包含了doGet()和doPost().如果伺服器發現了service()方法,則不再執行doGet(),doPost().
一般不建議去重寫父類的service方法.因為重寫了此方法doGet方法和doPost方法將得不到利用.
沒有service()方法默認執行doGet()方法.cookie和session區別以及JWT與Session的差異
1、cookie數據存放在客戶的瀏覽器上,session數據放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。
3、session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能,考慮到減輕伺服器性能方面,應當使用cookie。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
5、可以考慮將登陸信息等重要信息存放為session,其他信息如果需要保留,可以放在cookie中。
1.Session是在伺服器端的,而JWT是在客戶端的。
2.Session方式存儲用戶信息的最大問題在於要佔用大量伺服器內存,增加伺服器的開銷。
3.JWT方式將用戶狀態分散到了客戶端中,可以明顯減輕服務端的內存壓力。
4.Session的狀態是存儲在伺服器端,客戶端只有session id;而Token的狀態是存儲在客戶端。JWT與OAuth的區別
OAuth2是一種授權框架 ,JWT是一種認證協議。
無論使用哪種方式切記用HTTPS來保證數據的安全性
OAuth2用在使用第三方賬號登錄的情況(比如使用weibo, qq, github登錄某個app)
JWT是用在前後端分離, 需要簡單的對後台API進行保護時使用。Cookie和LocalStorage和sessionStorage的區別

轉發和重定向的區別
轉發:瀏覽器地址欄不變,1次請求,request請求,可以訪問web-inf,可以共享request請求域數據,只能跳轉工程內的資源
重定向:瀏覽器變化,2次請求,response響應,不能訪問web-inf,不可以共享request請求域數據,可以跳轉任意資源
餓漢於懶漢單例模式
單例模式設計:
第一步:私有化構造器
第二步:提供一個公共靜態返回該類實例對象的方法
餓漢式:先初始化對象,Single類一進內存,就已經創建好了對象。
class Single{
private Single(){}
private static Single s=new Single();
public static Single getInstance()
{
return s;
}
}
懶漢式:對象是方法被調用時,才初始化,也叫做對象的延時載入。
class Single{ //Single類進內存,對象還沒存在,只有調用了getInstance方法時,才建立對象
private Single(){}
private static Single s=null;
public static synchronize Single getInstance()
{
if(s==null){
s=new single();
}
return s;
}
}
操作共享的數據有多條,會出現線程安全問題,在方法加一個同步過濾器和攔截器的區別
①攔截器是基於java的反射機制的,而過濾器是基於函數回調。
②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧里的對象,而過濾器不能訪問。
⑤在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調用業務邏輯。#和$的區別
#{}和${}的區別
#{} 在mapper的配置文件的sql語句中,它是佔位符, 相當於 ? 號。
${} 在 mapper 的配置文件的 sql 語句中,它是原樣輸出變數的值,然後以字元串拼接的功能進行操作。
${} 中只能寫value,或者是@Param命名參數後的參數名稱
在輸出參數的時候,我們並不推薦使用 ${} 來輸出。因為可能會導至 sql 注入問題的存在。
什麼是SQL注入?
如果SQL是根據用戶輸入拼出來,如果用戶故意輸入可以讓後台解析失敗的字元串,這就是SQL注入
例如,用戶在輸入密碼的時候,輸入' or 1=1', 這樣,後台的程序在解析的時候,拼成的SQL語句,可能是這樣的:
select count(1) from tab where user=userinput and pass='' or 1=1;
看這條語句,可以知道,在解析之後,用戶沒有輸入密碼,加了一個恆等的條件 1=1,這樣,這段SQL執行的時候,
返回的 count值肯定大於1的,如果程序的邏輯沒加過多的判斷,這樣就能夠使用用戶名 userinput登陸,而不需要密碼。
防止SQL注入,首先要對密碼輸入中的單引號進行過濾,再在後面加其它的邏輯判斷,或者不用這樣的動態SQL拼。&&和&與|和||的區別?
&和&&的區別?
&和&&左邊的式子為true的時候,右邊的式子都會執行。
左邊的式子為false的時候。&右邊的式子仍然會執行。&&右邊的式子將不再執行。
|和||的區別?
|和||左邊的式子為false的時候,右邊的式子都會執行。
左邊的式子為true的時候。|右邊的式子仍然會執行。||右邊的式子將不再執行。final finally finalize區別?
final修飾符,用來修飾變數,方法和類,分別表示屬性不可變,方法不可被重寫,類不可被繼承,finally是異常語句中處理語句,
表示總是執行;finalize表示在垃圾回收機制時使該對象狀態恢復的方法int和Integer的區別?
1、Integer是int的包裝類,int則是java的一種基本數據類型
2、Integer變數必須實例化後才能使用,而int變數不需要
3、Integer實際是對象的引用,當new一個Integer時,實際上是生成一個指針指向此對象;而int則是直接存儲數據值
4、Integer的默認值是null,int的默認值是0equals與==的區別?
==:如果==兩邊是基本數據類型,那麼比較的是具體的值。如果==兩邊是引用數據類型,那麼比較的是地址值。
(兩個對象是否指向同一塊內存)
equals:如果沒有重寫equals方法那麼調用的是Object中的equals方法,比較的是地址值。
如果重寫了euqlas方法(比屬性內容)那麼就比較的是對象中屬性的內容。
StringBuff 和StringBuilder及String區別?
String類是不可變類,任何對String的改變都會引發新的String對象的生成;
StringBuffer是可變類,任何對它所指代的字元串的改變都不會產生新的對象,線程安全的。
StringBuilder是可變類,線性不安全的,不支持並發操作,不適合多線程中使用,但其在單線程中的性能比StringBuffer高。Override和Overload的含義去區別?
1. Override 特點
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
4、方法被定義為final不能被重寫。
5、對於繼承來說,如果某一方法在父類中是訪問許可權是private,那麼就不能在子類對其進行重寫覆蓋,如果定義的話,
也只是定義了一個新方法,而不會達到重寫覆蓋的效果。(通常存在於父類和子類之間。)
2.Overload 特點
1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序
當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int)
2、不能通過訪問許可權、返回類型、拋出的異常進行重載;
3、方法的異常類型和數目不會對重載造成影響;
4、重載事件通常發生在同一個類中,不同方法之間的現象。
5、存在於同一類中,但是只有虛方法和抽象方法才能被覆寫。 抽象類和介面及普通類的區別?
1、抽象類和介面都不能直接實例化,如果要實例化,抽象類變數必須指向實現所有抽象方法的子類對象,
介面變數必須指向實現所有介面方法的類對象。
2、抽象類要被子類繼承,介面要被類實現。
3、介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現
4、介面里定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。
5、抽象類里的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。
同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。
6、抽象方法只能申明,不能實現,介面是設計的結果 ,抽象類是重構的結果
7、抽象類里可以沒有抽象方法
8、如果一個類里有抽象方法,那麼這個類只能是抽象類
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
10、介面可繼承介面,並可多繼承介面,但類只能單根繼承。堆和棧的區別?
一.堆棧空間分配區別:
1.棧(操作系統):由操作系統自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於數據結構中的棧;
2.堆(操作系統): 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式倒是類似於鏈表。
二.堆棧緩存方式區別:
1.棧使用的是一級緩存, 他們通常都是被調用時處於存儲空間中,調用完畢立即釋放;
2.堆是存放在二級緩存中,生命周期由虛擬機的垃圾回收演算法來決定(並不是一旦成為孤兒對象就能被回收)。
所以調用這些對象的速度要相對來得低一些。
三.堆棧數據結構區別:
堆(數據結構):堆可以被看成是一棵樹,如:堆排序;
棧(數據結構):一種先進後出的數據結構。Spring Bean生命周期
實例化bean對象
設置對象屬性
檢查Aware相關介面並設置相關依賴
BeanPostPreocessor前置處理
檢查是否是InitialliziingBean以決定是否調用afterPropertesSet方法
檢查是否配置有自定義的init-method
BeanPostProcessor後置處理
註冊必要的Destrunction相關回調介面
使用中
是否實現DisposableBean介面
是否配置有自定義的Destory方法
JDK、JRE、JVM的區別?
JDK ( Java開發工具包)= JRE(Java運行環境) + 開發工具集(例如Javac編譯工具等)
JRE (Java運行環境)= JVM (Java虛擬機)+ Java SE標準類庫
值傳遞和引用傳遞的區別?
值傳遞:會創建副本,函數中無法改變原始對象
引用傳遞:不會創建副本,函數中可以改變原始對象
值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參數的值。
引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,
在方法執行中,對形式參數的操作實際上就是對實際參數的操作,方法執行中形式參數值的改變將會影響實際參數的值。4種訪問控制符區別?
訪問許可權 類 包 子類 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×裝箱和拆箱,類型轉換
裝箱:值類型轉換為引用對象,一般是轉換為System.Object類型或值類型實現的介面引用類型;
拆箱:引用類型轉換為值類型,注意,這裡的引用類型只能是被裝箱的引用類型對象;
拆箱與裝箱就是值類型與引用類型的轉換throw和throws區別
throw代表動作,表示拋出一個異常的動作;
throws代表一種狀態,代表方法可能有異常拋出;
throw用在方法實現中,而throws用在方法聲明中;
throw只能用於拋出一種異常,而throws可以拋出多個異常。PreparedStatement比Statement區別?
第一:statement執行的SQL語句必須是一個完整的SQL,而對於PreparedStatement來說,可以使用「?」作為
SQL語句當中的佔位符,然後使用PreparedStatement的setXXX方法來給佔位符賦值,最後在執行;
第二:使用Statement時,如果SQL當中出現了「『」或者「-」等符號時,需要使用轉義字元來進行轉義,而在
PreparedStatement當中,如果佔位符的值當中有這些符號,PreparedStatement會自動的進行轉義;
第三:PreparedStatement會講SQL語句進行預編譯,每次執行的時候只需要將參數設置給相應的佔位符就可以
運行。而使用Statement時,SQL語句時每次都要進行編譯,所以PreparedStatement的效率相對較高。doGet()方法和doPost()方法區別?
get方式 參數在地址欄中顯示 通過?name=""&id=""這種形式傳遞的 不安全 只能傳遞2kb的能容
post方式 底層是通過流的形式傳遞 不限制大小 上傳的時候必須用Post方式
doGet:路徑傳參。效率高,安全性差
doPOST:實體傳參。效率第,安全性好null和undefind的區別?
undefined是訪問一個未初始化的變數時返回的值,而null是訪問一個尚未存在的對象時所返回的值。
Error和Exception的區別?
Error(錯誤)是系統中的錯誤,程序員是不能改變的和處理的,是在程序編譯時出現的錯誤,只能通過修改程序才能修正。
一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。
對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。
Exception(異常)表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程序恢復運行,
而不應該隨意終止異常。阻塞和非阻塞以及同步和非同步的區別?
1. 同步,就是我調用一個功能,該功能沒有結束前,我死等結果。
2. 非同步,就是我調用一個功能,不需要知道該功能結果,該功能有結果後通知我(回調通知)
3. 阻塞,就是調用我(函數),我(函數)沒有接收完數據或者沒有得到結果之前,我不會返回。
4. 非阻塞,就是調用我(函數),我(函數)立即返回,通過select通知調用者
同步IO和非同步IO的區別就在於:數據拷貝的時候進程是否阻塞
阻塞IO和非阻塞IO的區別就在於:應用程序的調用是否立即返回事務的ACID和事務的隔離性?
1)原子性(Atomic):事務中各項操作,要麼全做要麼全不做,任何一項操作的失敗都會導致整個事務的失敗;
2)一致性(Consistent):事務結束後系統狀態是一致的;
3)隔離性(Isolated):並發執行的事務彼此無法看到對方的中間狀態;
4)持久性(Durable):事務完成後所做的改動都會被持久化,即使發生災難性的失敗。通過日誌和同步備份可以在故障發生後重建數據。
臟讀:事務A讀到了事務B未提交的數據。
不可重複讀:事務A第一次查詢得到一行記錄row1,事務B提交修改後,事務A第二次查詢得到row1,但列內容發生了變化,側重於次數,
側重於update
幻讀:事務A第一次查詢得到一行記錄row1,事務B提交修改後,事務A第二次查詢得到兩行記錄row1和row2,側重於內容,側重於insert線程的sleep和wait區別?
sleep()不釋放同步鎖,wait()釋放同步鎖.
sleep可以用時間指定來使他自動醒過來,如果時間不到你只能調用interreput()來強行打斷;
wait()可以用notify()直接喚起.
sleep和wait的區別還有:
1。這兩個方法來自不同的類分別是Thread和Object
2。最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
3。wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在任何地方使用線程的狀態(階段)?
創建、就緒、運行、阻塞、終止。
1、新建狀態(New):新創建了一個線程對象。
2、就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於「可運行線程池」中,
變得可運行,只等待獲取CPU的使用權。即在就緒狀態的進程除CPU之外,其它的運行所需資源都已全部獲得。
3、運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。
4、阻塞狀態(Blocked):阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。http和https的區別?
1、https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。
4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。常見的運行時異常?
NullPointerException - 空指針引用異常
ClassCastException - 類型強制轉換異常。
IllegalArgumentException - 傳遞非法參數異常。
ArithmeticException - 算術運算異常
ArrayStoreException - 向數組中存放與聲明類型不兼容對象異常
IndexOutOfBoundsException - 下標越界異常
NegativeArraySizeException - 創建一個大小為負數的數組錯誤異常
NumberFormatException - 數字格式異常
SecurityException - 安全異常
UnsupportedOperationException - 不支持的操作異常BIO和NIO區別?
互聯網 強調的是信息/數據在網路之間的流通,
BIO:堵塞式IO,相當於輪船運輸
NIO:非堵塞式IO:面向緩衝區(buffer),基於通道(chanel)的io操作,相當於火車運輸,效率高
文件->雙向通道((緩衝區))->程序冒泡排序和自然排序及定製排序怎麼實現的或者手寫出來
冒泡排序
int[] arr={6,3,8,2,9,1};
System.out.println("排序前數組為:");
for(int num:arr){
System.out.print(num+" ");
}
for(int i=0;i<arr.length-1;i++){//外層循環控制排序趟數
for(int j=0;j<arr.length-1-i;j++){//內層循環控制每一趟排序多少次
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
System.out.println();
System.out.println("排序後的數組為:");
for(int num:arr){
System.out.print(num+" ");
}
自然排序
1、定義一個類(文章中為Employee)實現Comparable介面
2、重寫Comparable介面中的compareTo()方法
3、在compareTo()中按指定屬性進行排序
public class Employee implements Comparable{
public int compareTo(Object o) {
if (o instanceof Employee) {
Employee e = (Employee) o;
return this.name.compareTo(e.name);//按name進行排序
}
return 0;
}
}
定製排序
1.創建一個Compartor實現類的對象,並傳入到TreeSet的構造器中
2.重寫compare方法
3.安照某個屬性進行排序
4.向集合中添加元素
TreeSet set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student && o2 instanceof Student) {
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int s = s1.getAge() - s2.getAge();
if(s == 0) {
return s1.getName().compareTo(s2.getName());
}
return s;
}
return 0;
}
});
set.add(new Student("aaa", 18));
set.add(new Student("bbb", 8));
set.add(new Student("fff", 38));
set.add(new Student("ccc", 28));
System.out.println(set);
在使用定製排序或是自然排序時,在其用到的類中都要重寫hashCode()與equals()方法三種遍歷方式?
第一種遍歷方法和輸出結果。
for(int i=1,i<list.size(),i++){
System.out.println(list.get(i));
}第二種用foreach循環。加強型for循環。推薦方式。
for(String string:list){
System.out.println(string);
}第三鍾迭代器
List<String> list=new ArrayList<>();
list.add("abc");
list.add("ghi");
for(Iterator<String> it=list.iterator();it.hasNext();){
System.out.println(it.next());
}原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/281955.html
微信掃一掃
支付寶掃一掃