集合是用来存放对象的容器
一、Collection 接口:
最基本的集合接口,定义了集合中共通的方法,Java中没有定义直接继承自Collection的类,只提供其子接口(如List和set)。
Collection 集合中常用的方法
Collection collection = new ArrayList();
添加
collection.add(Object e); //向集合中添加一个元素
collection.addAll(Collection c) //将一个集合添加到另外一个集合中
删除
collection.remove(Object e) //删除集合中的指定元素
collection.removeAll(Collection<?> c ) //删除集合中的某个集合中的所有元素
判断
collection.contains(Object o) //判断集合中是否存在某个元素
collection.size(); //判断集合大小
collection.isEmpty(); //判断集合是否为空
获取
利用增强for循环
for(Object obj : collection){
Systerm.out.println(obj)
}
利用Iterator迭代器
Iterator iterator = collection.iterator(); //获取集合中的对象
while(iterator.hasnext()){
Object obj = iterator.next();
Systerm.out.println(obj)
}
二、Iterator 迭代器
不同的集合有不同的数据结构,集合利用其内部类来获取集合中的元素(内部类可以直接操作集合中的对象)
所有内部类都是实现了Iterator接口的内部类,在Iterator接口中定义了集合获取元素的共通方法。
Iterator iterator = collection.iterator(),iterator()方法返回的是一个内部类对象,而这个内部类实现了Iterator 接口,所有返回的是Iterator 类型。这个内部类对象提供了如下方法
iterator.hasNext() // 判断集合中是否还有对象
iterator.next() //获取一个对象
我们就可以利用迭代器来遍历集合。
三、List(Collection接口的子接口):
List 存储的对象是有序的,可以重复的
List的实现类:
除了继承的父类方法外,还定义了可以操作集合索引的特殊方法
增
add(int index,Object e) //向集合中指定索引位置插入一个元素(注意选取适当的索引位置,否定报错)
addAll(int index,Collection c) //向集合中指定索引位置插入另外一个集合中的所有元素
删
remove(int index) //删除集合中指定索引位置的元素
改
set(int index,Object e) //修改集合中指定索引位置的元素
查
get(int index) //查询集合中指定索引位置的元素
List迭代器Listiterator:提供了更多的方法,并且实现了在迭代过程中实现对集合的增删改
LinkedList:底层使用的数据结构是链表,线程不安全的,查找速度慢,增删速度快。
LinkedList中定义了其特有的方法:
LinkedList list = new LinkedList();
增
在集合的头部添加元素
list.addFirst(Object e)
list.offerFirst(Object e
在集合的末尾添加元素
list.addLast(Object e)
list.offerLast(Object e)
删
删除集合头部元素
list.removeFirst(Object e) //删除的对象不存在,发生异常
list.pollFist(Object e) ///删除的对象不存在,返回null
list.removeLast(Object e) //删除集合尾部元素
list.pollLast(Object e)
查
查找集合头部元素
list.getFirst() //获取的对象不存在,会抛出异常
list.peekFirst() //获取的对象不存在,返回null
查找集合尾部元素
list.getLast() //获取的对象不存在,会抛出异常
list.peekLast() //获取的对象不存在,返回null
LinkedList 还可以实现先进先出和先进后出
队列(先进先出)
栈(先进后出)
LinkedList实现队列或者栈:
class MyQueue{
private LinkedList list;
public MyQueue(){
list = new LinkedList();
}
public void in(Object obj){
list.addLast(obj);
}
public Object out(){
return list.removeFirst();
//return list.removeLast(); 实现栈
}
public boolean isNull(){
if (list.isEmpty()){
return true;
}else {
return false;
}
}
}
MyQueue myQueue = new MyQueue();
myQueue.in("11");
myQueue.in("22");
myQueue.in("33");
while (!myQueue.isNull()){
System.out.println(myQueue.out());
}
ArrayList:底层使用的数据结构是数组,线程不安全的,查找速度快(存放位置在内存中是连续的),增删速度慢
public static ArrayList removeSame(ArrayList list){ ArrayList list2 = new ArrayList(); for (int i =0;i<list.size();i++) { if (!list2.contains(list.get(i))) { list2.add(list.get(i)); } } return list2 }
Vector:底层使用的数据结构是数组,线程安全的,查找速度快(存放位置在内存中是连续的),增删速度慢,早期使用,已经被
ArrayList替代。
四、Set
set存储的对象是无序的,不可以重复的
hashset 底层使用的数据结构是hash表,线程不安全的
保证对象的唯一性方式:int hashoCde() boolean equals(Object obj)
在添加对象时,先用对象的hash值与集合中原因对象的hash值进行比较,如何相同则再调用equals方法对hash值相同的两个对象进行比较,如何equals方法返回true,认为是同一对象,不加入集合。
TreeSet 底层使用的数据结构是二叉树。线程不安全的
TreeSet 在使用add方法添加对象时,会对对象进行排序,实现类comparable 接口中的int compareTo()方法 ,依据该方法返回值大小进行排序,当返回值为0时,表示对象相同,不添加。