---------------------- android培训、java培训、期待与您交流! ----------------------
一.概述:
Java的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象(实际上是对象的引用),并可以实现常用的数据结构,如栈,队列等。除此之外,还可以用于保存具有映射关系的关联数组。Java的集合大致上可分为:Set,List和Map三种体系,其中,Set代表无序,不可重复的集合;List代表有序,重复的集合;而Map则代表具有映射关系的集合。
Java的集合类主要由两个接口派生而出:Collection和Map。(HashSet,ArrayList和HashMap是最常用的实现类)
(二)Collection和Iterator接口:
1. Collection接口定义的操作集合元素的常用方法:
2. Iterator接口主要用于遍历(即迭代访问)Collection中的元素,Iterator对象也被称为 迭代器。Iterator接口定义了如下三个方法:
(三)Set接口:
Set集合与Collection基本上完全一样,它没有提供任何额外的方法。实际上Set就是Collection,只是行为不同(Set不允许出现重复元素)。
Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,如果只要两个对象用equals方法比较返回true,Set就不会接受这两个对象。
1. HashSet类:
HashSet是Set接口的典型实现。
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类:
TreeSet是SortedSet接口的唯一实现,TreeSet可以保证集合元素处于排序状态。
与HashSet相比,TreeSet还提供了几个额外的方法:
注意:如果试图把一个对象添加进TreeSet时,则该对象的类必须实现Comparable接口,否 则程序可能跑出异常。
(四)List接口:
List集合代表一个有序集合,允许元素重复。List集合默认按元素的添加顺序设置元素的索引。
1. List接口和ListIterator接口
List集合常用方法:
ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口的基础上增加了以下方法:
ListIterator增加了向前迭代的功能。
2. ArrayList和Vector实现类:
ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了 一个动态再分配的Object[ ]数组。
ArrayList是线程不安全的,程序必须手动保证该集合的同步性;Vector是线程安全的。
各种容器的性能比较:
(五)Map:
Map用于保存具有映射关系的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
Map接口定义的常用方法:
Map中包含一个内部类:Entry。该类封装了一个key--value对,Entry包含三个方法:
1. HashMap和Hashtable实现类:
Hashtable和HashMap的区别:
1. Hashtable是一个线程安全的实现,但HashMap是线程不安全的实现。
2. Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable 中,将会引发NullPointrException异常;但HashMap可以使用null作为key和value。
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培训、期待与您交流! ----------------------