本篇僅為了鞏固一下基礎(chǔ),回憶一下存儲(chǔ)的這兩個(gè)常用的東東…
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)去。
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ì)本站的支持!