java中 ,ArrayList<HashMap<String,Object>> 和 HashMap<String, Object>() 有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中 ,ArrayList<HashMap<String,Object>> 和 HashMap<String, Object>() 有啥区别?相关的知识,希望对你有一定的参考价值。

举例子说明

ArrayList<HashMap<String,Object>> 是list类型的,里面的元素是HashMap,而 HashMap<String, Object>是HashMap类型的。就是说,前面的是由后面的组成的一个列表,后面的是前面的一个元素 参考技术A HashMap<String, Object> 是一种典型的map泛型实现方式 map们你可以将它们理解成有名字的object数组 利用泛型中的第一个也就是key值可以轻松找到相对应的value

而list们则是不同 一般在list泛型中只放一个元素 你提出的arraylist中那个hashmap就是一个单独的东东不是 所以对于list来理解的话 你可以把它们当做一个任意类型的动态的基本类型数组 比如int[] 比如string[] 因为它们里面是按顺序存放每一条数据的本回答被提问者采纳
参考技术B 你可以这么理解 hashmap<String,Object>()的String类型的key里面放了各种水果的名字,Object类型的value放的是对应每种水果各自的价格。而ArrayList<HashMap<String,Object>>就是一个水果店,各种水果都依次放在里面 参考技术C 一个是存放HashMap的数组,一个是Hashmap,是不同的 参考技术D 第一个是将hashmap放在了ArrayList里,第二个就是个Hashmap

Hashmap,Set,Map,List,ArrayList的区别

                  表格:

类型

默认容量

加载因子[1]

扩容增量

底层实现

是否安全及同步方式

Vector

10

1

2

Object数组

安全,synchronized

ArrayList

10

1

1.5倍(>>1

Object数组

线程不安全

LinkedList

1

无(11个加

链表

线程不安全

HashSet

16

0.75

2

HashMap<E,Object>

线程不安全

HashMap

16

0.75

1

存放链表的数组[2]

Map.Entry

线程不安全

HashTable

11

0.75

2+1

存放链表的数组[2]

HashTable.Entry

线程安全,synchronized

 

 

1】:加载因子:扩容因子=已存容量/现有容量。0.75表示当使用容量达到3/4时扩容。

2HashMap中,都是是以链表实现的。在HashMap中,先对key值求hash,然后根据hash确定存放位置(内存中占用的地址),一般情况下hash值不会相同。但当数据量大是,hash值(内存存放地址)就会相同,这时会以链表的形式存放新的数据。

 技术分享图片

List(列表)

List的特征是其元素以线性方式存储,集合中可以存放重复对象。

 

List接口主要实现类包括:

ArrayList() :数组。内存空间连续。默认初始容量是10,每次增加一半(右移),线程不安全。便于查询而不便于增删

LinkedList():链表(节点)。内存空间不连续。线程不安全。便于增删不便于查询

对于List的随机访问来说,就是只随机来检索位于特定位置的元素。 List get(int index) 方法放回集合中由参数index指定的索引位置的对象,下标从“0” 开始。

两种列表的区别:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

2.对于随机访问getsetArrayList觉得优于LinkedList,因为LinkedList要移动指针。

3.对于新增和删除操作addremoveLinedList比较占优势,因为ArrayList要移动数据。

总结:ArrayListLinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:

1.对ArrayListLinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。

2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

3LinkedList不支持高效的随机元素访问。

4ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

 

 

HashSetHashMap的区别

这里涉及到HashSet的本质:(1)HashSetset的一个实现类,hashMapMap的一个实现类,同时hashMaphashTable的替代品

(2)HashSet以对象作为元素,HashMap(key-value)的一组对象作为元素,HashSet拒绝接受重复的对象.HashMap可以看作三个视图:keySetvalueCollectionEntrySet。 这里HashSet就是其实就是HashMap的一个视图。

HashSet内部就是使用Hashmap实现的,和Hashmap不同的是它不需要KeyValue两个值。

hashset中插入对象其实只不过是内部做了

 

 

HashMapHashTable的区别

HashMap允许键或者值为null。默认初始容量是16,加载因子是0.75f,默认增加一倍。是一个异步式线程不安全的映射,HaseTable不允许键或者值为null。默认初始容量是11,加载因子是0.75f。是一个同步式线程安全的映射---仅仅在笔试中出现.

都属于Map接口的类,实现了将惟一键映射到特定的值上。

HashMap允许将null作为一个entry的key或者value,而Hashtable不允许 .

HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。

Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。 Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现

还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,

多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 

 

 

注意!

jdk1.8之后,HashMap的储存机制发生改变:数组table中的链表长度大于8时,自动转换为红黑树!

以上是关于java中 ,ArrayList<HashMap<String,Object>> 和 HashMap<String, Object>() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Hashmap,Set,Map,List,ArrayList的区别

VectorArrayListList使用深入剖析

Java经典面试题汇总容器

hashmap性能跟数据量关系

java中,如何在二维的ArrayList中添加List

java编程hashmap,arraylist