一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java 中Collection存儲(chǔ)器詳解及簡單實(shí)例

java 中Collection存儲(chǔ)器詳解及簡單實(shí)例

2020-09-08 10:48sy_y Java教程

這篇文章主要介紹了java 中Collection存儲(chǔ)器詳解及簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下

本篇僅為了鞏固一下基礎(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)建,其長度不可變
    ②真實(shí)的數(shù)組存放的對(duì)象的個(gè)數(shù)是不可知的

3.集合

Collection接口
    丨------List接口:存儲(chǔ)有序,可以重復(fù)的元素
        丨-------ArrayList(主要的實(shí)現(xiàn)類,首選)
        丨-------LinkedList(頻繁的插入,刪除)
        丨-------Vector(古老的實(shí)現(xiàn)類,線程安全)
    丨------Set接口:存儲(chǔ)無序,不可重復(fù)的元素,Set中常用的方法都是Collection下定義的
        丨-------HashSet(主要實(shí)現(xiàn)類)
        丨-------LinkedHashSet
        丨-------TreeSet

例: (這里主要是說Set接口)

1)HashSet

Set存儲(chǔ)的元素是無序的,是不可重復(fù)的!

1.無序性:無序性 != 隨機(jī)性。真正的無序性,指的是元素在底層存儲(chǔ)的位置是無序的。(根據(jù)hash值來存)

2.不可重復(fù)性:當(dāng)向Set中添加進(jìn)相同的元素的時(shí)候,后面的這個(gè)不能添加進(jìn)去。

java" id="highlighter_891727">
?
1
//說明:要求添加進(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)來。

萬一返回false呢?都存儲(chǔ)。(不建議如此)

?
1
//>要求:hashcode()方法要與equals()方法一致。

事例代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
 *LinkedHashSet:使用鏈表維護(hù)了一個(gè)添加進(jìn)集合中的順序,導(dǎo)致當(dāng)我們遍歷LinkedHashSet集合元素是按照
 *添加進(jìn)去的順序遍歷的!但是存儲(chǔ)是無序的!
 *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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
 *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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//當(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ì)本站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产一级特黄aa大片免费 | 国产日本免费 | 好吊色视频988gao在线观看 | 日本网| 国产成+人+亚洲+欧美综合 | 天天操天天干天天做 | 爆操美女 | 亚洲欧美精品一区天堂久久 | 猛操女人 | 成人网18免费网站 | 国产精品亚洲午夜不卡 | 成品人视频w免费观看w | yellow视频免费观看播放 | 亚洲四虎永久在线播放 | 蘑菇香蕉茄子绿巨人丝瓜草莓 | 亚洲国产精品嫩草影院久久 | 人人福利| 天堂8在线天堂资源在线 | 蜜桃麻豆 | 亚洲国产中文字幕在线视频综合 | 久久精品无码人妻无码AV蜜臀 | 国产欧美一区二区三区久久 | 男人天堂网页 | 91久久青青青国产免费 | 亚洲品质自拍网站 | 青春草视频在线免费观看 | 国产亚洲精品综合在线网址 | 3d动漫美女被吸乳羞羞视频 | 国产在线精品99一卡2卡 | 肥胖女人一级毛片 | 国色天香 社区视频 | www免费插插视频 | 欧美艳星kagneyiynn高清 | 蜜桃视频一区二区三区四区 | 国产一区国产二区国产三区 | 91在线永久 | 久久综合久综合久久鬼色 | 嫩草影院永久一二三入口 | 国产不卡视频一区二区在线观看 | 人成午夜免费大片在线观看 | 国产一区二区三区四区波多野结衣 |