您的位置:首页 > 职场人生

黑马程序员java基础知识之集合Collection

2015-01-23 09:02 603 查看
------- android培训java培训、期待与您交流! ----------
集合框架:collection

--List:元素是有序的,元素可以重复,因为该集合体系有索引

--ArrayList:底层使用数组结构;查询速度很快,增删较慢,线程不同步

--LinkList:底层使用链表结构;增删速度快,查询速度慢

--Vector:底层是数组数据结构,线程同步

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

--HashSet:底层数据结构是哈希表

--TreeSet

这些容器对数据的存储方式都有所不同,所以将这些存储方式称之为数据结构

1.collection集合中的增删改查

import java.util.*;
class CollectionDemo
{
   public static void main(String[] args)
   {
       ArrayList al=new ArrayList();	//创建一个集合容器

       //添加元素
       al.add("java01");
       al.add("java02");
       al.add("java03");
       al.add("java04");

       //获取个数,集合长度。
       sop("size:"+al.size());

      //打印集合
      sop(al);

      //删除元素
      al.remove("java02");

      //打印集合
      sop(al);

	//判断元素
	sop(al.contains("java03"));
	sop(al.isEmpty());

    }
    
     public static void method_2()
   {
       ArrayList al1=new ArrayList();
       
       al1.add("java01");
       al1.add("java02");
       al1.add("java03");
       al1.add("java04");

       ArrayList al2=new ArrayList();
       
       al2.add("java01");
       al2.add("java02");
       al2.add("java05");
       al2.add("java06");

       al1.retainAll(al2);	//取交集,al1中只保存和al2中相同的元素
       al1.removeAll(al2);	//将al1中与al2相同的元素去掉

       sop("al1:"+al1);
       sop("al2:"+al2);
    }

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


元素的取出:Iterator 迭代器

import java.util.*;
class CollectionDemo2
{
    public static void main(String[] args)

    {
        getMethod();
     }
	public static void  getMethod()
	{
		
       ArrayList al=new ArrayList();	//创建一个集合容器

       //添加元素
       al.add("java01");
       al.add("java02");
       al.add("java03");
       al.add("java04");

	Iterator it=al.iterator();	//获取迭代器,用于取出集合中的元素
	
	while(it.hasNext())	//判断是否有元素
	  {
		sop(it.next());	//打印出元素	
	  }
	}
    public static void sop(Object obj)
    {
       System.out.println(obj);
    }
}


迭代器的for循环写法:

for(Iterator it=al.iterator;it.hasNext();  )
{
<span style="white-space:pre">	</span>sop(it.next());
}

2.List集合:特有方法,可以操作角标的方法都是该体系特有的方法

import java.util.*;
class ListDemo
{
   public static void main(String[] args)
   {
       ArrayList al= new ArrayList();
     
       //添加元素
       al.add("java01");
       al.add("java02");
       al.add("java03");
       al.add("java04");

       sop("原集合是:"+al);

       ListIterator li=al.listIterator();  //Iterator 只能其自身方法操作元素,比如取出删除,但要想用到添加和修改,就需要子接口ListIterator
       while(li.hasNext())
       {
          Object obj= li.next();	//接收遍历出来的元素
          if(obj.equals("java02"))
          li.set("java006");		//替换元素
        }
        sop(al);
/*
       Iterator it=al.iterator();
       while(it.hasNext())
       {
           Object obj=it.next();
           if(obj.equals("java02"))
           {
             it.remove();
              sop(obj);
           }
        }
*/
    
    }
   
    public static void sop(Object obj)
    {
       System.out.println(obj);
     }

    public static void method_1()
    {
        ArrayList al= new ArrayList();
     
       //添加元素
       al.add("java01");
       al.add("java02");
       al.add("java03");
       al.add("java04");

       sop("原集合是:"+al);
       
       //在指定位置添加元素
       al.add(1,"java09");
       sop("现在的集合是:"+al);
     
      //删除指定位置的元素
      al.remove(2);
      sop(al);

      //修改元素
      al.set(1,"java009");
      sop(al);

      //通过角标获取元素
     sop(al.get(1));
     //获取所有元素
     for(int x=0;x<al.size();x++)	//for循环遍历元素
     {  sop(al.get(x));}

      Iterator it= al.iterator();	//迭代器遍历元素
 
       while(it.hasNext())
       {
          sop(it.next());
        }

      sop(al.indexOf("java02"));	//获取元素角标
      List sub=al.subList(1,3);		//获取指定位置的元素集合,包含1不包含3
       sop(sub);
    }

}


Vector的枚举方法

import java.util.*;
class VictorDemo
{
   public static void main(String[] args)
   {
       Vector va=new Vector();
    
       va.add("java01");
       va.add("java02");
       va.add("java03");
       va.add("java04");

       Enumeration en=va.elements();	//枚举获取元素
    
       while(en.hasMoreElements())
       {
              System.out.println(en.nextElement());
        }
    }
}


LinkedList :特有方法:addFirst,addLast;getFirst,getLast,获取元素,但不删除元素;removeFirst,removeLast获取元素,元素被删除

但当集合为空的时候,remove 和get都会产生异常,所以在JDK1.6有了替代办法,用offer替代add,用peek替代get,用poll替代remove,此时集合如果为空,返回null

import java.util.*;
class LinkListDemo
{
   public static void main(String[] args)
   { 
     LinkedList li=new LinkedList();	//新建一个LinkedList对象
     li.addFirst("java01");		//将元素添加到第一个位置
     li.addFirst("java02");
     li.addFirst("java03");		//将元素添加到第一个位置
     li.addFirst("java04");		
      
     sop(li.removeFirst());
/*
      while(!li.isEmpty())
      {
         sop(li.removeFirst());
       }
  */
    }
   public static void sop(Object obj)
   {
      System.out.println(obj);
    }
}


模拟一个队列的数据结构

//使用LinkedList模拟一个堆栈或者队列的数据结构
import java.util.*;
class LinkedListTest
{
    public static void main(String[] args)
    {
        Duilie dl=new Duilie();	//新建一个队列对象
        
       dl.Myadd("java01");	//运用自定义的添加方法添加元素
       dl.Myadd("java02");
       dl.Myadd("java03");
       dl.Myadd("java04");

       while(!dl.isNull())
       {
          sop(dl.Myget());	//运用自定义的get方法,获取元素
        }
     }
    public static void sop(Object obj)
    {
       System.out.println(obj);
     }
}
class Duilie	//自定义一个队列类
{
   private LinkedList link;	//声明一个LinkedList链表变量
   Duilie()	//构造函数
   {
      link=new LinkedList();	//初始化link
    }
    public void Myadd(Object obj)	//自定义一个增加元素的方法
    {
       link.addFirst(obj);
    }
    public Object Myget()	//自定义一个获取元素的方法
    {
      return link.removeLast();
    }
   public boolean isNull()	//判断是否为空
   {
      return link.isEmpty();
    }
   
}


练习:ArrayList练习:去除集合中的重复元素

import java.util.*;
class ArrayListTest
{
   public static void main(String[] args)
   {
      ArrayList al=new ArrayList();
      al.add("java01");
      al.add("java02");
      al.add("java03");
      al.add("java02");
      al.add("java05");
      sop(al);
      al=singleElement(al);
      sop(al);
    }
   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))
          newal.add(obj);	//如果元素不重复,添加到新集合中
        }
       return newal;	//将新集合返回
    }
   public static void sop(Object obj)
   {
        System.out.println(obj);
    }
}


AaaryList练习2:将自定义对象作为元素存入ArrayList集合中,去除相同元素。存人对象,名称相同视为同一个人

注:contains ,remove底层都是用的equals方法,只比较地址值

import java.util.*;
class Person	//定义一个Person类
{
	//声明name,age变量
    private String name;
    private int age;

    Person(String name,int age)		//构造函数
    {
	//将name,age作用于整个类中
       this.name =name;		
       this.age=age;
     }
    public boolean equals(Object obj)	//构造属于Person的比较方法
	{
		//如果obj不属于person类型,就返回假
		if(!(obj instanceof Person))
		return false;

		//属于peron类型,则说明两个对象相等
		Person p=(Person)obj;
		
		return this.name.equals(p.name) && this.age==p.age;
	}
    public String getName()	//获取名字的方法
    {
       return name;
    }
    public int getAge()		//获取年龄的方法
    {
        return age;
     }
}

class ArrayListTest2
{
   public static void main(String[] args)
  {
    ArrayList al=new ArrayList();
    al.add(new Person("lise1",31));
    al.add(new Person("lise2",32));
    al.add(new Person("lise1",31));
    al.add(new Person("lise2",32));

    al=singleElement(al);
    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))
          newal.add(obj);	//如果元素不重复,添加到新集合中
        }
       return newal;	//将新集合返回
   }
}


3.set集合

HashSet集合的应用:无序性,取进和取出的顺序不一样。其取出元素只有迭代器一种方法

import java.util.*;
class HashSetDemo
{
	public static void main(String[] args)
	{
		HashSet hs=new HashSet();	//新建一个hashSet集合

		hs.add("java01");
		hs.add("java02");
		hs.add("java02");
		hs.add("java01");

		Iterator it=hs.iterator();	//获取迭代器,注意,hashSet取出元素只有迭代器一种方法

		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}


练习:往HashSet中存入自定义对象,姓名和年龄相同为同一个人

import java.util.*;
class HashSetTest
{
	public static void main(String[] args)
	{
		HashSet hs=new HashSet();	//新建一个hashSet集合

		hs.add(new Person("lise1",31));
    		hs.add(new Person("lise2",32));
    		hs.add(new Person("lise1",31));
   		hs.add(new Person("lise2",32));
		Iterator it=hs.iterator();	//获取迭代器,注意,hashSet取出元素只有迭代器一种方法

		while(it.hasNext())
		{
			Person p=(Person)it.next();
			System.out.println(p.getName()+"::"+p.getAge());
		}
	}
}

class Person	//定义一个Person类
{
	//声明name,age变量
    private String name;
    private int age;

    Person(String name,int age)		//构造函数
    {
	//将name,age作用于整个类中
       this.name =name;		
       this.age=age;
     }

   public int hashCode()	//重写hashCode方法,集合就会根据哈希值不同保证元素唯一性
	{
		return name.hashCode()+age;
	}

    public boolean equals(Object obj)	//构造属于Person的比较方法
	{
		//如果obj不属于person类型,就返回假
		if(!(obj instanceof Person))
		return false;

		//属于peron类型,则说明两个对象相等
		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 int getAge()	//获取年龄的方法
    {
       return age;
    }
}
hashSet保持元素唯一性的原理:通过hashCode和equals方法来完成,如果元素hashCode相同,则调用equals方法,因为调用equals方法会比较慢,所以最好保持hashCode的唯一性

因此,其判断元素是否存在以及删除元素的判断依据都是hashCode值和equals方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: