集合框架:

< 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) { HashSeths=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