记性逐渐不好,有的东西忘记,本文复习备忘用,先从最基本的java基础集合开始,集合分为Collection接口和Map接口,这两个接口又衍生出了很多子接口,下面对着2个接口分别作介绍。
一,collection接口
直接实现Collection的类和继承他的接口下图
可以看到有4个接口4个类,下面主要对AbstractCollection类和List,Queue,Set接口进行逐一研究
Collection接口中定义的方法如下图
实现他的类和继承他的接口都这些方法,这些方法的具体功能就不多介绍,其中很多方法的实现都由AbstractCollection来完成,AbstractCollection的方法如下图
AbstractCollection类对Collection接口的方法进行了实现,并且重写了toString方法,方法前面有小A的表示抽象方法,这个就交给具体的继承类根据自己的特性自己实现,具体的方法有size方法和iterator()方法,size方法主要是实现队列接口Queue的类进行重写,如ArrayBlockingQueue的size方法如图
每个实现了iterator方法的类都有自己的迭代器类来处理数据遍历如ArrayList类的迭代器类实现如下图:
ArrayBlockingQueue类的实现方法如下:
简单找出两个集合总相同的元素的方法
package basic.collection.basic;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
/**
* <p>Title: Test1.java</p>
* <p>Description: 从一个集合中
* <p>Copyright: Copyright (c) 2014</p>
* @author 雪含心
* @date 2015年1月9日
*/
public class Test1 {
public static void main(String[] args) {
Collection<String> c1 = new ArrayList<String>();
System.out.println("遍历c1");
for(int i = 0; i < 10; i ++){
String ranStr = i + "|";
System.out.print( ranStr);
c1.add(ranStr);
}
System.out.println();
System.out.println("遍历c2");
Collection<String> c2 = new ArrayList<String>();
for(int j = 1; j < 20; j ++){
Random random = new Random();
String ranStr = random.nextInt(j) + "|";
System.out.print(ranStr);
c2.add(ranStr);
}
System.out.println();
// 从c1中删除不包含c2的元素,即留住2个集合都有的元素,List会有重复
c2.retainAll(c1);
System.out.println("c2的大小 " + c2.size());
for(String s:c2){
System.out.print(s);
}
System.out.println();
System.out.println("遍历s1");
Collection<String> s1 = new HashSet<String>();
for(int i = 0; i < 20; i ++){
String ranStr = i + "|";
System.out.print( ranStr);
s1.add(ranStr);
}
System.out.println();
System.out.println("遍历s2");
Collection<String> s2 = new HashSet<String>();
for(int j = 1; j < 20; j ++){
Random random = new Random();
String ranStr = random.nextInt(j) + "|";
System.out.print(ranStr);
s2.add(ranStr);
}
// 从s1中删除不包含s2的元素,即留住2个集合都有的元素,Set不重复
s2.retainAll(s1);
System.out.println();
System.out.println("s2的大小 " + s2.size());
for(String s:s2){
System.out.print(s);
}
}
}
可以看到 这里面用到了AbstractCollection方法的retainAll如图
效率实际是比较低下的
假如我把上面的集合中存放的对字符串换成对象会出现情况呢,这个就牵扯到ArrayList的contains方法和HashSet的contains方法,HashSet使用的是HashMap的contains方法,具体的做法是找到传入对象的hash值
根据hash值找到对象,然后再比较对象的eques方法是否相等,ArrayList是直接用eques方法比较的
ArrayList
HashMap