JAVA基础――API(集合类)(一)

2014-11-24 02:36:06 · 作者: · 浏览: 5

集合框架:

\


< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+amF2Ybyvus/A4Nb30qrTyUNvbGxlY3Rpb27T601hcL3Tv9rFycn6tviz9qGjPC9wPgo8cD6yzrz7SkFWQSBBUEmjumphdmEudXRpbDxicj4KPC9wPgo8cD48YnI+CjwvcD4KPGgxPkNvbGxlY3Rpb26907/aPC9oMT4KMaOszO280zxicj4KYWRkKGUpOyAKPGJyPgphZGRBbGwoY29sbGVjdGlvbik7PGJyPgoyo6zJvrP9PGJyPgpyZW1vdmUoZSk7IAo8YnI+CnJlbW92ZUFsbChjb2xsZWN0aW9uKTs8YnI+CmNsZWFyKCk7PGJyPgozo6zF0LbPoaM8YnI+CmNvbnRhaW5zKGUpOyAKLy8g1eK49re9t6jTw7W9wctlcXVhbHOjqKOpt723qKGjyOe5+7TmyOu1xMrH19S2qNLlwODQzaOs0OjSqtTa19S2qMDg0M3KsbiyuMe3vbeoo7pwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaimhowrXotLi0qq9q29iase/16qhozxicj4KaXNFbXB0eSgpOzxicj4KNKOsu/HIoTxicj4KaXRlcmF0b3IoKTsgCi8vt7W72NK7uPZJdGVyYXRvcrbUz/OjrNPD09qx6cD6vK+6z9Sqy9g8YnI+CnNpemUoKTs8YnI+CjWjrLvxyKG9u7yvoaM8YnI+CnJldGFpbkFsbCgpOzxicj4KNqOsvK+6z7Hkyv3X6aGjPGJyPgp0b0FycmF5KCk7CjxwPjxicj4KPC9wPgo8aDI+"-----List接口 本身特点:元素是有序的,元素可以重复,元素有索引。 方法特点:新增了一些可以根据索引操作集合元素的方法; 新增了List特有的迭代器接口ListIterator; 增
add(index,element);
addAll(index,Collection);

remove(index);

set(index,element);

get(index):
subList(from,to);//类似substring
int indexOf(obj)://获取指定元素的位置。
ListIterator listIterator(); //List特有的迭代器接口Listiterator

特别的:独特的遍历方法,利用角标。

for(int x=0; x
  

   
ListIterator新增功能:
一般的迭代器Iterator只能判断,取出元素,不能操作元素(最多删除元素),但是List的特有迭代器可以操作元素。 此迭代器特有的方法: add(E e)
set(E e)
hasPrevious()
previous() //返回前面一个元素,配合上面一个方法可以反向遍历集合


|-----ArrayList

|-----Vector

ArrayList与Vector是List接口的典型实现,底层是数组结构。特点:查询速度很快。但是增删稍慢。
ArrayList与Vector区别: 他们几乎一样,Vector比较古老(JDK 1.0) 1、ArrayList线程不安全(线程不同步的),性能高。Vector线程安全(线程同步),性能低 总之:Vector已被淘汰。用ArrayList。
他们与数组用法上的区别:
1、数组的容量是固定的(虽然也可以扩充的方法,但不主张),而ArrayList的容量是动态的。
2、一个数组只能保存一种类型,而Arraylist可以保存不同类型。
3、数组可以保存基本数据类型,但ArrayList不可以,它保存的是Object类的引用,因此在取出元素时,要做类型转换,或利用泛型。
4、数组的效率高,但ArrayList的效率低。当增加一个新元素时,ArrayList首先要检查其内部数组是否越界,如没有越界,则可增加;如越界,则新建一个两倍于当前内部数组容量的新数组,将旧内部数组的元素拷贝至新内部数组,并废弃旧数组,因此其效率相比数组要低。


|-----LinkedList

底层是链表结构。特点:增删速度很快,查询稍慢。线程不同步。 LinkedList:特有方法:
addFirst();
addLast();

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

在JDK1.6出现了替代方法。
offerFirst();
offerLast();

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

|-----Set接口

特点:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。

|-----HashSet

底层是哈希表,是线程不安全的,元素不可重复。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。

注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
例子:
/*
往hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素。
需要重写:hashCode函数和equals函数
*/
import java.util.*;
class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public String getName()
	{
		return name;

	}
	public int getAge()
	{
		return age;
	}
	public int hashCode()
	{
		System.out.println("调用了hashCode方法");
		return name.hashCode()+age*7;
	}
	public boolean equals(Object obj)
	{
		System.out.println("调用了equals方法");
		if(!(obj instanceof Person))
			throw new ClassCastException();
		Person p=(Person)obj;
		return name.equals(p.name)&&age==p.age;
	}
}
class HashSetDemo 
{
	public static void main(String[] args) 
	{
		HashSet
    
      hs=new HashSet
     
      (); hs.add(new Person("lisi01",10)); //调用了hashCode方法 hs.add(new Person("lisi01",10)); //调用了hashCode方法,调用了equals方法,发现重复,不存储 hs.add(new Person("lisi03",12)); //调用了hashCode方法 hs.add(new Person("lisi04",13)); //调用了hashCode方法 Iterator
      
        it=hs.iterator(); while(it.hasNext()) { Person p=it.next(); System.out.println(p.getName()+"......"+p.getAge()); } } }
      
     
    

|-----TreeSet

确切的说TreeSet是SortSet接口的实现。顾名思义可以对Set集合的元素排序。 TreeSet的底层数据结构是二叉树。 TreeSet是如何保证元素唯一性的呢? int compareTo()方法return 0,即表明两个元素相等,不存储。


TreeSet排序有两种方式: TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。
这种方式也称为元素的自然顺序,或者叫做默认顺序。

TreeSet的第二种排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
通过定义新的类实现Comparator接口的比较器,然后覆盖public int co