黑马程序员_集合1

来源:互联网 发布:河南消防网络知识竞赛 编辑:程序博客网 时间:2024/06/07 02:14

---------------------- android培训、java培训、期待与您交流! ----------------------

 

为什么出现集合类?

 面向对象语言对事物的体现都是以对象形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常见的一种方式。

数组和集合类同时容器,有何不同?

数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。数组中可以存储基本类型,集合只能存储对象。

集合类的特点:集合值用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。


集合框架 Collection
  |--List:元素是有序的,元素可以重复因为该集合体系有索引。
     |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快、但是增删稍慢。线程不同步
     |--LinkedList:底层的数据结构是使用的链表结构。特点:增删的速度很快,查询稍慢。
     |--Vector:底层是数组数据结构 Vector是线程同步的。无论增删改查都稍慢被Arraylist替换了。
   (都是常用的)

  |--Set:元素是无序,元素不可以重复。

     HashSet、TreeSet(都是常用的)

 add()方法的参数类型是Object,以便于接收任意类型对象。集合中存储的都是对象的引用(地址)。
 retainAll()方法  保留两个集合的相同元素。
 迭代器 Iterator  其实就是集合的取出元素的方式。 Iterator it = 集合对象.iterator();
 把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内容的元素。那么取出方式就被定义成了内部类。
 而每一个容器的数据结构不同,所以取出的细节动作也不一样。但是都有共性内容判断和取出。那么可以将共性抽取。 那么这些内部类都符合一个规则。该规则是Iterrator。如何获取集合的取出对象呢? 通过一个对外提供的方法。iterator();


 注意:我们用迭代器是用for循环
 Arraylist al = new Arraylist();
 
 for(Iterator it = al.iterator(); ti.hasNext();)
 {
  ...........
 }   用完迭代器后要释放内存。

 

List : 
 特有的方法。凡是可以操作角标的方法都是该体系特有的方法。

 曾
   add(index,element);//在制定的位置添加元素。
   addAll(index,collection);
 删
   remove(index);//删除制定位置的元素。
 改
   set(index,E element);//修改制定位置的元素。
 查
      get(index);//通过角标获取元素。
   subList(from,to);//可以获取全部元素。包含from不包含to。
   ListIterator();//在迭代过程中,准备添加或者删除元素。
      注意:这是在List中特有的迭代器。ListIterator 是Iterator的子接口。在迭代时。不可以通过集合对象的方法操作集合中的元素。因为会产生ConcurrentModificationException异常。所以,在迭代时,只能用迭代器的方式来操作元素。可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加、修改等。就要使用其子接口,ListIterator.该接口只能过List集合的ListIterator方法获取。


 indexOf();//获取对象的位置。

LinkedList:特有的方法
 addFirst();
 addLast();

 getFirst();
 getLast();
 获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException异常。

 removeFirst();
 removeLast();
 获取元素,但是元素呗删除。如果集合中没有元素,会出现NoSuchElementException异常。


在JKK1.6出现了替代方法。

offerFirst();
offerLast();

peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。

pollFirst();
pollLast();
获取元素,但是元素呗删除。如果集合中没有元素,会返回null。

 


LinkedList案例:

 

使用LinkedList模拟一个堆栈或队列的数据结构。

堆栈:先进后出  如同一个杯子
队列:先进先出 First in First out   FIFO 如同一个水管。

 

 

先进先出

package com.hm.collection;

import java.util.*;

class DuiLie
{
 private LinkedList link;

 public DuiLie()
 {
  link = new LinkedList();
 }
 public void myAdd(Object o)
 {
  link.addFirst(o);
 }
 public Object myGet()
 {
  return link.removeLast();
 }     
 public boolean isNull()
 {
  return link.isEmpty();
 }
}

 

先进后出

 

class DuiZhan
{
 private LinkedList link;

 public DuiZhan()
 {
  link = new LinkedList();
 }
 public void myAdd(Object o)
 {
  link.addFirst(o);
 }
 public Object myGet()
 {
  return link.removeFirst();
 }     
 public boolean isNull()
 {
  return link.isEmpty();
 }
}

class LinkedListTest
{
 public static void main(String[] args)
 {
  DuiLie du = new DuiLie();
  du.myAdd("java01");
  du.myAdd("java02");
  du.myAdd("java03");
  du.myAdd("java04");

  System.out.println(du);

  
  while(!du.isNull())
  {
   System.out.println(du.myGet());
  }
  
 }

 
}

 


Arraylist 案例:

 

  结论:List集合判断元素是否相同,依据的是元素的equal()方法.
 


import java.util.*;

public class ArrayListDemo2 {

 public static void main(String[] args) {
  
  ArrayList al = new ArrayList();
  
  al.add(new Person("zhangsan",30));
  al.add(new Person("zhangsan1",32));
  al.add(new Person("zhangsan1",32));
  al.add(new Person("zhangsan1",32));
  al.add(new Person("zhangsan2",35));
  al.add(new Person("zhangsan3",31));
  al.add(new Person("zhangsan3",31));
  al.add(new Person("zhangsan3",31));
  
  
  al = SingleElement(al);
  
  System.out.println(al.remove(new Person("zhangsan",30)));//这里的remove()方法依赖于equals方法。
  
  Iterator it = al.iterator();
  
  while(it.hasNext()){
   
   Person p = (Person)it.next();
   System.out.println(p.getName() +":::" + p.getAge());
   
  }
 }
 
public static ArrayList SingleElement(ArrayList al){
  
  ArrayList newAl = new ArrayList();
  
  Iterator it = al.iterator();
  
  while(it.hasNext()){
   
   Object obj = it.next();
   
   if(!newAl.contains(obj))//contains()方法是依赖于equals()方法的
    newAl.add(obj);
  }
  
  return newAl;
 }

}

class Person{
 
 private String name;
 private int age;
 
 public Person(String name,int age){
  
  this.name = name;
  this.age = age;
 }
 //重写了 Object类的equals方法。
 public boolean equals(Object obj){
  if(!(obj instanceof Person)){
   return false;
  }
  Person p = (Person)obj;
  System.out.println(this.name + "...." + p.name);
  
  return this.name.equals(p.name) && this.age == p.age;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }
 
 
}

 

 

---------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

原创粉丝点击