9.集合框架
1)基本概念:用于存放对象的对象(与数组类似.即集合也是对象.只能存对象)
2)和数组的差异
A.数组存放的内容由数组类型指定,集合存放的内容为Object类型的引用
B.数组只有1种数据结构(按照索引存储),集合的数据结构分为Set.List和Map三大类.每个类中还包含若干的小类
C.数组的容量在创建时指定,无法在使用中动态扩展.所有集合类型的容量都是不定的.根据需求自动扩展
3)基本组成
A.接口:用于定义集合的功能框架
B.实现类:实现对应的接口.实现集合的具体功能
C.工具:提供对集合操作的辅助功能
4)接口
A.Collection
定义存储内容为单个对象的数据结构及相关的操作方法
B.Set
继承Collection,存储内容无序且不可重复
C.List
继承Collection,存储元素有序且可以重复
D.SortedSet
继承Set.可以对存储内容进行排序
E.Map
定义存储内容为2个对象(键值对)的数据结构及相关的操作方法
键(标识性,所以不可重复)对象无序且不可重复,值对象可以重复顺序由对应的键对象决定
F.SortedMap
继承Map,可以对键对象进行排序
5)名词解释
A.无序:存储顺序与放入顺序无关
B.有序:存储顺序与放入顺序一致
C.排序:按照一定的逻辑对内容进行排序,存储顺序依照排序的结果进行排列
6)实现类
A.List(3个实现类)
ArrayList:内部存储形式为数组,擅长查询操作,对插入和删除操作效率较低
LinkedList:内部存储形式为双向链表.擅长插入和删除操作,对查询操作效率较低
Vector:ArrayList的线程安全版本,可保证多线程并发防问时的数据准确和一致性,但对效率影响很大,实际开发中使用较少
B.HashSet的重复性判断
i)在执行add()操作时进行,将加入的对象与集合中已存在的对象进行比较,满足相等性条件时,待加入的对象无法加入集合中
ii)比较内容
将2个对象调用equals()结果为true
将2个对象分别调用hashcode()的结果相同
同时满足以上2个条件则判断两个对象相同
C.TreeSet
构造器
TreeSet()--使用默认的排序和重复性判断逻辑
注:只有少量类型(String.包装类型)存在默认排序和重复性判断逻辑,如Integer升序;如果对没有默认的排序和重复性判断逻辑的对象使用该操作,将在执行时产生ClassCastException
TreeSet(Comparator)--使用指定的比较器实现排序和重复性判断逻辑
实现原理:在加入元素时执行比较(原有元素和待加入的元素),比较时调用比较器的compare().根据返回值决定排列的顺序是否重复
compare()的第一个参数--待加入的元素
compare()的第二个参数--集合中原有的元素
返回值
>0 待加入元素在原有元素的右边
<0 待加入元素在原有元素的左侧
=0 相同,待加入元素不加入
注:当>0或<0时,如集合的相应方向存在未比较的元素,则应继续比较直至完全确定位置后才执行加入
D.Map的实现类
HashMap和HashTable的关系相当于ArrayList和Vector的关系
HashMap的重复性判断规则(key)
在元素加入时(put)进行判断.方式与HashSet完全相同
E.TreeMap的排序和重复性判断规则(key)
在元素加入时(put)进行判断.方式与TreeSet完全相同
1 //List集合 实现类LinkedList ArrayList
2 import java.util.*;
3 public class ListTest {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) {
9 // TODO Auto-generated method stub
10 String a="A",b="B",c="C",d="D",e="E"; //定义字符串对象
11 List<String> list= new LinkedList<String>(); //创建List集合
12 list.add(a); //集合中添加元素
13 list.add(e);
14 list.add(d);
15 Iterator<String> fristIterator=list.iterator();//创建集合迭代器
16 System.out.println("修改前集合中的元素为");
17 while(fristIterator.hasNext()){
18 System.out.println(fristIterator.next()+" ");
19 }
20 list.set(1,b);
21 list.set(2,c);
22 Iterator<String> it=list.iterator();
23 System.out.println("修改后集合中的元素为");
24 while(it.hasNext()){
25 System.out.println(it.next()+" ");
26 }
27
28 }
29
30 }
1 //MAP集合 和 泛型
2 import java.util.*;
3 public class MapTest {
4
5 /**泛型应用
6 * @param args
7 */
8 public static void main(String[] args) throws Exception {
9 // TODO Auto-generated method stub
10
11 //HashMap 定义泛型 类型变量
12 HashMap<String,Integer> maps= new HashMap<String,Integer>();
13 maps.put("zhangsan",28); //添加元素
14 maps.put("lisi",33);
15 maps.put("wangwu", 23);
16
17 //返回Set集合
18 Set<Map.Entry<String, Integer>> entrySet= maps.entrySet();
19
20 //迭代输出集合
21 for(Map.Entry<String,Integer> entry : entrySet)
22 {
23 System.out.println(entry.getKey()+" "+entry.getValue());
24 }
25 //转换类型
26 Object ob="abc";
27 String x3= autoConvert(ob);
28 }
29
30 private static <T> T autoConvert(Object object){
31 //泛型方法 类型转换
32 return (T)object;
33 }
34
35 private static <T> void fillArray(T[] a,T obj ){
36 //将某个类型的对象 填充到 对应类型的数组
37 for(int i=0;i<a.length;i++)
38 a[i]=obj;
39 }
40
41 }