遍历HashMap是不是有序;以及fastJson.toJson()能否保证结果顺序一致

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遍历HashMap是不是有序;以及fastJson.toJson()能否保证结果顺序一致相关的知识,希望对你有一定的参考价值。

参考技术A 首先结果:并不能保证一致。
hashmap 基于数组加链表结构保存数据,遍历时,基本上可以视为通过hashCode遍历。
但是有特殊两点:

①:如果初始化hashmap时,指定的hash桶数量(小于16)如果不一致,那么 (n-1)& hash 所得的数组下标不一致。遍历的顺序将改变

②:发生hash冲突,同时,冲突的链表长度小于9. hash桶容量大于64; 此时按照链表存储,这部分数据遍历可能基于插入的顺序。(待验证)   

例①:

HashMap map1 =new HashMap<>();

map1.put("123", "aaa");

map1.put("23456", "bbb");

System.out.println("map1的循环遍历");

for (Map.Entry entry : map1.entrySet())

System.out.println(entry.getKey());



HashMap map2 =new HashMap<>(map1.size());

map2.put("123", "aaa");

map2.put("23456", "bbb");

System.out.println("map2的循环遍历");

for (Map.Entry entry : map2.entrySet())

System.out.println(entry.getKey());



回到第二个问题:fastJson.toJson()  基于以上两点隐患,无法保证有序  JSONObject是基于Map.entrySet()遍历Map,而entrySet通过桶0节点循环遍历数组、链表,此时的数据并不能保证完全一致

fastjson中JSONObject遍历怎么不是有序的

参考技术A 要使用Fastjson,首先需要下载相对应的jar文件,在官网即可下载。
附上初学的第一个例子,多多指教:

复制代码

"statuses":[

"id": 912345678901,
"text": "How do I stream JSON in Java?",
"geo": null,
"user":
"name": "json_newb",
"followers_count": 41

,


"id": 777777777888,
"text": "dfngsdnglnsldfnsl",
"geo": null,
"user":
"name": "dsfgpd",
"followers_count": 24


]

复制代码

AllBean的Bean类:

复制代码
package com.lee.JsonToBean;

public class AllBean
private long id;
private String text;
private String geo;
private UserBean userBean;
public long getId()
return id;

public void setId(long id)
this.id = id;

public String getText()
return text;

public void setText(String text)
this.text = text;

public String getGeo()
return geo;

public void setGeo(String geo)
this.geo = geo;

public UserBean getUserBean()
return userBean;

public void setUserBean(UserBean userBean)
this.userBean = userBean;



复制代码

UserBean的Bean类:

复制代码
package com.lee.JsonToBean;

public class UserBean
private String name;
private int followers_count;
public String getName()
return name;

public void setName(String name)
this.name = name;

public int getFollowers_count()
return followers_count;

public void setFollowers_count(int followers_count)
this.followers_count = followers_count;


复制代码

解析类JsonBean:

复制代码
package com.lee.JsonToBean;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.rtf.RTFEditorKit;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
*
"statuses":[

"id": 912345678901,
"text": "How do I stream JSON in Java?",
"geo": null,
"user":
"name": "json_newb",
"followers_count": 41

,


"id": 777777777888,
"text": "dfngsdnglnsldfnsl",
"geo": null,
"user":
"name": "dsfgpd",
"followers_count": 24


]

* */
public class JsonBean
RTFEditorKit rtf;
DefaultStyledDocument dsd;
String text;
public static void main(String[] args)
JsonBean bean = new JsonBean();
// 把字符串转为Json对象,这是因为我的json数据首先是json对象
JSONObject jobj = JSON.parseObject(bean.readRtf(new File("json.rtf")));
// 然后是jsonArray,可以根据我的json数据知道
JSONArray arr = jobj.getJSONArray("statuses");
// 根据Bean类的到每一个json数组的项
List<AllBean> listBeans = JSON.parseArray(arr.toString(), AllBean.class);
// 遍历
for(AllBean bean_ : listBeans)
// 我这个demo的json数据获得第一层的数据
System.out.println(bean_.getText());
System.out.println(bean_.getId());
// 我这个demo的json数据获得第二层的数据
System.out.println(bean_.getUserBean().getFollowers_count());



// 因为我把json数据放进rtf文件,这是读取rtf文件的json数据,转化为字符串
public String readRtf(File in)
rtf=new RTFEditorKit();
dsd=new DefaultStyledDocument();
try
rtf.read(new FileInputStream(in), dsd, 0);
text = new String(dsd.getText(0, dsd.getLength()));
catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (BadLocationException e)
// TODO Auto-generated catch block
e.printStackTrace();

return text;

本回答被提问者采纳

以上是关于遍历HashMap是不是有序;以及fastJson.toJson()能否保证结果顺序一致的主要内容,如果未能解决你的问题,请参考以下文章

fastJson顺序遍历JSON字段

JSONObject如何有序排列

c++中map是有序的吗

alibaba fastjson 顺序解析

HashMap,LinkedHashMap,TreeMap的有序性

有序的map LinkedHashMap