首页 > 代码库 > 集合类学习笔记

集合类学习笔记

一、概念

集合是存储对象的一种方式。集合中都是存放着地址,方便引用。JDK 1.2版本的时候就有了

二、集合和数组的区别

集合是可变长度,数组是固定长度。

数组可以存储基本数据类型,集合只能存储对象,集合可以存储不同类型的对象。

Collection

1.List:元素是有序的,可以重复,有索引

2.Set:元素是无序的,不可以重复,使用hash值排列

 

 image

 

三、CURD

boolean add(E e);

boolean addAll(Collection<? extends E> c);

void clear();  清空容器

boolean remove(Object o);

boolean removeAll(Collection<?> c);

boolean contains(Object o);

 

四、迭代器

用于取出集合内元素的方式:

ArrayList al = new ArrayList();
Iterator it = al.iterator();//迭代器
it.next();//返回值
it.hasNext()//boolean的类型

每个容器都有存和取,每个容器的数据结构不同,存取方式可能也不同。

        取出方式定义在集合的内部,取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。

        每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容,就是判断和取出。这样,可以将这些共性抽取。

 

image

 

如何获取集合的取出对象呢?

通过对外提供的方法,即 iterator();

-------------------------------

五、Set

public interface Set extends Collection

Set元素是无序的,存入和取出的顺序不一定一致,元素不可以重复,Set集合的功能和Collection一致。

1.HashSet底层数据结构是哈希表。线程是非同步的。

hashCode() 和equals()

如果元素的hashcode相同,才会判断equals是否为true

如果元素的hashcode不同,则不会调用equals

 

注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals。

HashSet:

 

Demo@c17164

Demo@1fb8ee3

ToString(): getClass().getName() + ‘@’ + Integer.toHexString(hashCode());

         

2.TreeSet

可以对Set集合中的元素进行排序。线程是非同步的。

TreeSet里面的对象必须具备比较性。

底层数据结构是二叉树;

保证元素唯一性的依据:

compareTo方法,return0

 

TreeSet排序第一种方式:

元素需要实现Comparable接口,覆盖compareTo方法。

元素自然顺序排列

 

class Student implements Comparable{

        public int compareTo(Object obj){

                if(!(obj instanceof Student)){

                     throw new RuntimeException(“不是学生对象”);

               }

               Student s  = (Student)obj;

               if(this.age > s.age)

                          return 1;

               if(this.age=s.age)

                          return 0;

               return –1;

        }

}

TreeSet只看comparTo结果

         

        TreeSet的第二种排序方式:

         当元素自身不具备比较性时候,或者具备的比较性不是需要的,这个时候就需要让集合自身具备比较性。

         在集合一出始化时,就有了比较方式。

       compare方法

   覆盖Comparator的compare方法

  new Integer(s1.getAge()).compareTo(new Integer(s2.getName()));

 

六、List

List特有方法,凡事可以操作角标的方法都是该体系特有的方法。

增:add(index,element);

        addAll(index, Collection);

删:remove(index);

改:set(index,element);

查:get(index)

        subList(from, to);

        listIterator();

for(int x = 0; x<al.size();x++){

     sysout();

}

          while(it.hasNext()){

        sysout();

}

List集合特有的迭代器

ListIterator it = new al.listIterator();

hasNext = true

hasPrevious = false

ListIterator 可以在遍历的时候进行增删改查。

--------------------------

常见子类

1.ArrayList:底层的数据结构使用的是数组结构(JDK1.2)

特点:查询速度快

缺点:增加、删除稍慢(元素越多越明显)

 

2.LinkedList:底层的数据结构使用的是链表

特点:插入、删除数据块

缺点:查询速度慢

LinkedList link = new LinkedList();

link.add();

 

LinkedList特有方法:

addFirst();

addLast();

 

getFirst();

getLast();

获取元素,但不删除元素,

如果集合中没有元素,会出现NoSuchElementException;

 

removeFirst();

removeLast();

获取元素,但元素被删除,

如果集合中没有元素,会出现NoSuchElementException;

在JDK1.6出现了

offerFirst();

offerLast();

 

peekFirst();

peekLast();

获取元素,但元素不被删除,

如果集合中没有元素,会返回null

 

pollFirst();

pollLast();

获取元素,但元素被删除,

如果集合中没有元素,会返回null

 

while(!link.isEmpty()){

    sop(link.removeFirst());

}

 

使用equals比较对象是否相同

public boolean equals(Object obj){

        if(!(obj instanceof Person)){

                return false;

        }

        Person p = (Person)obj;

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

}

 

3.Vector:底层是数组数据结构(JDK1.0)

Vector和ArrayList功能一样。Vector是同步的,ArrayList线程不同步。

尽量用ArrayList而不用Vector

-------------------

Enumeration枚举(JDK1.0)

Enumeration en = v.elements();

while(en.hasMoreElements()){

        sysout(en.nextElement());

}

因为枚举的名称及方法的名称过长,所以被迭代器取代了。