众所周知,java已经诞生很久了。作为一个java开发人员的我,书写这篇文章旨在为我这只菜鸟更好的认识java。好了,进入正题。
java数据结构,大致可以用此图表示:
Collections--
--List--
--ArrayList
--LinkedList
--Vector--
--Stack
--Set--
--HashSet
Map--
--HashMap
--HashTable
即java的数据集合可以分为Collections和Map两大巨头。
在Collections接口下:
List接口和Set接口extends了Collection接口。
ArrayList类和LinkedList类以及Vector类implements了List接口。其中Stack类又extends了Vector类。
HashSet类implements了Set接口
在Map接口下:
HashMap类和HashTable类都实现了Map接口
这就是java下数据集合的一个大致分析。
接下来,我们分析他们各自的使用场景和对数据操作的一些优缺点。
在java中,我们都知道接口是不能直接使用被实例化的。所以对于这些集合的分析我们旨在分析类的使用场景和优缺点。
好了,我们从继承于Collectins接口的List接口下的ArrayList类和LinkedList类来分析:
俗话说,实践是检验真理的唯一标准。我们用程序来比较它们的异同点。
我们分别在ArralyList和LinkedList中插入1百万条数据,我这里创建了一个Student类。
发现不同点:
ArrayList在插入和删除较慢,随机访问(查询)较快。
LinkedList在查询时相对较慢,插入和删除相对较快。
相同点:
ArrayList和LinkedList都允许插入重复数据,null也可以。都是非同步的,即不是线程安全的。此时Vector是同步的,是线程安全的。
原因分析:ArrayList是顺序表,以数组的方式来实现。即可以理解为大小可变的数组。可以用下标快速的访问。但是在插入和删除时元素需要整体移动,所以效率低。
LinkedList是双向链表,在查询和修改是不需要元素的整体移动。
接下来分析实现了Set接口的HashSet类
特点:不能插入null,否则报java.lang.NullPointerException异常。
能插重复的数据,但是重复的数据只会被插入一次,HashSet的大小不回变大,即不能插入重复的值。
Map接口下的HashMap和Hashtable
相同点:都是以key-value健值对的形式存储数据,都不能包含重复的key。
不同点:由HashMap和Hashtable的size()方法我们就可以知道。HashMap的size()方法没有synchronized修饰,即HashMap没有实现同步,线程是非安全的。
Hashtable的size()用synchronized修饰了,即线程安全。
HashMap的key可以为null,而Hashtable的key不能为null,否则在运行的时候,会报java.lang.NullPointerException异常。