java核心数据结构(三)——Set类族
2016-05-14 21:07
411 查看
一、Set核心实现类
如上图,Set和List是Collection接口的两个分支,比较重要且频繁使用的有HashSet、LinkedHashSet和TreeSet。比较鲜明的特点就是整个Set以及它的实现类中,集合中的元素是不能重复的,还有一个比较有意思的点在于,Set中的主要实现类都是对Map实现类的封装,例如HashSet封装了HashMap,LinkedHashSet封装了LinkedHashMap,TreeSet封装了TreeMap。查看源码,不难发现,HashSet中提供的构造方法,实际初始化的是一个HashMap对象。其他两个实现类亦是如此。
而且不难发现,HashSet中的数据操作方法都是通过内部维护的一个HashMap对象,并将与Set相关的实现委托给改map对象进行处理。
所以对于与Map各实现类的特点Set相应的实现类也具备。这里进行简单总结:
二、优化集合操作
1、分离循环调用的代码
例如:
2、省略相同操作
一、Set核心实现类
如上图,Set和List是Collection接口的两个分支,比较重要且频繁使用的有HashSet、LinkedHashSet和TreeSet。比较鲜明的特点就是整个Set以及它的实现类中,集合中的元素是不能重复的,还有一个比较有意思的点在于,Set中的主要实现类都是对Map实现类的封装,例如HashSet封装了HashMap,LinkedHashSet封装了LinkedHashMap,TreeSet封装了TreeMap。查看源码,不难发现,HashSet中提供的构造方法,实际初始化的是一个HashMap对象。其他两个实现类亦是如此。
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { public HashSet() { map = new HashMap<>(); } public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); } } //TreeSet构造方法 public TreeSet() { this(new TreeMap<E,Object>()); } public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); }
而且不难发现,HashSet中的数据操作方法都是通过内部维护的一个HashMap对象,并将与Set相关的实现委托给改map对象进行处理。
private transient HashMap<E,Object> map; public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); }
所以对于与Map各实现类的特点Set相应的实现类也具备。这里进行简单总结:
Set | 对应Map | 特点 |
HashSet | HashSet | 基于hash的快速插入,元素间无序 |
LinkedHashSet | LinkedHashMap | 同上,元素有序,遍历集合时按照FIFO |
TreeSet | TreeMap | 高效的基于Key的排序算法 |
1、分离循环调用的代码
例如:
//优化前 for(int i=0;i<list.size();i++) { } //优化后 int count=list.size(); for(int i=0;i<count;i++) {}优化后,size方法只被调用一次,而不是每次都循环执行。同样循环体中的方法也注意这样的优化,集合中元素越多,这样的处理就越有意义。
2、省略相同操作
//简化前 if(list.get(i).indexOf("max")!=-1 && list.get(i).indexOf("zhong")!=-1 ||list.get(i).indexOf("ai")!=-1) {} //简化为 String s=null; if(s=list.get(i).indexOf("max")!=-1 && s.indexOf("zhong")!=-1 ||s.indexOf("ai")!=-1) {}3、必要时还可直接调用原生的参数。如Vector类中的elementCount参数来替代对象的size方法以减少方法调用。这种优化程度应该是对系统精度要求极高。但也不失为一种思路。
相关文章推荐
- 《数据结构》2.5-将链表A分解成B和C
- java核心数据结构(二)——Map类族
- 数据结构上机测试1:顺序表的应用
- 数据结构_静态链表_哈夫曼
- 《 常见算法与数据结构》符号表ST(4)——二叉查找树删除 (附动画)
- 个人练习数据结构之--------------关于线性数据的有序数组以及之上的二分法查找、不同排序方法的学习
- Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构
- 《 常见算法与数据结构》符号表ST(3)——二叉查找树 (附动画)
- 数据结构之用栈实现逆波兰表达式
- 数据结构实验之链表九:双向链表
- java核心数据结构(一)——List类族
- 《 常见算法与数据结构》符号表ST(2)——初等实现分析和有序符号表
- 数据结构实验之链表七:单链表中重复元素的删除
- 数据结构之链表
- 《 常见算法与数据结构》符号表ST(1)——基本介绍
- Redis 数据结构使用场景
- Java千百问_06数据结构(016)_引用类型数组在内存中如何储存
- 数据结构(c)——排序算法
- 开始批改数据结构作业啦
- Java千百问_06数据结构(015)_数组和普通对象的引用变量有什么区别