Map Vs Object 那个效率高?

合集下载

Map集合几种遍历方式的性能比较

Map集合几种遍历方式的性能比较

Map集合⼏种遍历⽅式的性能⽐较⾸先构造⼀个 HashMap 集合:1 HashMap<String,Object> map = new HashMap<>();2 map.put("A","1");3 map.put("B","2");4 map.put("C","3"); ①、分别获取 key 集合和 value 集合。

1 //1、分别获取key和value的集合2 for(String key : map.keySet()){3 System.out.println(key);4 }5 for(Object value : map.values()){6 System.out.println(value);7 } ②、获取 key 集合,然后遍历key集合,根据key分别得到相应value1 //2、获取key集合,然后遍历key,根据key得到 value2 Set<String> keySet = map.keySet();3 for(String str : keySet){4 System.out.println(str+"-"+map.get(str));5 } ③、得到 Entry 集合,然后遍历 Entry1 //3、得到 Entry 集合,然后遍历 Entry2 Set<Map.Entry<String,Object>> entrySet = map.entrySet();3 for(Map.Entry<String,Object> entry : entrySet){4 System.out.println(entry.getKey()+"-"+entry.getValue());5 } ④、迭代1 //4、迭代2 Iterator<Map.Entry<String,Object>> iterator = map.entrySet().iterator();3 while(iterator.hasNext()){4 Map.Entry<String,Object> mapEntry = iterator.next();5 System.out.println(mapEntry.getKey()+"-"+mapEntry.getValue());6 }基本上使⽤第三种⽅法是性能最好的, 第⼀种遍历⽅法在我们只需要 key 集合或者只需要 value 集合时使⽤; 第⼆种⽅法效率很低,不推荐使⽤; 第四种⽅法效率也挺好,关键是在遍历的过程中我们可以对集合中的元素进⾏删除。

Map与object的区别

Map与object的区别

Map与object的区别Map对象保存键值对。

任何值(对象或者) 都可以作为⼀个键或⼀个值。

语法new Map([iterable])参数iterableIterable 可以是⼀个数组或者其他 iterable 对象,其元素或为键值对,或为两个元素的数组。

每个键值对都会添加到新的 Map。

null会被当做undefined。

描述⼀个Map对象以插⼊顺序迭代其元素 — ⼀个循环为每次迭代返回⼀个[key,value]数组。

键的相等(Key equality)键的⽐较是基于 "same-value" 算法:NaN 是与NaN 相同的(虽然NaN !== NaN),剩下所有其它的值是根据 === 运算符的结果判断是否相等。

在 ECMAScript 6 草稿的早期版本中视-0 和+0为不相同的 (虽然-0 === +0),在近期版本⾥这个问题已经被更正,且在 Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) () 和版本这个已经更改了。

Objects 和 maps 的⽐较和Map类似的⼀点是,它们都允许你按键存取⼀个值,都可以删除键,还可以检测⼀个键是否绑定了值.因此,⼀直以来,我们都把对象当成Map来使⽤,不过,现在有了Map,下⾯的区别解释了为什么使⽤Map更好点.⼀个对象通常都有⾃⼰的原型,所以⼀个对象总有⼀个"prototype"键。

不过,从 ES5 开始可以使⽤map = Object.create(null)来创建⼀个没有原型的对象。

⼀个对象的键只能是或者,但⼀个Map 的键可以是任意值。

你可以通过size属性很容易地得到⼀个Map的键值对个数,⽽对象的键值对个数只能⼿动确认。

但是这并不意味着你可以随意使⽤Map,对象仍旧是最常⽤的。

Map实例只适合⽤于集合(collections),你应当考虑修改你原来的代码——先前使⽤对象来对付集合的地⽅。

object转map的方法

object转map的方法

object转map的方法Object是JavaScript中的一个基本数据类型,它是一种无序的键值对集合。

在实际开发中,我们经常需要将Object转换为Map数据结构,以便更方便地对数据进行处理和操作。

本文将介绍如何使用JavaScript将Object转换为Map。

在开始之前,我们先来了解一下Map的基本概念。

Map是ES6中新增的数据结构,它类似于Object,也是一种键值对的集合。

不同的是,Map的键可以是任意数据类型,而Object的键只能是字符串或者Symbol类型。

通过使用Map,我们可以更灵活地对数据进行操作。

下面是将Object转换为Map的方法:方法一:使用Object.entries()方法和Map构造函数Object.entries()方法可以将一个对象转换为一个由键值对组成的数组。

然后,我们可以使用Map构造函数将该数组转换为Map对象。

示例代码如下:```javascriptconst obj = { key1: 'value1', key2: 'value2', key3: 'value3' }; const map = new Map(Object.entries(obj));```通过以上代码,我们可以将obj对象转换为map对象。

其中,obj 对象的键值对分别为key1/value1、key2/value2、key3/value3。

方法二:使用for...in循环和Map的set()方法通过使用for...in循环,我们可以遍历Object对象的所有属性,然后使用Map的set()方法将属性和对应的值添加到Map对象中。

示例代码如下:```javascriptconst obj = { key1: 'value1', key2: 'value2', key3: 'value3' }; const map = new Map();for (let key in obj) {map.set(key, obj[key]);}```通过以上代码,我们同样可以将obj对象转换为map对象。

map和object的使用场景及性能测试,慢慢干货~~~

map和object的使用场景及性能测试,慢慢干货~~~

map和object的使⽤场景及性能测试,慢慢⼲货~~~
Map 和 Object 各有千秋,对于不同的情况下,我们应当作出不同的选择。

所以我总结了⼀下我认为使⽤ Map 和 Object 更为合适的时机。

使⽤map:
储存的键不是字符串/数字/或者Symbol时,选择Map,因为Object并不⽀持
储存⼤量的数据时,选择Map,因为它占⽤的内存更⼩
需要进⾏许多新增/删除元素的操作时,选择Map,因为速度更快
需要保持插⼊时的顺序的话,选择Map,因为Object会改变排序
需要迭代/遍历的话,选择Map,因为它默认是可迭代对象,迭代更为便捷
使⽤object:
只是简单的数据结构时,选择Object,因为它在数据少的时候占⽤内存更少,且新建时更为⾼效
需要⽤到JSON进⾏⽂件传输时,选择Object,因为JSON不默认⽀持Map
需要对多个键值进⾏运算时,选择Object,因为句法更为简洁
需要覆盖原型上的键时,选择Object
虽然Map在很多情况下会⽐Object更为⾼效,不过Object永远是JS中最基本的引⽤类型,它的作⽤也不仅仅是为了储存键值对。

JavaScriptMap和Object的区别

JavaScriptMap和Object的区别

JavaScriptMap和Object的区别不同点Key filed在 Object 中, key 必须是简单数据类型(整数,字符串或者是 symbol),⽽在 Map 中则可以是 JavaScript ⽀持的所有数据类型,也就是说可以⽤⼀个 Object 来当做⼀个Map元素的 key。

元素顺序Map 元素的顺序遵循插⼊的顺序,⽽ Object 的则没有这⼀特性。

继承Map 继承⾃ Object 对象。

新建实例Object ⽀持以下⼏种⽅法来创建新的实例:var obj = {...};var obj = new Object();var obj = Object.create(null);Map 仅⽀持下⾯这⼀种构建⽅法:var map = new Map([1, 2], [2, 3]); // map = {1 => 2, 2 => 3}数据访问Map 想要访问元素,可以使⽤ Map 本⾝的原⽣⽅法:map.get(1) // 2Object 可以通过 . 和 [ ] 来访问obj.id;obj['id'];判断某个元素是否在 Map 中可以使⽤map.has(1);判断某个元素是不是在 Object 中需要以下操作:obj.id === undefined;// 或者'id'in obj;另外需要注意的⼀点是,Object 可以使⽤ Object.prototype.hasOwnProperty()来判断某个key是否是这个对象本⾝的属性,从原型链继承的属性不包括在内。

新增⼀个数据Map 可以使⽤ set() 操作:map.set(key, value) // 当传⼊的 key 已经存在的时候,Map 会覆盖之前的值Object 新增⼀个属性可以使⽤:obj['key'] = value;obj.key = value;// object也会覆盖删除数据在 Object 中没有原⽣的删除⽅法,我们可以使⽤如下⽅式:delete obj.id;// 下⾯这种做法效率更⾼obj.id = undefined需要注意的是,使⽤ delete 会真正的将属性从对象中删除,⽽使⽤赋值 undefined 的⽅式,仅仅是值变成了 undefined。

map和unordered_map区别及其优缺点

map和unordered_map区别及其优缺点

map和unordered_map区别及其优缺点map和unordered_map区别及其优缺点前⾔C++的STL库实现有两种字典结构,即map和unordered_map(也就是通俗意义上的hash map)。

这两者虽然都称为Map,但其实它们的底层实现原理具有很⼤差距,因此它们的使⽤场景也不尽相同。

今天特意研究了⼀下,下⾯从⼏个⽅⾯具体谈谈它们的差别及其具体的使⽤场景。

介绍字典类型⼜被称为关联数组(associative array),关联数组和正常数组的使⽤⽅法是相似的,但其不同之处在于字典结构的下标不必是整数,⽽可以是任意类型。

map和unordered_map这两种字典结构都是通过键值对(key-value)存储数据的,键(key)和值(value)的数据类型可以不同。

但是字典中的key只能存在⼀个,即必须唯⼀(如果不唯⼀,则被称为multimap)。

上述这点保证了值(value)可以直接通过键(key)来访问,这便是字典结构最为便捷之处。

区别1. 使⽤⽅法不同使⽤⽅法是最直观的区别,这两种结构虽然都在STL库中,但是所使⽤的头⽂件不同。

map:#includeunordered_map:#include <unordered_map>2. 底层实现的数据结构不同数据结构其实是两种类型最为根本的区别,其他的不同都是这种区别产⽣的结果。

map是基于红⿊树结构实现的。

红⿊树是⼀种平衡⼆叉查找树的变体结构,它的左右⼦树的⾼度差有可能会⼤于 1。

所以红⿊树不是严格意义上的平衡⼆叉树AVL,但对之进⾏平衡的代价相对于AVL较低,其平均统计性能要强于AVL。

红⿊树具有⾃动排序的功能,因此它使得map也具有按键(key)排序的功能,因此在map中的元素排列都是有序的。

在map中,红⿊树的每个节点就代表⼀个元素,因此实现对map的增删改查,也就是相当于对红⿊树的操作。

对于这些操作的复杂度都为O(logn),复杂度即为红⿊树的⾼度。

java map中value的类型

java map中value的类型

java map中value的类型Java Map中value的类型Java中的Map是一种键值对的数据结构,它提供了一种存储和访问数据的方式。

每个键都唯一,并且与一个值相关联。

在Java中,Map的实现类有很多种,如HashMap、TreeMap、LinkedHashMap等。

在使用Map时,我们通常需要关注value的类型,因为它决定了我们可以存储和操作的数据类型。

1. IntegerInteger是Java中的一个包装类,用于表示整数值。

在Map中使用Integer作为value的类型,我们可以存储和操作整数数据。

例如,我们可以创建一个Map,将学生的学号作为键,将学生的年龄作为值。

这样,我们可以通过学号来查找学生的年龄。

2. StringString是Java中的一个类,用于表示字符串。

在Map中使用String作为value的类型,我们可以存储和操作字符串数据。

例如,我们可以创建一个Map,将商品的名称作为键,将商品的价格作为值。

这样,我们可以通过商品的名称来查找商品的价格。

3. DoubleDouble是Java中的一个包装类,用于表示双精度浮点数。

在Map 中使用Double作为value的类型,我们可以存储和操作浮点数数据。

例如,我们可以创建一个Map,将某个地区的城市名称作为键,将该地区的平均气温作为值。

这样,我们可以通过城市名称来查找该地区的平均气温。

4. BooleanBoolean是Java中的一个包装类,用于表示布尔值。

在Map中使用Boolean作为value的类型,我们可以存储和操作布尔值数据。

例如,我们可以创建一个Map,将用户名作为键,将用户是否已登录作为值。

这样,我们可以通过用户名来查找用户是否已登录。

5. ObjectObject是Java中的一个类,是所有类的基类。

在Map中使用Object作为value的类型,我们可以存储和操作任意类型的数据。

例如,我们可以创建一个Map,将员工的工号作为键,将员工的信息(如姓名、年龄、性别等)作为值。

es6 map用法

es6 map用法

es6 map用法ES6Map是一种新型的数据结构,它用于存储键值对,并可用来模拟关联性数组,此外它还有一些高级特性,可以极大地提高开发效率,提高应用的性能。

Map的使用Map的使用非常简单,一般用来表示关联性数据,可以用键和值来表示。

它具有结构化的思想,可以用描述性的键值对对数据进行描述。

Map的基本定义Map是ES6中新增的数据结构,但它与Object基本相同,每个Map中的键和值都是唯一的,其中的值可以是任何类型的,可以是原始数据类型,也可以是对象,甚至可以是另一个Map。

它支持Map 的四种基本方法:set()、get()、has()和delete()。

Map的使用场景Map的使用场景有多种,比如在存储查询结果的场景中,我们会需要查询Map中是否包含某个键值,如果存在,就可以根据该键值来获取相应的值,而Map可以完美地满足我们这种需求。

它同样也有效地支持我们在网页应用开发者时,在数据层面上缓存数据和控件状态。

Map特性Map对于关联性数据结构支持非常不错,它有一些特性可以帮助开发者提高效率和构建应用。

1.键值对映射:Map内部使用了一个特殊的数据结构来控制键和值的关系,使得查找键和值更加高效。

2.键值对排序:Map支持键值对的排序,可以方便地对键值对进行排序,可以更容易地找到所需的关联数据。

3.多个键值对:Map可以支持多个键值对,这样可以更方便地存储复杂的数据结构。

4.性能优化:Map可以帮助改善应用的性能,可以帮助系统更有效地处理数据,提高应用的运行速度。

Map的常见方法1. set():用于给Map增加新的键值对,如果该键值对已存在,则会覆盖旧的值,接受2个参数,第一个为键,第二个为值。

2. get():根据键值获取Map中对应的值,如果没有获取到则返回undefined,接受1个参数,即键值,如果不存在则返回undefined。

3. has():于检查Map中是否有某一键值,返回boolean类型,有则返回true,无则返回false。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近在维护别人的代码时,经常会发现有人用Map替代Object使用(注:本文中的Object是相对,泛指实体对象)
感觉怪怪的,不太友好,因为你不知道Map中有哪些东东,需要把每个Key看一遍才能知全貌,不知为何会这样用,难道是为了提高效率,使用Map比 Object的效率更高吗?为了验证这个疑问,特意写了一个测试代码验证一番:
将同样的数据分别放入Map和Object中,循环10000次,查看运行时间及内存占用:
下图为运行10次结果:
从图中可以看到使用Map比Object,在耗时与内存占用上都没有优势,耗时大概是3倍多,内存占用为5倍多,Object完胜。

经过验证得出结论:不要用Map代替Object使用,因为它没有任何优势可言,Map要用在合适的场合。

贴上验证代码供大家参考:
1 2 3 4 5 6 7 8 9
10
11
12
13
14
15
16
17
18 public class MapVsObject {
static List mapList = new ArrayList();
static List objectList = new ArrayList();
public static void main(String[] args) {
mapList.clear();
testMap();
objectList.clear();
testObject();
}
public static void testMap() {
long start = System.currentTimeMillis();
long freeMemory = Runtime.getRuntime().freeMemory();
for (int i = 0; i < 10000; i++) {
Map<String, Object> map = new HashMap<String, Object>();
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 map.put("pkg", "com.iandroiddev.pkg");
map.put("uid", 10023);
map.put("label", "Android Developer Blog");
map.put("memoryUse", 10245);
mapList.add(map);
}
System.out.println("Map Time: " + (System.currentTimeMillis() - start));
System.out.println("Map Memory: " + (freeMemory -
Runtime.getRuntime().freeMemory()));
}
public static void testObject() {
long start = System.currentTimeMillis();
long freeMemory = Runtime.getRuntime().freeMemory();
for (int i = 0; i < 10000; i++) {
ProcessInfo processInfo = new ProcessInfo();
processInfo.pkg = "com.iandroiddev.pkg";
processInfo.uid = 10023;
bel = "Android Developer Blog";
processInfo.memoryUse = 10245;
objectList.add(processInfo);
}
System.out.println("Object Time: " + (System.currentTimeMillis() - start)); System.out.println("Object Memory: " + (freeMemory -
Runtime.getRuntime().freeMemory()));
}
public static class ProcessInfo {
public String pkg;
public int uid;
public String label;
public int memoryUse;
}
}。

相关文档
最新文档