java 中Collection存儲(chǔ)器詳解及簡(jiǎn)單實(shí)例
本篇僅為了鞏固一下基礎(chǔ),回憶一下存儲(chǔ)的這兩個(gè)常用的東東…
一、Collection
1.存儲(chǔ)對(duì)象可以考慮:①數(shù)組②結(jié)合
2.數(shù)組存儲(chǔ)對(duì)象的特點(diǎn):Student[] stu = new Student[20]; stu[0] = new Stutdent();……
弊端:①一旦創(chuàng)建,其長(zhǎng)度不可變
②真實(shí)的數(shù)組存放的對(duì)象的個(gè)數(shù)是不可知的
3.集合
Collection接口
丨------List接口:存儲(chǔ)有序,可以重復(fù)的元素
丨-------ArrayList(主要的實(shí)現(xiàn)類,首選)
丨-------LinkedList(頻繁的插入,刪除)
丨-------Vector(古老的實(shí)現(xiàn)類,線程安全)
丨------Set接口:存儲(chǔ)無(wú)序,不可重復(fù)的元素,Set中常用的方法都是Collection下定義的
丨-------HashSet(主要實(shí)現(xiàn)類)
丨-------LinkedHashSet
丨-------TreeSet
例: (這里主要是說Set接口)
1)HashSet
Set存儲(chǔ)的元素是無(wú)序的,是不可重復(fù)的!
1.無(wú)序性:無(wú)序性 != 隨機(jī)性。真正的無(wú)序性,指的是元素在底層存儲(chǔ)的位置是無(wú)序的。(根據(jù)hash值來存)
2.不可重復(fù)性:當(dāng)向Set中添加進(jìn)相同的元素的時(shí)候,后面的這個(gè)不能添加進(jìn)去。
//說明:要求添加進(jìn)Set中的元素所在的類,一定要重寫equals()和hashcode()方法。進(jìn)而保證set中元素的不可重復(fù)性!
set中的元素時(shí)如何存儲(chǔ)的呢?使用了哈希算法。
當(dāng)向set中添加元素時(shí),首先調(diào)用此對(duì)象所在類的hashCode()方法,計(jì)算此對(duì)象的hash值,此哈希值決定了此對(duì)象在set中的存儲(chǔ)位置,若此位置之前沒有對(duì)象存儲(chǔ),則此對(duì)象直接存到這個(gè)位置。(就好比一個(gè)教室,按號(hào)入座一樣),若已有對(duì)象存儲(chǔ),在通過equals()方法比較這兩個(gè)對(duì)象的是否相同,如果相同后一個(gè)對(duì)象不能再添加進(jìn)來。
萬(wàn)一返回false呢?都存儲(chǔ)。(不建議如此)
//>要求:hashcode()方法要與equals()方法一致。
事例代碼如下:
public class TestSet{
@Test
public void testHashSet(){
Set set = new HashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA"));//若此時(shí)在這里加上相同元素,則加不進(jìn)去。
set.add("BB");
set.add(null);
System.out.println(set.size());
System.out.println(set);
}
}
2)LinkedHashSet()
/*
*LinkedHashSet:使用鏈表維護(hù)了一個(gè)添加進(jìn)集合中的順序,導(dǎo)致當(dāng)我們遍歷LinkedHashSet集合元素是按照
*添加進(jìn)去的順序遍歷的!但是存儲(chǔ)是無(wú)序的!
*LinkedHashSet得插入性能略低于HashSet,但在迭代訪問Set里的全部元素時(shí)有很好的性能。
*LinkedHashSet不允許集合元素重復(fù)。
*/
public class TestLinkedHashSet{
@Test
public void testLinkedHashSet(){
Set set = new LinkedHashSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA"));
set.add("BB");
set.add(null);
System.out.println(set.size());
System.out.println(set);
//迭代器去遍歷
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
輸出為:123,456,AA,BB,null
3)TreeSet
/*
*1.向TreeSet中添加的元素必須是同一個(gè)類的
*2.可以按照添加進(jìn)集合中的元素的指定的順序遍歷,像String,包裝類等默認(rèn)按照從小到大的順序遍歷
*3.當(dāng)向TressSet中添加自定義類的對(duì)象時(shí),有兩種排序方法:①自然排序②定制排序
*4.自然排序:要求自定義類實(shí)現(xiàn)java.lang.Comparable接口并重寫其compareTo(Object obj)
在此方法中,指明按照自定義類額哪個(gè)屬性進(jìn)行排序。
*5.向TreeSet中添加元素時(shí),首先按照compareTo()進(jìn)行比較,一旦返回0,雖然僅是兩個(gè)對(duì)象的子屬性值相同, 但是程序會(huì)認(rèn)為這兩個(gè)對(duì)象是相同的,進(jìn)而后一個(gè)對(duì)象就不能添加進(jìn)來。
*>compartTo()與hashCode();以及equals()三者保持一致!
*/
False:
public class TestTreeSet{
//這樣添加會(huì)報(bào)出一個(gè)CastException,會(huì)出現(xiàn)異常
@Test
public void testTreeSet(){
Set set = new TreeSet();
set.add(123);
set.add(456);
set.add(new String("AA"));
set.add(new String("AA"));
set.add("BB");
}
}
True:
public class TestTreeSet{
@Test
public void testTreeSet(){
Set set = new TreeSet();
// set.add(new String("AA"));
// set.add(new String("AA"));//相同的元素沒有進(jìn)去
// set.add("JJ");
// set.add("GG");
// set.add("MM");
//String沒有報(bào)錯(cuò)是以為String類型實(shí)現(xiàn)了Comparable接口,已經(jīng)重寫好了排序的方法
//當(dāng)Person類沒有實(shí)現(xiàn)Comparable接口時(shí),當(dāng)向TreeSet中添加Person對(duì)象時(shí),報(bào) //ClassCastException
set.add(new Person("CC",23));
set.add(new Person("MM",21));
set.add(new Person("GG",25));
set.add(new Person("JJ",24));
set.add(new Person("KK",20));//新加一個(gè)KK,但是age相同
set.add(new Person("DD",20));
for(Object str : set){
System.out.println(str);
}
}
}
輸出為AA,GG,JJ,MM
//當(dāng)向TreeSet中添加Person類的對(duì)象時(shí),依據(jù)此方法,確定按照哪個(gè)屬性排列。
//需要重寫compareTo方法
//Person(name,age,get/set方法,空構(gòu)造器,toString,equals,hashCode)
@Override
public int compareTo(Object o){
if(o instanceof Person){
Person p = (Person)o;
// return this.name.compareTo(p.name); 從小往大排
// return -this.name.compareTo(p.name); 從大往小排
int i = this.age.compareTo(p.age);
if(i == 0){
return this.name.compareTo(p.name);
}else{
return i ;
}
}
return 0;
}
//定制排序
//Customer(name,id,get/set方法,空構(gòu)造器,toString,equals,hashCode)
public class TestTreeSet{
@Test
public void testTreeSet2(){
//1.創(chuàng)建一個(gè)實(shí)現(xiàn)了Comparator接口的類對(duì)象
Comparator com = new Comparator(){
//
@Override
public int compare(Object o1,Object o2){
if(o1 instanceof Customer && o2 instanceof Customer){
Customer c1 = (Customer)o1;
Customer c2 = (Customer)o2;
int i = c1.getId().compareTo(c2.getId());
if(i == 0){
return c1.getName().compareTo(c2.getName());
}
return i;
}
return 0;
}
};
//2.將此對(duì)象作為形參傳遞給TreeSet的構(gòu)造器中
TreeSet set = new TreeSet(com);
//3.向TreeSet中添加Comparator接口中的compare方法中涉及的類的對(duì)象
set.add(new Customer("AA",1003));
set.add(new Customer("BB",1002));
set.add(new Customer("GG",1004));
set.add(new Customer("CC",1001));
set.add(new Customer("DD",1001));
for(Object str : set){
System.out.println(str);
}
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- JAVA對(duì)list集合進(jìn)行排序Collections.sort()
- 如何解決Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X
- JAVA collection集合之撲克牌游戲?qū)嵗?/a>
- 淺談Java中Collection和Collections的區(qū)別
- 詳解java中的Collections類
- 用Java集合中的Collections.sort方法如何對(duì)list排序(兩種方法)
- java Collection 之Set使用說明
相關(guān)文章
java實(shí)現(xiàn)發(fā)送郵件的示例代碼
這篇文章主要介紹了java如何實(shí)現(xiàn)發(fā)送郵件,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
IDEA中設(shè)置代碼自動(dòng)提示為Alt+/的具體做法
很多公司都強(qiáng)制性要求使用Intellij?IDEA,其實(shí)Intellij?IDEA也確實(shí)很好用,但是一下子從Eclipse跳轉(zhuǎn)到Intellij?IDEA轉(zhuǎn)也是需要一段時(shí)間的,為了迎合之前的習(xí)慣,就需要在Intellij?IDEA中改變一些設(shè)置,如代碼自動(dòng)生成,本文給大家分享設(shè)置方法,感興趣的朋友一起看看吧2023-01-01
springboot內(nèi)嵌Tomcat安全漏洞修復(fù)方式
針對(duì)CVE-2020-1938漏洞,建議升級(jí)Tomcat至安全版本以避免受影響,影響版本包括:Apache Tomcat 9.x小于9.0.31、Apache Tomcat 8.x小于8.5.51、Apache Tomcat 7.x小于7.0.100及Apache Tomcat 6.x,2024-10-10
Springboot 實(shí)現(xiàn)跨域訪問無(wú)需使用jsonp的實(shí)現(xiàn)代碼
這篇文章主要介紹了Springboot 實(shí)現(xiàn)跨域訪問 無(wú)需使用jsonp的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
springboot使用log4j2異步日志提升性能的實(shí)現(xiàn)方式
這篇文章主要介紹了springboot使用log4j2異步日志提升性能,異步日志實(shí)現(xiàn)方式:將日志存入一個(gè)單獨(dú)的隊(duì)列中,有一個(gè)單獨(dú)的線程從隊(duì)列中獲取日志并寫入磁盤文件,需要的朋友可以參考下2022-05-05
CentOS?7.9服務(wù)器Java部署環(huán)境配置的過程詳解
這篇文章主要介紹了CentOS?7.9服務(wù)器Java部署環(huán)境配置,主要包括ftp服務(wù)器搭建過程、jdk安裝方法以及mysql安裝過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
spring boot activiti工作流的搭建與簡(jiǎn)單使用
這篇文章主要給大家介紹了關(guān)于spring boot activiti工作流的搭建與簡(jiǎn)單使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
基于JPA實(shí)體類監(jiān)聽器@EntityListeners注解的使用實(shí)例
這篇文章主要介紹了JPA實(shí)體類監(jiān)聽器@EntityListeners注解的使用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

