首页 > 代码库 > 集合--Collection
集合--Collection
迭代器:Iterator接口
interface Iterator
{
boolean hasNext();
Object next();
}
//获取集合中的对象
Iterator<E> iterator()
所有的内部类都是实现了Iterator接口的内部类
内部类可以直接操作集合中的对象
/*
Iterator ite = col.iterator();
while(ite.hasNext())
{
//获得一个对象
Object obj = ite.next();
System.out.println(obj);
}
for(int i = 0;i<col.size();i++)
{
}
for(Iterator ite = col.iterator();ites.hasNext());)
{
}
while(!col.isEmpty())
{
col.remove();//返回被删除的对象
}
*/
/*
存储多个类型的对象:
Obejct[] arr = new Object[10];
数组的缺陷是:
数组的容量固定
*/
集合:(Collection接口)
java.util.*;
可以存储不同类型的对象,而且随着存储的对象的增加容量自动扩大
Collection:
**iterator():获取集合中的对象
--List:
存储的对象是有序的
集合中对象的顺序和添加对象的顺序是一致的,可以重复的
List特有的方法都是可以操作下标的方法
--ArrayList:
底层使用的数据结构是数组
线程不安全的
查找速度快,增删速度慢
--LinkedList:
底层使用的数据结构是链表
线程不安全的
查找速度慢,增删速度快
--Vector:
底层使用的数据结构是数组
线程安全的(被ArrayList替代)
查找速度快,增删速度慢,被ArrayList替代
--Set:
存储的对象是无序的,不可重复的
--HashSet:
底层使用的数据结构是哈希表
线程不安全
--TreeSet:
底层使用的数据结构是二叉树
线程不安全
Vector:
动态数组
早期使用Enumeration接口进行枚举
Enumeration e = v.elements();
while(e.hasMoreElements())
{
Object obj = e.nextElements();
System.out.println(obj);
}
LinkedList:
**addFirst:
**addLast:
**getFirst://获取的元素不存在出现 NoSuchElementException
**getLast:
**removeFirst://
**removeLast:
从jdk 1.6之后出现以下方法:
**offerFirst:
**offerLast:
**peekFirst://获取元素不存在返回null
**peekLast:
**linkFirst:
**linkLast:
/*
使用LinkedList实现队列
入队--把对象存入集合
**addLast()
出队--把对象从集合删除
**removeFirst()
判断队列是否为空
**isEmpty()
*/
ArrayList:
/*
去掉集合中重复的对象
新建一个list2
遍历旧集合
如果list2中不包含这个对象,添加
**contains(obj)
如果list2中包含,不添加
*/
/*
contains判断是否包含某个对象的依据?
依据boolean equals(Object obj)方法的返回值
*/
/*
直接输出List<Class>的话,输出的是Class的hash值
解决:
在class中定义:
public String toString()
{
return ...;
}
*/
/*
去掉List<class>中相同内容的class
在class中重写equals方法
public boolean equals(Object obj)
{
if(!(obj instanceof Student))//如果obj不是Student类型
throws new RuntimeException("类型错误");
Student stu = (Student)obj;
return this.age = stu.age && this.name.equals(stu.name);
}
*/
HashSet:
在使用add方法添加对象时就保证了对象的唯一
/*
HashSet无序的原因
数据结构是哈希表,根据哈希算法得到位置,导致的无序
*/
/*
HashSet保证对象唯一的方式
在添加对象时,先比较得到对象的hash值和集合中对象的hash值分别进行比较
如果和所有对象的hash值都不相同,将对象直接添加到集合
如果相同,使用equals()方法比较内存地址是否相同
如果相同,认为是同一对象,不添加
如果不同,认为是不同的对象,加入集合
int hashCode()
boolean equals()
*/
/*
去掉Hash<class>中相同内容的class
在class中重写hashCode 和 equals方法
public int hashCode()
{
return name.hashCode() + age * 33;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))//如果obj不是Student类型
throws new RuntimeException("类型错误");
Student stu = (Student)obj;
return this.age = stu.age && this.name.equals(stu.name);
}
*/
TreeSet:
在使用add方法添加对象时会对添加的对象进行排序
排序方式一:
集合中对象所属的类实现了Comparable接口中的compareTo()方法
排序方式二:
/*
TreeSet保证对象唯一的方式:
集合中对象所属的类实现了Comparable接口中的compareTo()方法
compatreTo()方法的返回值是0
*/
/*
去掉TreeSet<class>中相同内容的class
在class中重写compareTo()
public int compareTo(Object obj)
{
if(!(obj instanceof Student))//如果obj不是Student类型
throws new RuntimeException("类型错误");
Student stu = (Student)obj;
int num = this.age - stu.age;
return num == 0 ? this.name.compatrTo(stu.name) : num;
}
*/
集合--Collection