欢迎来访...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

黑马程序员——集合框架知识点总结

Posted on 2014-03-08 22:25  天赐绝尘  阅读(108)  评论(0编辑  收藏  举报

-*-*-------------------- ASP.Net+Unity开发.Net培训、期待与您交流! --------------------*-*-



集合框架(集合类)
 java集合框架是指导java的集合类。
  为什么有那么多的集合类的容器呢?
以为每一个容器对数据存储方式都有不同,这个存储方式叫做:数据结构。
集合框架
 集合框架分为两大派系
 |--单列集合 Coloection 接口
     |--List 接口 有序的,可重复,可根据角标操作元素,特有遍历元素方式ListIterator提供双向遍历next() previous(),可删除、替换、增加元素  
    |--ArrayList  底层数据结构是数组,查询速度快,增删稍慢,线程不同步的,
     |--LinkedList 底层数据结构是链表,增删速度快,查询稍慢,线程不同步的
     |--Vector 底层数据结构是数组,增删查都稍慢,线程同步的,jdk1.0出现的,那时候还没有集合框架,后来被ArrayList取代
 |--Set 接口  无序的,不可重复,因为底层是一个Map集合,只使用了Map的key,要保证键的唯一性
    |--HashSet 底层数据结构是哈希表,线程不同步的,无序,高效,必须保证元素的唯一性,是通过调用hashCode和equals方法来判断元素是否相同的
     |--TreeSet 底层数据结构是二叉树,线程不同步的,特点就是可以对集合中的元素进行排序,前提是要指定排序规则,有两种方式
1,让元素自身具备比较性,如果元素自身不具备比较性,可以让元素实现Comparable接口,并覆盖compareTo方法来指定比较规则
2,如果元素具备的比较性并不是我们所需要的,可以自己定义一个比较器,实现Comparator接口,并覆盖compare方法来指定比较规则,通过构造函数传递给集合即可
|--要迭代以上集合都是通过迭代器来完成的,通过调用iterator方法来返回一个迭代器Iterator(接口);通过这个迭代器来迭代元素

  |--双列集合 Map
        |--Hashtable 底层是哈希表结构,线程同步的,不可以存储null键null值,jdk1.0出现,后来被HashMap所替代,
|--HashMap   底层的数据结构是哈希表,线程不同步的,可以存储null键null值,
|--TreeMap   底层是二叉树数据结构,线程不同步,特点是可以对键进行排序,排序方式同TreeSet相同,
   |-- Map 集合和Collection的不同点是,Map集合一次是存一对元素,键值对形式(键和值存在着眏射关系),而Collection一次只存一个元素
|-- Map 集合自身并没有迭代方法,但是可以通过keySet和entrySet方法来讲Map集合转换成Set集合在进行迭代,
   keySet返回的是集合中所有的键,在通过Map集合中的get(key)来获取对应的值,而entrySet方法返回的是Map.Entry这种数据类型,里面保存的是所有键值对的映射关系

泛型:
泛型其实就是为了限定集合中的输入类型,让编译器挡住程序的非法输入,避免了强制类型转换的问题
泛型的上限 格式为<? extends T>表示输入的类型必须是T或者T的子类型
泛型的下限 格式为<? super T>  表示输入的类型不许是T或者T的父类型


Collection 是任何对象组,元素各自独立,通常拥有相同的套用规则

集合Collection接口基本操作:

增加元素
add(Object obj); 
addAll(Collection c); 

删除元素 
remove(Object obj); 
removeAll(Collection c); 

求交集 
retainAll(Collection c);  

删除元素 
remove(Object obj); 
removeAll(Collection c); 

求交集 
retainAll(Collection c);  

泛型:

没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处:
在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。


代码应用:

package basic.method;
 
import java.util.*;
public class BasicMethodDemo {
    public static void main(String[] args) {
        //创建集合容器,使用ArrayList
        ArrayList al = new ArrayList();  //所有集合类都位于java.util包下
        ArrayList la = new ArrayList();
        //添加
        al.add("java01");
        al.add("java02");
        al.add("java03");
        al.add("java04");
         
        la.add("java01");
        la.add("java02");
        la.add("java03");
         
        //删除
//      al.remove(1);
//      al.remove("java3");
//      al.removeAll(la);   //删除al中al和la公有的元素并保存于al中
//      al.clear(); //清空容器
         
        //判断
//      sop(al.contains("java05"));
//      sop(al.contains(la));   //al中寻找la对象的引用,并非找对象中元素实体
//      sop(al.isEmpty());  
         
        //获取长度
//      sop(al.size());
//      al.add(la); //删除al中的重复元素,并把la加到al剩下元素的后面
        al.add(1, la);  // 删除al中的重复元素,并把la加到al 剩下 元素的后面
        sop(al);
    }
    public static void sop(Object obj) {
        System.out.println(obj);
    }
}

编写一个类打印人员信息,按照加入人的姓名排序,不得有重复元素,代码实现:

import java.util.*;
class Person {
	private String name;
	private int age;
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public boolean equals(Object obj) {
		if(! (obj instanceof Person))
			return false;
		Person p = (Person)obj;
		return this.name.equals(p.name) && this.age == age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
}
public class SingleArrayList {
	public static ArrayList<Person> singleP(ArrayList<Person> al) {
		ArrayList<Person> temp = new ArrayList<Person>();
		Iterator<Person> it = al.iterator();
		while(it.hasNext()) {
			Person p = (Person)it.next();
			if(!(temp.contains(p)))
				temp.add(p);
		}
		return temp;
	}
	public static void sop(Object obj) {
		System.out.println(obj);
	}
	public static void main(String args[]) {
		ArrayList<Person> al = new ArrayList<Person>();
		al.add(new Person("张三01",20));
		al.add(new Person("张三02",26));
		al.add(new Person("张三03",22));
		al.add(new Person("张三03",22));
		al.add(new Person("张三01",20));
		al.add(new Person("张三04",30));
		al.add(new Person("张三01",20));
		
		al = singleP(al);
		
		for(Iterator<Person> it = al.iterator();it.hasNext();) {
			Person p = (Person)it.next();
			sop(p.getName()+"--"+p.getAge());
		}	
	}	
}



-*-*-------------------- ASP.Net+Unity开发.Net培训、期待与您交流! --------------------*-*-