set,map,list小小的总结

来源:互联网 发布:rgb转16进制java 编辑:程序博客网 时间:2024/06/06 09:13
轻量级和重量级:主要对应用程序框架使用的方便性和所提供的服务特性等方面比较的;划分一个应用是否属于轻量级还是重量级,主要看它使用了多少服务,
       容器为普通java对象做的工作就越多,必然会影响到应用的发布时间或者是运行性能。
Map接口:实现了key到value的映射
根据实现方式的不同可分为
1:内部为hash表实现的HashMap,HashTable;(除了非同步和允许使用null之外,HashMap和HashTable大致相同)
2:内部为排序二叉树实现的TreeMap
3:遍历Map的所有key和value有两个方法,entrySet()(效率高)和keySet();
HashMap
1:基于哈希表的Map接口的实现,可以使用null键和null值,非线程安全
2:size的默认值16,扩张系数为0.75
3:size的增长方式:HashMap是2的指数
HashTable
1:此类实现一个哈希表,该哈希表将键映射到相应的位置,不能使用null键和null值,线程安全,内部使synchronized来保证线程安全
2:重量级
3:默认长度为11,
4:size的增长方式:oldsize*2+1;

List接口:有序,元素可重复(底下都是实现类)
ArrayList
1:基于数组实现的List
2:查询效率高,增删效率低,轻量级,非线程安全
LinkedList
1:基于双向循环链表实现的List
2:查询效率低,但是增删效率高,非线程安全
Vector
1:基于数组实现的List
2:重量级,占据更多的系统开销,线程安全
CopyOnWriteArrayList
1:当往里面插入数据的时候,先将当前容器进行复制,然后往新的容器里面添加元素,再将原容器的引用指向新的容器
2:可以对CopyOnWriteArrayList容器进行并发的读,而不需要加锁
3:根据源码可知,往里面添加元素的时候是加锁的(lock),而读的时候没有加锁
4:适用于读多写少的环境

Set接口:内部实现是基于Map的,所以set取值时不保证顺序,且不能为空,不允许有重复值(底下都是实现类)
HashSet
1:如果调用HashSet的无参构造方法,那么就会使用默认的HashMap,初始化size为16,扩张系数为0.75
2:唯一性保证:用equals方法
TreeSet
1:内部是一颗红黑树
2:唯一性保证:compareTo方法


comparator(科目拍弱特)和comparable(康坡bo),都是接口

comparable接口强行对实现它的每个类的对象进行整体排序,又称为自然排序,对比与comparator,又称为内部排序,内部只有一个方法
public int compareTo(T o);对于需要排序的对象,实现这个接口,实现compareTo()方法即可,(T o)代表传入的数据,即需要
进行比较的对象,如果位于对象o之前,返回负值,如果位置相同,则返回0,如果位于对象o后面,则返回正值

comparator 相对于comparable又叫外部排序,对于一些已经封装好的对象,我们在尽量不修改已有的基础上,通过实现Comparator类来新建一个比较器,
然后通过该比较器来对类进行排序
两个方法
1:int compare(T o1,T o2);
2:boolean equals(Object obj);
equals继承Object,所以不用管equals()方法,我们只需要实现compare(T o1,T o2)方法就好

异同:
1:Comparable是由对象自己实现的,一旦一个对象封装好了,compare的逻辑也就定了,如果我们需要对同一个对象增加一个字段的排序就比较麻烦,又要修改对象本身。
比如淘宝的购买页面,增加一种受欢迎度的排序,就需要修改对象内部compare方法。好处是对外部不可见,调用者无需知道排序逻辑,只要调用排序即可,类似于静态绑定。


2:Comparator由外部实现,比较灵活,争对上述问题,只要新增一个Comparator即可。缺点是所有排序逻辑对外部暴露,需要对象外部实现。
不过这里的外部仅指对象的外部,也可以由API的开发者封装好所有的Comparator,对调用者隐藏内部逻辑。好处是很灵活,随时可以增加一种排序方法,只要对象内部字段支持,类似动态绑定。
原创粉丝点击