首页 > 代码库 > 集合类学习笔记
集合类学习笔记
一、概念
集合是存储对象的一种方式。集合中都是存放着地址,方便引用。JDK 1.2版本的时候就有了
二、集合和数组的区别
集合是可变长度,数组是固定长度。
数组可以存储基本数据类型,集合只能存储对象,集合可以存储不同类型的对象。
Collection
1.List:元素是有序的,可以重复,有索引
2.Set:元素是无序的,不可以重复,使用hash值排列
三、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的类型
每个容器都有存和取,每个容器的数据结构不同,存取方式可能也不同。
取出方式定义在集合的内部,取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。
每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容,就是判断和取出。这样,可以将这些共性抽取。
如何获取集合的取出对象呢?
通过对外提供的方法,即 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());
}
因为枚举的名称及方法的名称过长,所以被迭代器取代了。