黑马程序员_集合Collection

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

1.集合框架:

java中集合类的关系图




概述:

2.Collection接口有两个子接口:
List(列表),Set(集合)
(1)List:元素是有序的,可以重复 List集合判断元素是否相同运用的是equals方法。比如contains方法 remove方法

 |--ArrayList:底层的数据结构是数组结构。特点:查询修改速度很快 缺点:增加删除稍慢

 |--LinkedList:底层的数据结构是链表数据结构。线程不同步 特点:增删速度很快,查询稍慢。

 |--Vector :底层是数组数据结构。线程同步。ArrayList是线程不同步的。

(2)Set:元素是无序(存入和取出的顺序不一定一致)的,不可以重复
 |--HashSet:底层数据结构是哈希表。线程时不同步的。
 HashSet是如何保证元素的唯一性的呢?
是通过元素的两个方法:hashCode和equals来完成

先判断hashCode,如果相同,再用equals比较。

 HashSet中的判断和删除依据的也是hashCode和equals方法。

 |--TreeSet:底层数据结构是二叉树。可以对Set集合中的元素进行排序。线程不同步
保证元素唯一性的依据:compareTo方法return 0;

3.List,Set的方法:

(1)ArrayList的方法:
添加:
boolean add(E e): 将指定的元素添加到此列表的尾部。
void add(int index, E element): 将指定的元素插入此列表中的指定位置。
boolean addAll(Collection<? extends E> c):按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部 。
boolean addAll(int index, Collection<? extends E> c): 从指定的位置开始,将指定 collection
中的所有元素插入到此列表中。 

删除:

void clear(): 移除此列表中的所有元素。
E remove(int index): 移除此列表中指定位置上的元素。 
boolean remove(Object o): 移除此列表中首次出现的指定元素(如果存在)。
protected  void removeRange(int fromIndex, int toIndex): 移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
boolean removeAll(Collection<?> c): 从列表中移除指定 collection 中包含的其所有元素 
获取:
E get(int index): 返回此列表中指定位置上的元素。
int indexOf(Object o): 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
int lastIndexOf(Object o) 返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。   
public List<E> subList(int fromIndex,int toIndex): 返回列表中指定的 fromIndex(包括 )
和 toIndex(不包括)之间的部分视图。
Iterator<E> iterator(): 返回按适当顺序在列表的元素上进行迭代的迭代器。
ListIterator<E> listIterator(int index):返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
修改:(特有方法!!)
E set(int index, E element): 用指定的元素替代此列表中指定位置上的元素。 
(2)LinkedList的方法:
方法摘要:(特有的)
添加
void addFirst(E e): 将指定元素插入此列表的开头。 
void addLast(E e): 将指定元素添加到此列表的结尾。 
获取元素,但不删除元素
E get(int index): 返回此列表中指定位置处的元素。           
E getFirst(): 返回此列表的第一个元素。          
E getLast(): 返回此列表的最后一个元素。
获取元素且删除元素
E remove(): 获取并移除此列表的头(第一个元素)。          
E remove(int index): 移除此列表中指定位置处的元素。         
boolean remove(Object o): 从此列表中移除首次出现的指定元素(如果存在)。         
E removeFirst(): 移除并返回此列表的第一个元素。 
E removeLast(): 移除并返回此列表的最后一个元素。
修改
E set(int index, E element) 将此列表中指定位置的元素替换为指定的元素。 
(3)Vector
添加:
boolean add(E e): 将指定元素添加到此向量的末尾。
void add(int index, E element): 在此向量的指定位置插入指定的元素。         
boolean addAll(Collection<? extends E> c):将指定 Collection 中的所有元素添加到此向量的末尾, 按照指定 collection 的迭代器所返回的顺序添加这些元素。 
boolean addAll(int index, Collection<? extends E> c): 在指定位置将指定 Collection 中的所有元素插入到此向量中。
获取:
Enumeration<E> elements(): 返回此向量的组件的枚举。

 Vector特有的取出方式:
枚举和迭代器很像,其实枚举和迭代器是一样的,只是因为枚举的名称和方法的名称名字都过长,所以枚举被迭代器取代了。
(4)枚举Enumeration的方法摘要:
boolean hasMoreElements(): 测试此枚举是否包含更多的元素。 
E nextElement(): 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。 
(5)Set集合子类及其方法:

TreeSet:使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序.
添加:
boolean add(E e)  将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
boolean addAll(Collection<? extends E> c) 将指定 collection 中的所有元素添加到此 set 中。
删除:
void clear() 移除此 set 中的所有元素。 

boolean remove(Object o)  将指定的元素从 set 中移除(如果该元素存在于此 set 中)。

E pollFirst() 获取并移除第一个(最低)元素;如果此 set 为空,则返回 null。 
E pollLast() 获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null。 
获取:
Iterator<E> iterator()  返回在此 set 中的元素上按升序进行迭代的迭代器。
E first() 返回此 set 中当前第一个(最低)元素。
E last() 返回此 set 中当前最后一个(最高)元素。
int size()  返回 set 中的元素数(set 的容量)。
判断:
boolean isEmpty()  如果此 set 不包含任何元素,则返回 true。 
boolean contains(Object o) 如果此 set 包含指定的元素,则返回 true。

4.迭代:

迭代器:就是集合取出元素的一种方式。因为要取出的元素都在集合的内部,就把取出方式定义在集合的内部,定义成了内部类。
而每一个容器的数据结构不同,但是共性内容都有判断和取出,这样把共性抽取。而这些内部类都符合一个规则,这个规则就是Iterator。
再通过一个对外提供的方法iterator()来获取集合中的对象。
ArrayList al = new ArrayList();
for(Iterator it = al.iterator();it.hasNext();)
{
it.next();
}

5.模拟堆、栈的示例:

import java.util.*;  
class DuiZhan  
{  
    private LinkedList link;  
    DuiZhan()  
    {  
        link = new LinkedList();  
    }  
    public void MyAdd(Object obj)  
    {  
        link.addFirst(obj);  
    }  
    public Object MyGet()  
    {  
        return link.removeFirst();//如果是队列的话,只需要改成removeLast()  
    }  
    public boolean isNull()  
    {  
        return link.isEmpty();  
    }  
}  
  
  
class DuiZhanDemo  
{  
    public static void main(String[] args)  
    {  
        DuiZhan dz = new DuiZhan();  
    }  
}  
6.Hashset示例,需要重写hashcode和equals

class HashSetTest 
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	public static void main(String[] args) 
	{
		HashSet hs = new HashSet();

		hs.add(new Person("a1",11));
		hs.add(new Person("a2",12));
		hs.add(new Person("a3",13));
//		hs.add(new Person("a2",12));
//		hs.add(new Person("a4",14));

		//sop("a1:"+hs.contains(new Person("a2",12)));
			
//		hs.remove(new Person("a4",13));
		

		Iterator it = hs.iterator();

		while(it.hasNext())
		{
			Person p = (Person)it.next();
			sop(p.getName()+"::"+p.getAge());
		}
	}
}
class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public int hashCode()
	{
		System.out.println(this.name+"....hashCode");
		return name.hashCode()+age*37;
	}

	public boolean equals(Object obj)
	{

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

		Person p = (Person)obj;
		System.out.println(this.name+"...equals.."+p.name);

		return this.name.equals(p.name) && this.age == p.age;
	}

	
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
}

7.TreeSet
TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口,复写compareTo方法
也称为自然顺序。
class Student implements Comparable  
{  
    private String name;  
    private int age;  
  
  
    Student(String name,int age)  
    {  
        this.name = name;  
        this.age = age;  
    }  
    public int compareTo(Object obj)//复写compareTo方法,让元素具备自然顺序  
    {  
        if(!(obj instanceof Student))  
            throw new ClassCastException();  
        Student stu = (Student)obj;  
        if(this.age>stu.age)  
            return 1;  
        if(this.age<stu.age)  
            return -1;  
        return this.name.compareTo(stu.name);  
    }  
  
  
    public String getName()  
    {  
        return name;  
    }  
    public int getAge()  
    {  
        return age;  
    }  
}  
TreeSet的第二种排序方式:当元素不具备自然顺序,或者自然顺序不是所需要的。
这时需要让集合自身具备比较性。实现Comparator接口,覆盖compare方法。覆盖方法时要考虑比较的主要条件和次要条件。

class MyCompare implements Comparator  
{  
    public int compare(Object o1,Object o2)  
    {  
        Student s1 = (Student)o1;  
        Student s2 = (Student)o2;  
  
  
        int num = s1.getName().compareTo(s2.getName());  
        if(num==0)  
            return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));//s1.getAge()-s2.getAge();  
        return num;  
    }  
}  


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值