黑马程序员——java之集合框架(Day14)

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

1、为什么要使用集合类?

面向对象的语言对事物都是以对象体现的,为了方便对多个对象的操作,隆重推出了集合类,也是一个容器,可以对对象进行操作。

2、数组和集合类同是容器有何不同?

数据虽然也可以存储对象,但是长度不可改变;集合是可改变的;另外数组能存基本数据类型,集合就不行。

3、集合类的特点

  1. 集合只用于存储对象。

  2. 长度可变

  3. 可以存储不储不同对象


4、集合框架


5、为什么会有这么多容器?


因为每个容器的存储方式都有不同,这种存储方式称为数据结构。

6、Collection定义了集合框架的共性功能。

7、查阅API文档后发现:

iterator是abstractlist的内部封装类,可以不用建立对象,直接迭 代出list内对象。加强for循环省内存,但是不能操作对象。

8、

|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
枚举就是Vector特有的取出方式。
发现枚举和迭代器很像。其实枚举和迭代是一样的。
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
|--Set:元素是无序,元素不可以重复。、
List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。

add(index,element);//在相应位置插入后,后面元素依次顺延
addAll(index,Collection);

remove(index);

set(index,element);

get(index):
subList(from,to);
Iterator();//当对象的引用存在集合时,用迭代方法的时候把对象的引用又传到迭代,这是对象有两个引用指向他,这时不能操作对象只能用其一个方法,否则会抛出:ConcurrentModificationException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();
List集合特有的迭代器(因为有角标)。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。
所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。
该接口只能通过List集合的listIterator方法获取。
if(obj.equals("java02"))
//al.add("java008");
it.remove();//将java02的引用从集合中删除了。
sop("obj="+obj);//还能打印是因为迭代器指向这个元素。

	class ListDemo {  
	    public static void sop(Object obj){  
	        System.out.println(obj);  
	    }  
	    public static void method(){  
	          
	        ArrayList al = new ArrayList();  
	  
	        //添加元素   
	        al.add("java01");  
	        al.add("java02");  
	        al.add("java03");  
	          
	        sop("原集合是:"+al);  
	        //在指定位置添加元素。   
	        al.add(1,"java09");  
	  
	        //删除指定位置的元素。   
	        //al.remove(2);   
	  
	        //修改元素。   
	        //al.set(2,"java007");   
	  
	        //通过角标获取元素。   
	        sop("get(1):"+al.get(1));  
	  
	        sop(al);  
	  
	        //获取所有元素。   
	        for(int x=0; x<al.size(); x++){  
	            System.out.println("al("+x+")="+al.get(x));  
	        }  
	  
	        Iterator it = al.iterator();  
	  
	        while(it.hasNext()){  
	            sop("next:"+it.next());  
	        }  
	//通过indexOf获取对象的位置。   
	        sop("index="+al.indexOf("java02"));  
	  
	        List sub = al.subList(1,3);  
	  
	        sop("sub="+sub);  
	    }  
	    public static void main(String[] args) {  
	//演示列表迭代器。   
	        ArrayList al = new ArrayList();  
	  
	        //添加元素   
	        al.add("java01");  
	        al.add("java02");  
	        al.add("java03");  
	  
	        sop(al);  
	    ListIterator li = al.listIterator();  
	  
	    //sop("hasPrevious():"+li.hasPrevious());  
	  
	        while(li.hasNext())  
	        {  
	            Object obj = li.next();  
	  
	            if(obj.equals("java02"))  
	                //li.add("java009");  
	                li.set("java006");  
	                }  
	  
	        while(li.hasPrevious()) {  
	            sop("pre::"+li.previous());  
	        }  
	        //sop("hasNext():"+li.hasNext());   
	        //sop("hasPrevious():"+li.hasPrevious());  	  
	  
	        sop(al);  
	  
	        /* 
	        //在迭代过程中,准备添加或者删除元素。 
	 
	        Iterator it = al.iterator(); 
	 
	        while(it.hasNext()) 
	        { 
	            Object obj = it.next(); 
	 
	            if(obj.equals("java02")) 
	                //al.add("java008"); 
	                it.remove();//将java02的引用从集合中删除了。remove 本身就是iterator的方法 
	 
	            sop("obj="+obj); 
	    } 
	        sop(al); 
	        */  
	    }  
	}  


9、LinkedList:特有方法:   

addFirst();
addLast();
getFirst();
getLast();获取元素,但不删除元素。如果集合中没有元素,会出    NoSuchElementException
removeFirst();
removeLast();获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
   在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();//peek看一眼的意思
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();//poll剪短,修剪
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。

10. 练习:

使用LinkedList模拟一个堆栈或者队列数据结构。
堆栈:先进后出  如同一个杯子。
队列:先进先出 First in First out  FIFO 如同一个水管

package until.cn.itcast;  
 import static java.lang.System.*;
   import java.util.*;  
   
 /*思路:定义一个静态方法,给方法singleElement传递一个集合,在方法中再创造一个集合, 
  * 在迭代时用contains方法判断元素是否存在,不存在则添加到新的集合中,并返回新的集合*/  
 public class SingleElement {  
   
     /** 
      * @param args 
      */  
     public static void main(String[] args) {  
         // TODO Auto-generated method stub  
         ArrayList<String> al = new ArrayList<String>();  
           
         al.add("asd");  
         al.add("asdd");  
         al.add("dff");  
         al.add("asdsd");  
         al.add("asadd");  
         al.add("asd");  
           
         out.println(al);             
         al =singleElement(al);//调用去除重复元素方法。  
         out.println(al);  
     }  
     public static ArrayList<String> singleElement(ArrayList<String> l){  
         ArrayList<String> newal = new ArrayList<String>();  
         Iterator<String> it = l.iterator();  
         while(it.hasNext()){  
             String obj = it.next();  
             if(!newal.contains(obj))  
                 newal.add(obj);  
         }  
         return newal;  
     }  
   
 }  


12、练习:


将自定义对象作为元素存到ArrayList集合中,并去除重复元素。


比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。


思路:


1,对人描述,将数据封装进人对象。


2,定义容器,将人存入。


3,取出。


细节:Person p = (Person)it.next();


if(!(obj instanceof Person))   return false;


       List集合判断元素是否相同,依据是元素的equals方法。Removecontains都是依赖于元素的equals方法

ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java02");
al.add("java01");
//al.add("java03");
/*
在迭代时循环中next调用一次,就要hasNext判断一次。
Iterator it = al.iterator();
while(it.hasNext())
{
sop(it.next()+"...."+it.next());//这种方式最好不要出现,当集合是奇数时容易发生空指针异常。
}


 




13|--Set元素是无序(存入和取出的顺序不一定一致),元素不可以重复。


          Set集合的功能和Collection是一致的。


|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。


    HashSet是如何保证元素唯一性的呢?


         是通过元素的两个方法,hashCodeequals来完成。


         如果元素的HashCode值相同,才会判断equals是否为true


         如果元素的hashcode值不同,不会调用equals


 


练习体现:  体现set集合的不重复性(通过hashcode()equals方法确定,对于hashCode建议类似name.hashCode()+age*37;


注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcodeequals方法。


|--TreeSet:可以对Set集合中的元素进行排序。


          底层数据结构是二叉树。


         保证元素唯一性的依据:


         compareTo方法return 0.


TreeSet排序的第一种方式:


 让元素自身具备比较性。


    元素需要实现lang包中的Comparable接口,覆盖compareTo方法。


      也种方式也成为元素的自然顺序,或者叫做默认顺序。


TreeSet的第二种排序方式。


        当元素自身不具备比较性时,或者具备的比较性不是所需要的。


        这时就需要让集合自身具备比较性。Until包中的comparator接口覆盖 compare();方法


       在集合初始化时,就有了比较方式。

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值