set,list,map分析

 

想了下集合,列表,映射三者关系

set,list,map

//images0.cnblogs.com/blog/153316/201309/06144256-88e64aab8a3641eabbc144bb260e2364.png

ArrayList采用数组方式存储数据,继承List;

LinkedList采用链表方式存储数据,继承List;

所以数组方式都有下表,以及每个下表都对应value,所以里面的元素可以重复,每次增加删除元素,插入位置后面的元素都要变动(下表id,以及value都要变动),所以增删会很慢, 查询起来会很快,相当于有索引;

链表方式采用指针,除了几个特殊的节点外,几乎每个节点,都有前序节点,后续节点,所以里面元素也是可以重复的, 增加删除会很快,只有移动一两个指针就可以了;

vector,上图掉了这个,采用数组方式存储,也是继承List,和ArrayList的两个不同之处是:1,Vector里的所有方法都是同步的,支持多线程.2,vector每次扩容是数组增加一倍大小,arraylist是增加0.5倍;

 (vector开销更大,能用arrayList就不用vector)

 

list集合中三种实现有利有弊,

数组查询时间复杂度O(1),增删就是O(n);

链表查询时间复杂度O(n),增删就是O(1);

猜想,能否在中间找个平衡点,

于是就有了:二叉搜索树,增删查的时间复杂度都为O(lgn);

下面来看应用...

 

下面来说Set集合:

可以实例化为HashSet, TreeSet;

set里面存的值不能是重复的 , 所有,首先要明白一点:加入Set里面的元素必须定义equals()方法以确保对象的唯一性。

在往Set中插入新的对象时,首先会用该对象的hashCode()与已经存在对象的hashCode()做比较,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。 

 先说下,两者的区别:

1.HashSet是哈希表实现的,数据是无序的,可以存放且只能存放一个null;

有序是因为HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样;

2.TreeSet是采用红-黑树结构实现的,元素是自动排序的,不能存放null;

有序是因为元素类型必须实现Comparable接口, 并且覆盖其compareTo方法,TreeSet是SortedSet接口的唯一实现类;

 

下面再钻一下红-黑树,他其实是二叉搜索树的变形(AVL树其实也是二叉搜索树的变形,avl树必须满足两个条件:1.首先是一个二叉搜索树;2.每个节点的左右子树高度差绝对值<=1);

为什么在有了二叉搜索树的前提下,还要创造出avl以及红黑树呢:因为二叉搜索树在有序(升序,降序)插入的时候,时间复杂度会变成O(n),降到最低;但是红-黑树的自我修复功能保证了即使在最坏的情况下,也能保证时间复杂度在O(logN)的级别上。

其实红-黑树和avl树差不多,那为什么现实中avl很少见,都是用的红-黑树:因为avl的增加-删除节点操作复杂度过高;

 AVL树最经典的调节平衡(左旋,右旋)在这里就不做说明了,比较简单,实在不懂,可以看下这个https://my.oschina.net/llmm/blog/158454;

红-黑树的实现以及原理,自己看http://www.cnblogs.com/fanzhidongyzby/p/3187912.html   我就不装逼了.

 

下面再来说Map集合:(下班了,明天继续)

 

 

 

 

 

 

 

 

 

over...

 



  _  __
 (_)/   \
<'_, ____)~~~~~~~   
  ^^   ^^

posted @ 2017-03-27 18:02  ctgu_czy  阅读(199)  评论(0编辑  收藏  举报