黑马程序员---java基础---集合框架

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


集合框架


1)体系概述

1.数据多———存储)对象      
  对象————存储)集合
2.容器
          数组、集合
          二者的不同之处  
                                     数组——长度不变,类型相同
                                     集合——长度不限,均为对象即可
3.集合框架
         出现多个框架的原因
          每一个容器对数据的存储方式都不同,把这个存储方式称之为数据结构。


java.util.包
  Collection接口    Collection 层次结构 中的根接口                                             
      |-----List子接口----------------------
                                                               有序的 collection(也称为 序列 )。
                                                               此接口的用户可以对列表中每个元素的插入位置进行精确地控制。
                                                               用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
                |-----ArrayList实现类
                |-----LinkedList实现类
                |-----Vector实现类
      |-----Set子接口-----------------------
                                                                 一个不包含重复元素的 collection。更确切地讲,
                                                                set 不包含满足 
e1.equals(e2)  的元素对  e1  和  e2
                                                                 并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的  set  抽象。  
               |-----HashSet 实现类
               |-----TreeSet 实现类

Iterator接口---迭代器     *为什么会有迭代器?
                                    集合取出元素的方式
                                                               取出方式定义在集合的内部,可以直接访问集合内部元素。
                                    那么取出方式就定义成为了内部类。每一个容器的数据结构不同,取出的细节不同
                                             但是有共性的内容
                                                               判断与获取。将这些共性抽取,这些内部类都符合一个规则就是Iterator。
                                            如何取出集合中的对象
                                                               通过对外提供的方法iterator()
                                             代码:Iterator it = a1.iterator();
                                              while(it.hasNext())
                                             {
     System.out.println(it.next());         }
                                                                 
                                                    
       |------ListIterator子接口
                   系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,
                  并获得迭代器在列表中的当前位置。
ListIterator   没有当前元素;
                  它的 光标位置   始终位于调用   previous()   所返回的元素和调用   next()   所返回的元素之间。
                  长度为
  n   的列表的迭代器有   n+1   个可能的指针
                  位置,如下面的插入符举例说明:  
                      Element(0)   Element(1)   Element(2)   ... Element(n-1)
 cursor positions:  ^            ^            ^            ^                  ^
                        -List集合特有的迭代器,是Iterator的子接口
                                      在迭代时不可以通过集合对象的方法操作集合中的元素,
                                      因为会发生并发操作异常.  所以在迭代时,只能用迭代器的方法操作,
                                                可是Iterator方法有限,只能进行判断,取出,删除操作,
                                      若想要其他操作如添加,修改等,就需要用子接口ListIterator。
                                               该接口只能通过List集合的listIterator()方法获取。

Comparator接口---比较器
                             强行对某个对象 collection 进行 整体排序  的比较函数。
                            可以将 Comparator 传递给 sort 方法(如 
Collections.sort  或  Arrays.sort ),
                                   从而允许在排序顺序上实现精确控制。
                            还可以使用 Comparator 来控制某些数据结构(如
有序 set 有序映射 )的顺序,或者为那些没有
                 自然顺序 的对象 c ollection 提供排序。
                             就两种方法  int compare(T o1,T o2) 
                                              
boolean  equals(Object obj)
                              参数:
               o1  - 要比较的第一个对象。
               o2  - 要比较的第二个对象。
                              返回:
                             根据第一个参数小于、      
                              抛出:
                ClassCastException  - 如果参数的类型不允许此 Comparator 对它们进行比较
Map接口-----

                         将键映射到值的对象。

                         一个映射不能包含重复的键;

                         每个键最多只能映射到一个值。

                         Map 接口提供三种collection 视图

                         允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。

                         映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。

                          某些映射实现可明确保证其顺序,  如 TreeMap 类;

                          另一些映射实现则不保证顺序,如 HashMap 类。

                         Map集合

                                       该集合存储键值时,一对一对往里存,而且要保证键的唯一性

                        方法:添加   put(K key ,V value)  putAll(Map<? extends K,? extends V>)

                                 删除  clear()    remove(Object key) 

                                 判断  containsValue(Object value)    containskey(Object key)  isEmpty()

                                 获取  get(Object key)   size(  )  values()

                                entrySet() 返回此映射中包含的映射关系的 Set 视图。

                 keySet()    返回此映射中包含的键的 Set 视图。
           

             以下为Map接口的实现类

               |---------HashMap

                                             基于哈希表的 Map 接口的实现类。允许使用空值空键,不同步

               |---------  TreeMap

                                             基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,

                                              或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

                                              底层是二叉树数据结构,该集合不同步。

               |---------HashTable 

                                             此类实现一个哈希表,该哈希表将键映射到相应的值。

                                             任何非 null 对象都可以用作键或值。

                                             为了成功地在哈希表中存储和获取对象,

                                            用作键的对象必须实现 hashCode 方法和 equals 方法。是线程同步的

                                   

HashTable哈希表现行同步不允许空值空键效率低jdk1.0
HashMap哈西表不同步允许空值空键效率高jdk1.2
TreeMap二叉树不同步可用于给map集合中的键进行排序 

               |------Map.Entry 
                                        映射项(键-值对)。
                                       
Map.entrySet  方法返回映射的 collection 视图,其中的元素属于此类。
                                        获得映射项引用的
唯一  方法是通过  嵌套类      
                                        此 collection 视图的 迭代器来实现。、
                                        这些 
Map.Entry  对象  在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,
                                        则某些映射项的行为是不确定的, 除了通过  setValue  在映射项上执行操作之外。
                                           方法: getKey()    返回与此项对应的键。
                                                      getValue() 返回与此项对应的值。
                                          

             *Map 的三种取出方式:

                                    1】 Set<k>  keySet 

                                                          返回次用舌中包含的键的Set视图,因为Set具有迭代器,所以可以进行迭代取出所有的键值,

                                                          在根据get方法获取每 一个键值所对应的值.。即将map中的键值存到Set中,利用Set中的迭代器取出键值,

                                                          根据map的get方法取出键值对应的值。

                                    2】Set<Map.Entry<K,V>>  entrySet:

                                                           将map集合中的映射关系存到Set集合中,这个关系的数据类型就是Map.Entry

                                                           通过Map.Entry的getKey和getValue方法获取键和值



Collection  
                  *共性方法:add()添加   clear()移除所有  contains()包含 
                                   equals()      hashCode()        isEmpty()
                                   iterator()     remove(Object obj)   size()  toArray()   
                                    1】add()参数类型是Object,方便接收任意类型的对象
                                    2】retainAll() :a1.reatinAll(a2);去a1和a2的交集
                                    3】迭代器:Iterator-----集合取出的方式
                                         ArrayList a1 = new ArrayList();  Iterator it = a1.iterator();
                                        获取迭代器,用于取出集合中的元素                                                                                  
       |-----List
               * List共性方法
                                       有序的Collection,也称序列。List元素有序、可以重复、因为该集合体系有索引
                                       List:除了有Collection的方法外,因其有角标,所以凡是可以操作角标的方法都是特有方法。
                                       add(index,element)增加   addAll(index,Collection)
                                       remove(index) 删除         set(index,element)修改   
                                       get(index)    subList(from,to)  查找
                                       迭代器:ListIterator   ----List集合特有的迭代器,是Iterator的子接口
                                       ArrayList a1 = new ArrayList();
                                       ListIterator it = a1.listIterator();
            **集合对象的特点
                                     ---ArrayList:底层使用数组数据结构     -------LinkedList:链表数据结构,增删很快,查询稍慢
                                    ----Vector:底层数组是数据结构,线程同步,被ArrayList替代了                                                                              
                |-----ArrayList
                                      List  接口的大小可变数组的实现
                                      实现了所有可选列表操作,并允许包括 
null  在内的所有元素。
                                      除了实现  List  接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
                                   (此类大致上等同于 
Vector  类,除了此类是不同步的。)
                |-----LinkedList
                                     List  接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括  null )。
                           除了实现  List  接口外, LinkedList  类还为在列表的开头及结尾
                get
remove  和  insert  元素提供了统一的命名方法。
                           这些操作允许将链接列表用作堆栈、 队列 双端队列
                           特有方法:addFirst()     addLast()    添加头部和尾部
                                            getFirst()   getLast()获取头部和尾部元素,但不删除。
                                            没有元素,则出现NosuchElementException
                                            removeFirst()   removeLat() 获取元素,但被删除,
                                           如果集合中没有元素,则返回NosuchElementException

                          jdk1.6 以后出现替代方法

                                             offerFirst()  offerLast()  peekFirst()

                                             peekLast()   pollFirst()   pollLast() 没有则返回空                                          

/*
LinkedListTest模拟一个堆栈或者队列数据结构

堆栈:先进后出
队列:先进先出


*/
//此处为先进后出
import java.util.*;
class DuiLie
{
	private LinkedList link;

	DuiLie()
	{
		link = new LinkedList();
	}
    
	public void myAdd(Object obj)
	{
		link.add(obj);
	}

	public Object myGet()
	{
		return link.removeLast();
	}

	public boolean isNull()
	{
		return link.isEmpty();
	}
}



class  LinkedListTest
{
	public static void main(String[] args) 
	{
		DuiLie d1 = new DuiLie();
		d1.myAdd("java1");
		d1.myAdd("java2");
		d1.myAdd("java3");

		
		while(d1.isNull())
		{
			sop(d1.myGet());
		}


	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}


                |-----Vector实现类:------Vector中的枚举:枚举是Vector中的特有取出方式,其实枚举与迭代是一样的。
                                                 因为枚举的名称和方法名称都过长,所以被迭代取代。
          
        |-----Set
               |-----HashSet: 此类实现  Set  接口,由哈希表(实际上是一个  HashMap  实例)支持。它不保证 set 的迭代顺序;
                                        特别是它不保证该顺序恒久不变。此类允许使用  null  元素。线程非同步。

                                       如何保证唯一性?

                                        通过两个方法hashCode()和equals()完成。如果元素的HashCode相同,才会判断equals

                  /*
HashSet的获取,存储不重复,且无序
*/
import java.util.*;
class  HashSetTest
{

    public static void sop(Object obj)
    {
        System.out.println(obj);
    }

    public static void main(String[] args)
    {
        HashSet hs = new HashSet();

        hs.add("java1");
        hs.add("java1");
        hs.add("java2");
        hs.add("java3");
        hs.add("java4");

      Iterator it = hs.iterator();

        while(it.hasNext())
        {
            sop(it.next());
        }
    }
}



               |-----TreeSet:可以对Set集合中的元素进行排序。
                                       注意复写compareTo方法,否则出现异常
                                       可对Set集合中的元素进行排序,底层数据结构是二叉树,
                                       保证元素的唯一性的依据是compraeTo方法
                                       1】TreeSet排序的第一种方式:让元素自身具备比较性,
                                                   元素需要实现Comparable接口,覆盖compreTo方法
                                                   也称其为自然顺序或者默认顺序。
                                        2】第二种方式:定义一个比较器,即定义一个类实现comparator接口,
                                                                   覆盖compare方法。
                                                                  将比较器对象作为参数传递给TreeSety集合的构造函数
                                            说明:当元素自动很不具备比较性时,或者具备的比较性不是所需的时,
                                                      需要让集合自身具备比较性。在集合初始化时就有了比较方式。

                                                    
 class StrLenComparator implements comparator
                                                      {
                                                                 public int compare(Object o1,Object o2)
                                                               {
                                                                        
                                                               }
                                                      } 
                                                      TreeSet tr = new TreeSet(new StrLenComparator());

/*
LinkedListTest模拟一个堆栈或者队列数据结构

堆栈:先进后出
队列:先进先出


*/
//此处为先进后出
import java.util.*;
class DuiLie
{
	private LinkedList link;

	DuiLie()
	{
		link = new LinkedList();
	}
    
	public void myAdd(Object obj)
	{
		link.add(obj);
	}

	public Object myGet()
	{
		return link.removeLast();
	}

	public boolean isNull()
	{
		return link.isEmpty();
	}
}



class  LinkedListTest
{
	public static void main(String[] args) 
	{
		DuiLie d1 = new DuiLie();
		d1.myAdd("java1");
		d1.myAdd("java2");
		d1.myAdd("java3");

		
		while(d1.isNull())
		{
			sop(d1.myGet());
		}


	}
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

import java.util.*;
/*
练习:按照字符串长度进行排序

字符串本身具备比较性,但是他的方式不是所需要的

*/

class StrLenComparator implements Comparator
{
	public int compare(Object o1,Object o2)
	{
		String s1 = (String)o1;
		String s2 = (String)o2;

		int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
		if(num==0)
			return s1.compareTo(s2);
		return num;
	}
}
class  TreeSetDemo 
{
	public static void main(String[] args) 
	{
		TreeSet ts = new TreeSet(new StrLenComparator());

		ts.add("abc");
		ts.add("abk");
		ts.add("jinl");
		ts.add("kosko");
		ts.add("jxijsij");

		Iterator it = ts.iterator();
		while(it.hasNext())
		{
			sop(it.next());
		}
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}






------ Java培训、Android培训、iOS培训、.Net培训 、期待与您交流! -------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值