集合框架介绍
Collection
|-----List:元素是有序的,元素可以重复,因为该结婚体系有索引
|-----ArrayList:底层数据结构使用的是数组结构;线程不同步JDK1.2。特点是查询快,增删慢
|-----LinkedList:底层使用的是链表数据结构;特点是增删慢,查询快
|-----Vector:底层是数据数据结构;是线程同步的。JDK1.0被ArrayList替代。(一般不用了)
|-----Set:元素是无序的,元素不可以重复
|-----HashSet:底层数据结构是哈希表,线程非同步的;
|-----TreeSet:可以对Set集合中的元素进行排序,底层数据结构是二叉树;
迭代器:用于取出元素的方式
该取出方式被定义成为了内部类,而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都是共性内容判断和取出,那么可以将共性抽取。
这些内部类都符合一个规则,该规则是Iterator。通过iterator();方法获取。
List集合特有的迭代器,ListIterator是Iterator的子接口,在迭代时,不可以通过集合中的方法操作集合中的元素,因为会发生异常,
所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断,取出,删除操作
如果想要其他的操作,如添加、删除等,就需要使用其自接口ListIterator。该接口只能通过List的listIterator();方法获取,因为其中的元素都含有角标
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
for(ListIterator li = al.listIterator(); li.hasNext();)
{
Object obj = li.next();
if(obj.equals("java02"))
{
li.set("java002");
li.add("java003");
}
}
HashSet
HashSet是通过两个方法来确保元素的唯一性:hashCode和equals方法来完成的
如果hashCode值相同,才会判断equals是否为true;如果hashCode值不同,才会调用equals方法来进一步判断;
所以,当使用HashCode结构来存储自定义对象的时候,需要覆写hashCode和equals方法。对于判断元素是否存在、删除等操作的时候,一拉的方法是元素的着两个方法。
TreeSet
底层数据结构是二叉树,保证元素的唯一性一局是compareTo方法,元素必须具备可比性;
第一种:让元素自身具备比较性;元素需要实现Comparable接口,覆盖compareTo方法,这种方式也成为元素的自然顺序,或者叫做默认顺序
//使对象自身具备比较性
class Student implements Comparable
{
private String name;
private int age;
Student(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return this.name;
}
public int getAge()
{
return this.age;
}
public int compareTo(Object obj)
{
if(obj instanceof Student)
throw new RuntimeException("不是学生对象!");
Student s = (Student)obj;
if(this.age > s.age)
return 1;
else if(this.age == s.age)
return 0;
else
return -1;
}
}
第二种:当元素自身不具备计较性,或者具备的比较性不是所需要的,这时就让需要让集合自身具备比较性。在集合初始化时,就有了比较方式(参阅构造函数)
//自定义比较器类,实现比较方法接口
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)
{
if(s1.getAge() > s2.getAge())
return 1;
else if(s1.getAge() == s2.getAge())
return 0;
else
return -1;
}
return num;
}
}
TreeSet ts = new TreeSet(new MyCompare());//初始化的同时,使容器自身具备比较性
两种都存在时,以比较器为主。