Collection: 数组,List,Set,Vector,Stack,Queue等
ArrayList 和LinkList 都是线程不安全的。Vector也是基于数组,但是线程安全的,但开销也大,一般不用。
Set 集合里面的元素不重复,其中TreeSet 是对已经存在的对象逐一通过compareTo方法进行比较,如果返回是0,说明对象相等,就不会放入Set。但对于HashSet,不仅要靠CompareTo方法,更要靠equals 和hashCode方法。
import java.util.Set;
import java.util.TreeSet;
public class Student implements Comparable{
private int id;
public Student(int id){
this.id=id;
}
public int getId(){
return id;
}
public boolean equals(Student stu){
if(stu.getId() == this.getId())
return true;
else
return false;
}
@Override
public int compareTo(Object obj) {
// TODO Auto-generated method stub
//该方法是实现接口Comparable里的方法
if(obj instanceof Student){
Student s = (Student)obj;
if(s.getId()== this.id)
return 0;
else{
return this.id > s.getId() ?1:-1;
}
}
else
return 0;
}
public static void main(String args[]){
Set<Student> stuSet = new TreeSet<Student>();
Student s1 = new Student(1);
Student s2 = new Student(1);
stuSet.add(s1);
stuSet.add(s2);
System.out.println(stuSet.size());//输出结果1
}
}
TreeSet 是SortedSet接口的唯一实现类,使用二叉树存储数据的方式来保证存储的元素处于有序状态。
HashSet 和linkedHashSet 是基于哈希表(hash)实现的,非线程安全,当插入时会调用该对象的hashCode()方法,来得到该对象的hashCode值,根据该hashCode值来决定该对象在HashSet 中的存放位置,如果遇到两个对象的hashCode一样,怎不允许重复插入。HashSet 不能保证插入次序和遍历次序一致。相比之下,LinkedHashSet同样是基于Hash表,他同时采用了链表的方式来保证插入的次序和遍历的次序一致。
----------------------------------------------------------------------------------
HashMap 对象查找:是通过Hash表来实现的。在放入key的时候,会计算key的hash函数值,这个值作为内存地址来放value,如果有两个key的值得到了同样的hash值,hashMap对象采用“链地址法”的方法,即为所有Hash值是i的对象建立一个同义词链表。重写equals 必修要重写hashCode方法。https://www.cnblogs.com/chengxiao/p/6059914.html <HashMap实现原理及源码分析>有具体描述