集合Collection(接口)下有10个子类接口
其中主要学习两个List(列表) 和 Set(集合)
对于若干实现List的类来说,我们只学习三个(数组列表ArrayList,向量Vector,链表LinkedList)
对于刚学习集合的人来说,必须清楚类与类之间的关系,对于List而言,它本身是一个接口,它的实现类是实现了该接口,而继承的是AbstractCollection类,明显这是一个抽象类。
通过多态的方法可以定义Collection和List的对象,对于这两种集合,Collection有两种遍历方法(Iterator和增强for),
而List因为get()方法的存在,使得他多出一种普通for循环遍历,这也是它特有的。
List集合的特点:1.有序(储存和取出的顺序一致)2.可重复
List是线程不安全的,但可以使用Collections.synchronizedList()函数来使得变得线程安全。
相比Collection,List有特有的迭代器ListIterator listIterator();
Iterator迭代器没有添加方法,而其子类ListIterator有,即Iterator迭代器遍历元素时不能通过迭代器修改元素,而ListIterator可以。
对上一段话进行总结,即迭代器迭代元素时,只有ListIterator可以修改元素。不过除此之外,用普通for,再使用集合自身的方法也是可以修改集合元素的。
ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,但效率高。
Vector(基本不用了):底层数据结构是数组,查询快,增删慢,线程安全,但效率低。
LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,但效率高。
Set(集合)
虽然Set是非线程安全的,但是set的底层是使用Map实现的,顾可以通过ConcurrentHashMap和Collections.newHashSetFromMap的方式变通实现线程安全的Set
set是无序(储存顺序和取出顺序不一致),唯一(哈希表保持数据的唯一性)
对于Set集合,我们只学两个HashSet和TreeSet。这两个类同样是AbstractCollection的子类。
HashSet的底层是哈希表结构,哈希表结构底层是依赖hashCode()和equals()方法。子类LInkedHashSet,底层数据结构有哈希表和链表组成,哈希表保证唯一,链表保证有序(你懂有序的意思????)。
TreeSet能够按某种规则进行排序:排序有两种:1.自然排序 2.比较器排序
这里我需要介绍两个接口Comparable(内比较器)和Comparator(外比较器),前者是lang包下的接口,后者是util包下的接口。
这两个接口都是拿来排序的,Comparable中的compareTo(T o);和后者的compare(T t1,T t2)方法
至于这两个接口有啥区别,看好咯:前者方法因为只有一个参数,注定比较是要和this标明的变量比,所以一般写在泛型类中,即在类中就写好。而后一种一般在不能修改类时,又需要比较时通过匿名对象的方式,即让TreeSet集合的构造方法接受一个比较器接口的子类对象。
TreeSet<Student> ts = new TreeSet<Student>(new Comparator
<Student>(){ //让集合的构造方法接收一个比较器接口的子类对象
@Override
public int compare(Student s1,Student s2){
int num=s1.getName().length()-s2.getName.length();
int num2= num==0?s1.geName.compareTo(s2.getName()):num;
int num3= num2==0?s1.getAge()-s2.getAge():num2;
return num3;
}
}
补充:A自然排序 compareTo() 在引用类型对象中重写compareTo方法,并在该对象类中实现Comparable接口,compareto( T o):比较此对象与指定对象之间的顺序,如果对象小于,等于,大于指定对象,则分别返回负整数,0,正整数