容器Collection的总结一 Vector ArrayList LinkedList HashSet TreeSet

Collection提供了多种存储数据的模型 List接口和Set接口

1、Vector(动态数组)和ArrayList

相同点:底层都是用数组实现的,所以优缺点是:可以直接根据索引定位到要查询的位置,但是插入删除需要用Arrays.copyOf(原数组,需要复制的长度)或者同Systems.arraycoyp(原数组,开始复制的位置,目标数组,开始插入的位置,长度)

两者都允许有重复元素。有序。都允许有空值。

不同点:vector一次扩展2倍,ArrayList一次扩展1.5倍+1

vector因为大部分方法都有synchronized修饰 所以线程安全效率低  ; arrayList线程不安全 效率高


2、LinkedList特点:可以有重复的元素 是用双向链表实现的。所以优缺点是:增加删除快,只需要改变节点指向的位置。但是查询慢。查询用的二分查找,将LinkedList的长度一分为二,若index小于size()/2,从头往后找;若index大于size()/2则从尾部开始找。


3、Set接口下元素的特点:不可重复 无序

HashSet:底层基于HashCode表进行存储的。只利用与HashMap中的key进行操作,其value值都是相同的。所以是无序不可重复的

HashSet要进行自定义类的话需要重写hashCode方法equals方法,添加元素是先调用该元素的hashCode值,如果hashcode值相同再调用equals方法,这样才能判断添加的两个元素是否相同,相同的话就不被方法set集合中。如果不重写的话就是默认Object中的比较引用地址,但是比如 自定义类是User 属性包括姓名和年龄。不重写的话 只要新new一个User都是不相同的。所以要重写hashCode和equals来比较name和年龄是否相同。

HashSet没有自己的排序用法,Collections.sort(list,comparator) 只能对具有外部比较器的list进行比较。Collections(list)对实现内部比较器的 list进行比较。

所以可以将HashSet set = new HashSet();中的set添加到List list = new ArrayLiat(set);  然后可以用list.sort(外部比较器)进行排序   或者用Collections.sort()进行排序

还可以将set通过TreeSet s = new TreeSet(外部比较器); s.addAll(set)  来进行排序。还可以通过 TreeSet s = new TreeSet(set);进行排序;但是这是进行排序的自定义类要实现内部比较器


TreeSet:底层是基于平衡二叉树进行实现的。用Tree Map中的Key值进行存储  所以也是无序不可重复的。

TreeSet进行操作的自定义类中 一定要对自定义类进行内部比较器(Comparable)或者外部比较器(Comparator),否则会报错。所以TreeSet中的自定义类不需要重写hashCode和equals方法。

TreeSet set = new TreeSet();//实现内部比较器进行排序

TreeSet set = new TreeSet(new Comparator())//外部比较器进行排序

推荐使用外部比较器,好处:自身不用去实现比较规则,这个比较过程就会更灵活。





你可能感兴趣的:(容器Collection的总结一 Vector ArrayList LinkedList HashSet TreeSet)