Java数据结构总结

来源:互联网 发布:php进销存管理系统 编辑:程序博客网 时间:2024/03/28 21:17

一、引言


数据结构在Java中,占据相当中要的部分,数据结构的选型影响着整个系统的性能。下面我们来快速对于比较重点的Java数据结构做一个总结。


java数据结构主要分为Collection和map两个主要结构(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。


如图所示:



--Collection:


1、查询:便利Collection中的每一个元素,不论collection的实际类型如何,它都支持一个iterator()方法,该方法返回一个迭代器,使用该迭代器即可逐一访问Collection中的每一个元素:


2‘、判断相等:当且仅当存在 b.equals(a) 时,才存在 a.equals(b);对于一个既不实现 List 又不实现 Set 接口的 collection 类,当将此collection 与任何列表或 set 进行比较时,常规的 equals 方法必须返回 false


3、hashCode:


-- --List:


list是有序的Collection,使用该接口能精确的控制每个元素chaussure的位置。用户能够使用索引来访问List中的元素。


1、查询:除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。


-- -- --LinkedList:


1、查询:LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

2、是否同步:否,如果多个线程同时访问一个List,则必须自己实现访问同步,一种解决方法是在创建List是构建一个同步的List:

List list = Collections.synchronizedList(newLinkedList(...));


-- -- --ArrayList:


1、查询:sizeisEmptygetset方法运行时间为常数。


2、增:但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。


3、是否为同步:否


4、容量问题:每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。


-- -- --Vector:


1、查询、增加、容量问题:同ArrayList

2、是否为同步:是




-- --Set:


1、Set是一种不包含重复的元素的Collection,即任意的两个元素e1e2都有e1.equals(e2=falseSet最多有一个null元素。







--map:


1、Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。


-- --Hashtable:


1、增加查询:添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。


2、Hashtable通过initialcapacityload factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像getput这样的操作。


3、是否为同步:是


4、hashCode:由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCodeequals方法。hashCodeequals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作的哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。


-- --HashMap:


1、HashMap和Hashtable类似。


2、是否同步:否


3、查询:其迭代器操作时间开销和HashMap的容量成比例。如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者loadfactor过低。(加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.


二、概念:


1、同步性:


Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。


2、数据增长:


1)、ArrayListVector都是使用数组方式存储数据

2)、区别大概就是Vector本身所有方法都是用synchronized修饰的,所以线程安全,而ArrayList没有,因此,synchronizedList修饰的list如下

private static List<String> TEST_LIST =Collections.synchronizedList(new ArrayList<String>());

包裹了普通的ArrayList提供了线程安全的机制,类似Vector,所以到此为止synchronizedListVector的区别就是ArrayListVector的增量速度区别,所以需要线程安全操作时,增量比较快的时候推荐使用Vector,其他就没什么了.


查看代码:


* It is imperative that the user manually synchronize on the returned     * lis
t when iterating over it:     * <pre>     *  List list = Collections.synchronizedList(new ArrayList());     *      ...     *  synchronized(list) {     *      Iterator i = list.iterator(); // Must be in synchronized block     *      while (i.hasNext())     *          foo(i.next());     *  }

3)、还有一个区别就是新增元素的时候Vector的增量是原来的一倍,而ArrayList增加原来的一半


public void ensureCapacity(int minCapacity) {    modCount++;    int oldCapacity = elementData.length;    if (minCapacity > oldCapacity) {        Object oldData[] = elementData;        int newCapacity = (oldCapacity * 3)/2 + 1;            if (newCapacity < minCapacity)        newCapacity = minCapacity;            // minCapacity is usually close to size, so this is a win:            elementData = Arrays.copyOf(elementData, newCapacity);    }    }


3、使用模式:


ArrayListVector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?


这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用VectorArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。


三、总结:


Java数据结构是作为一个java开发必须掌握的一门技术。


参考链接:Collection集合







1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 农行卡密码输错3次怎么办 驾照罚款缴纳了网上没消怎么办 外地驾驶证分数扣12分了怎么办 有生产日期的赠品在超市过期怎么办 6年免检车辆逾期未年检怎么办 行驶证检验有效期过期2年怎么办 骑摩托车忘带驾驶证和行驶证怎么办 驾驶证逾期未审验怎么办有什么后果 车祸至人腿部骨折沒钱偿还的怎么办 我有c4驾驶证想办c3怎么办 驾驶证和行驶证被交警扣了怎么办 行驶证被交警弄丢了怎么办 没带行驶证让警察发现怎么办 首尔转机换票换乘怎么办过境签证 驾驶证约考帐号与登密码丢失怎么办 考驾照的时候预约密码忘了怎么办 考驾照的预约密码忘了怎么办 摩托车不能挂档不能摘挡了怎么办 身份证丢失了派出所不给挂失怎么办 快递员在中午还送货夏天怎么办啊 驾照一个记分周期扣满12分怎么办 佛山南海车管所怎么办替人消分流程 福州快处中心几流程要怎么办 被对方追尾了对方只有交强险怎么办 摩托车行驶证年检过期一年半怎么办 户口迁到杭州了身份证掉了怎么办 户口已迁至外面要补办结婚证怎么办 汽车年检时间过了1个月怎么办 户口在老家在北京工作怎么办招工 报考驾照时手机号留错了怎么办 合肥驾照换证体检没过怎么办 驾驶证记分周期到了违章未消怎么办 驾照被扣科目一过期没考怎么办 驾驶证暂扣过了换证日期怎么办? 考驾照科目二身份证丢了怎么办 驾照科目一考试身份证丢了怎么办 换驾驶证名下有车辆脱审怎么办 交警把驾驶证和行车证扣了怎么办 连续两天驾照都是扣12分怎么办? 交警开的电动车罚单丢了怎么办 驾驶证b证体检报告拖期怎么办