A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

ArrayList   、 LinkList  、 HashMap   、 HashTable 之间有哪些区别?什么情况下选用哪种?怎么确定呢。。。

3 个回复

倒序浏览
[图片]

Collection是单列集合的根接口:
List和Set分别是它的两个子接口,
List集合(可以存放有序存和取的顺序一样)
有索引,可以存储重复的数据:
List下有三个子类;
ArrayList..底层是由数组实现
是线程非安全的,查询和修改快,增删慢
有索引,所以查找快.
增加或删除数据时候,需要将增加位置后的数据整体向后或向前移动
比较慢;
LinkedList 底层是链表实现
线程是非安全的,增删快 查找和修改慢.
因为LinkedList 没有索引,只能从集合开始或结束的位置查询,得到元素;
Vector 底层是数组实现,无论增删改查都慢.
如果查修多,就用ArrayList.
如果增删多,就用LinkedList.
如果都多,用Arraylist.
List特有的迭代方式:get(int index) size();
特有的迭代方式:listIterator. 可以增加和删除元素;
Set集合:存储和取出没有顺序,不可重复,没有索引
HashSet:底层是哈希算法实现,HashSet集合是Set集合的一个分支,是Set接口的一个实现类.它所存储的元素是不可重复的,并且元素都是无序的.当向HashSet集合中添加一个对象时,首先会调用改对象的hashCode()方法来确定元素的存储位置,然后在调用对象的equals()方法来确保该位置没有重复的元素.
[图片]

[图片]
TreeSet:底层是二叉树算法,这样的算法可以保证TreeSet集合中没有重复的元素,并且可以对元素排序,
Map是双列集合的根接口;
HashMap集合是Map节后的一个实现类,它用于存储键值映射关系,但必须保证不出现重复的键.底层是哈希算法,针对键,Map中的键是唯一的,如果存储了两个相同键,后存储的值会覆盖前面的值,就是"键相同,值覆盖",
LinkdeHashMap是HashMap的一个子类,底层是链表,针对键,HashMap集合迭代出来元素的顺序和存入的顺序是不一样的,LinkedHashMap可以使用双向链表来维护内部元素的关系,使Map元素迭代的顺序与存入的顺序一致,
TreeMap是Map接口的另一个实现类, 通过二叉树原理来保证键的唯一性,和TreeSet集合存储原理一样,按照某种顺序排列的
遍历Map集合的方法,
KeySet();通过获取所有的键值,通过遍历得到键所对应的value值,
entrySet()方法
这个方法就是获取所有Map集合中的键值对对象,然后对其遍历,获取集合键和所对应的value对象;
回复 使用道具 举报
TreeSet:底层是二叉树算法,这样的算法可以保证TreeSet集合中没有重复的元素,并且可以对元素排序,
Map是双列集合的根接口;
HashMap集合是Map节后的一个实现类,它用于存储键值映射关系,但必须保证不出现重复的键.底层是哈希算法,针对键,Map中的键是唯一的,如果存储了两个相同键,后存储的值会覆盖前面的值,就是"键相同,值覆盖",
回复 使用道具 举报
List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类
Map结构的集合类:HashMap类,Hashtable类
Set结构的集合类:HashSet类,TreeSet类
Queue结构的集合:Queue接口

HashMap和Hashtable的区别:
HashMap和Hashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点
以下是他们的区别:
1.历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是java 1.2引进的Map接口的一个现实。
2.同步性:
Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的,而HashMap则是异步的,因此HashMap中的对象并不是线程安全的,因为同步的要求会影响执行的效率,所以如果你不需要线程安全的结合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率,我们一般所编写的程序都是异步的,但如果是服务器端的代码除外。
3.值:
HashMap可以让你将空值作为一个表的条目的key或value
Hashtable是不能放入空值(null)的

ArrayList和Vector的区别:
ArrayList与Vector都是java的集合类,都是用来存放java对象,这是他们的相同点,
区别:
1.同步性:
Vector是同步的,这个类的一些方法保证了Vector中的对象的线程安全的,而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的,因为同步要求会影响执行的效率,所以你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
2.数据增长:
从内部实现的机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当你向两种类型中增加元素的时候,如果元素的数目超过了内部数组目前的长度他们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大,所以如果你要在集合中保存大量的数据,那么使用Vector有一些优势,因为你可以通过设置集合的初始大小来避免不必要的资源开销。

总结:
1)如果要求线程安全,使用Vector,Hashtable
2)如果不要求线程安全,使用ArrayList,LinkedList,HashMap
3)如果要求键值对,则使用HashMap,Hashtable
4)如果数据量很大,又要求线程安全考虑Vector
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马