黑马Java学习笔记之-----集合框架

---------------------- android培训java培训期待与您交流! ----------------------

 

一.概述:

Java的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象(实际上是对象的引用),并可以实现常用的数据结构,如栈,队列等。除此之外,还可以用于保存具有映射关系的关联数组。Java的集合大致上可分为:SetListMap三种体系,其中,Set代表无序,不可重复的集合;List代表有序,重复的集合;而Map则代表具有映射关系的集合。

Java的集合类主要由两个接口派生而出:CollectionMap。(HashSetArrayListHashMap是最常用的实现类)

 

 

(二)CollectionIterator接口:

1. Collection接口定义的操作集合元素的常用方法:

 

2. Iterator接口主要用于遍历(即迭代访问)Collection中的元素,Iterator对象也被称为   迭代器。Iterator接口定义了如下三个方法:

 

(三)Set接口:

Set集合与Collection基本上完全一样,它没有提供任何额外的方法。实际上Set就是Collection,只是行为不同(Set不允许出现重复元素)。

Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,如果只要两个对象用equals方法比较返回trueSet就不会接受这两个对象。

1. HashSet类:

HashSetSet接口的典型实现。

HashSet具有以下特点:

a. 不能保证元素的排列顺序,顺序有可能发生变化。

b. HashSet不是同步的。

c. 集合元素值可以是null

    HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两   个对象的hashCode()方法返回值也相等。

注意:如果需要某个类的对象保存到HashSet集合中,重写这个类的equals()方法和

  hashCode()方法时,应该保证两个对象通过equals比较返回true时,他们的hashCode   方法返回值也相等。

重写hashCode()方法的基本原则:

1. 当两个对象通过equals方法比较返回true时,这两个对象的hashCode应该相等。

2. 对象中用作equals比较标准的属性,都应该用来计算hashCode值。

 

2. TreeSet类:

TreeSetSortedSet接口的唯一实现,TreeSet可以保证集合元素处于排序状态。

HashSet相比,TreeSet还提供了几个额外的方法:

 

注意:如果试图把一个对象添加进TreeSet时,则该对象的类必须实现Comparable接口,否   则程序可能跑出异常。

 

 

(四)List接口:

List集合代表一个有序集合,允许元素重复。List集合默认按元素的添加顺序设置元素的索引。

1. List接口和ListIterator接口

List集合常用方法:

 

ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下方法:

 

ListIterator增加了向前迭代的功能。

 

2. ArrayListVector实现类:

 

  ArrayListVector类都是基于数组实现的List类,所以ArrayListVector类封装了   一个动态再分配的Object[ ]数组。

 

  ArrayList是线程不安全的,程序必须手动保证该集合的同步性;Vector是线程安全的。

 

 各种容器的性能比较:

 

(五)Map

Map用于保存具有映射关系的数据。Mapkey不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false

Map接口定义的常用方法:

 

Map中包含一个内部类:Entry。该类封装了一个key--value对,Entry包含三个方法:

 

1. HashMapHashtable实现类:

HashtableHashMap的区别:

1. Hashtable是一个线程安全的实现,但HashMap是线程不安全的实现。

2. Hashtable不允许使用null作为keyvalue,如果试图把null值放进Hashtable  中,将会引发NullPointrException异常;但HashMap可以使用null作为keyvalue

 

 1 /*
 2 Map集合的两种取出方式:
 3     1.Set<k> keySet():将Map集合中的所有键存入Set中,疑问Set具备迭代器。
 4         所以可以根据迭代方式取出键,再根据get方法,获取每一个键对应的值。
 5     
 6     2.Set<Map.Entry<k,v>> entrySet():将Map集合中的映射关系存入到Set集合中,
 7         而这个映射关系的数据类型就是:Map.Entry。
 8 
 9 */
10 
11 import java.util.*;
12 
13 class Test1
14 {
15     public static void main(String[] args)
16     {
17         HashMap<String,String> hm = new HashMap<String,String>();
18         hm.put("null","null");
19         hm.put("java01","3344");
20         hm.put("java02","3444");
21         hm.put("java03","33244");
22 
23         Set<String> s = hm.keySet();
24         Iterator<String> it = s.iterator();
25         while (it.hasNext())
26         {
27             String key = it.next();
28             System.out.println(key+":"+hm.get(key));
29         }
30     }
31 }
32 
33 
34 class Test2
35 {
36     public static void main(String[] args)
37     {
38         HashMap<String,String> hm = new HashMap<String,String>();
39         hm.put("null","null");
40         hm.put("java01","3344");
41         hm.put("java02","3444");
42         hm.put("java03","33244");
43         //将Map集合中的映射关系取出,存入到Set集合中。
44         Set<Map.Entry<String,String>> s = hm.entrySet();
45         Iterator<Map.Entry<String,String>> it = s.iterator();
46         while (it.hasNext())
47         {
48             Map.Entry<String,String> me = it.next();
49             String key = me.getKey();
50             String value = me.getValue();
51             System.out.println(key+":"+value);
52         }
53     }
54 }

 

 1 /*
 2     练习:
 3     每一个学生都有对应的归属地,
 4     学生Student,地址String
 5     注意:姓名和年龄相同的视为同一学生
 6     保证学生的唯一性。
 7 
 8     1. 描述学生类,重写equals和hashCode方法。(有序则重写Comparable接口中的compareTo方法)
 9     2. 定义Map容器,将学生作为键,地址作为值,存入。
10     3. 获取Map集合中的元素,两种方式:keySet和entrySet。
11 
12 */
13 
14 
15 import java.util.*;
16 
17 class Student
18 {
19     private String name;
20     private int age;
21 
22     Student(String name, int age)
23     {
24         this.name = name;
25         this.age = age;
26     }
27     public String toString()   //重写toString方法
28     {
29         return name+":"+age;
30     }
31     public boolean equals(Object obj)  //重写equals方法
32     {
33         if (!(obj instanceof Student))
34         {
35             throw new ClassCastException("类型不匹配!");
36         }
37         Student s = (Student)obj;
38         return this.name.equals(s.name)&&this.age==s.age;  //名字和年龄都相等则返回true
39     }
40     public int hashCode()    //重写hashCode方法
41     {
42         return name.hashCode()+age*17;
43     }
44 
45 }
46 
47 public class Practice
48 {
49     public static void main(String[] args)
50     {
51         Map<Student,String> hm = new HashMap<Student,String>();
52         hm.put(new Student("xiaok",22),"Beijing");
53         hm.put(new Student("xiaok",22),"Nanjing");
54         hm.put(new Student("xiaoh",19),"Tianjing");
55         hm.put(new Student("xiaol",23),"Fuzhou");
56 
57         //获取Map元素第一种方式:keySet
58         Set<Student> s = hm.keySet();
59         Iterator<Student> it = s.iterator();
60         while (it.hasNext())
61         {
62             Student key = it.next();
63             System.out.println(key+":::"+hm.get(key));
64         }
65 
66         System.out.println("###########################");
67 
68         //获取Map元素第二种方式:entrySet
69 
70         Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
71         Iterator<Map.Entry<Student,String>> it2 = entrySet.iterator();
72         while (it2.hasNext())
73         {
74             Map.Entry<Student,String> me = it2.next();
75             Student ss = me.getKey();
76             String addr = me.getValue();
77             System.out.println(ss+"....."+addr);
78         }
79     }
80 }
 1 /*
 2     练习:
 3         获取字符串中字母出现的次数
 4         如:"adfadff"  打印:a(2)d(2)f(3)...
 5     
 6     思路:
 7         1. 将字符串转换成字符数组,因为要对每一个字母进行操作。
 8         2. 定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。
 9         3. 遍历字符数组:
10              将每一个字母作为键去查Map集合,get(key)方法。
11              如果返回null,将该字母和1存入到Map集合
12              如果返回不是null,说明该字母在Map集合中存在并有对应次数。
13              那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到Map集合中,
14         4. 将Map集合中的数据编程指定的字符串形式返回。
15 
16 */
17 import java.util.*;
18 
19 public class Practice2
20 {
21     public static void main(String[] args)
22     {
23         charCount("adfadfads");
24     }
25 
26     public static void charCount(String str)
27     {
28         char[] chArr = str.toCharArray();  //将字符串转换成字符数组
29         TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();  //定义一个Map集合
30         for (int i=0; i<chArr.length ; i++ )  //遍历字符数组
31         {
32             Integer value=tm.get(chArr[i]);
33             if (value==null)
34             {
35                 tm.put(chArr[i],1);
36             }
37             else
38             {
39                 value++;
40                 tm.put(chArr[i],value);
41             }
42         }
43         Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
44         Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
45         while (it.hasNext())
46         {
47             Map.Entry<Character,Integer> me = it.next();
48             Character key = me.getKey();
49             Integer value = me.getValue();
50             System.out.print(key+"("+value+")");
51         }
52         
53     }
54 }

 

 


 

---------------------- android培训java培训期待与您交流! ----------------------

 

 

posted @ 2013-04-29 02:08  Mercy_K  阅读(422)  评论(0编辑  收藏  举报