参考:https://blog.csdn.net/a822631129/article/details/78520111
今天在项目中有个数据有序无序的问题,之前使用set做的,当数据是单个的,那无所谓,若数据为多个,情况就发生变化了。
有序:有序列表中的元素具有某种内在的关联,这种关联定义了列表之间的顺序
无序:无序列表中的元素按使用者所选择得任意方式排序
索引:索引列表为他的元素维护一段连续的数字索引值
有序列表:
List(链表结构)
LinkedHashMap(插入顺序)
TreeMap(有排序默认升序)
Hashtable(有排序默认降序)
无序列表
HashMap
Set
java 为数据结构中的映射定义了一个接口 java.util.Map; 它有四个实现类,分别是 HashMap Hashtable LinkedHashMap 和 TreeMap.
Map 主要用于存储健值对,根据键得到值,因此不允许键重复 (重复了覆盖了), 但允许值重复。
Hashmap 是一个最常用的 Map, 它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap 最多只允许一条记录的键为 Null; 允许多条记录的值为 Null;HashMap 不支持线程的同步,即任一时刻可以有多个线程同时写 HashMap; 可能会导致数据的不一致。如果需要同步,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有同步的能力,或者使用 ConcurrentHashMap。
Hashtable 与 HashMap 类似,它继承自 Dictionary 类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写 Hashtable, 因此也导致了 Hashtable 在写入时会比较慢。
LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历 LinkedHashMap 时,先得到的记录肯定是先插入的。也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比 HashMap 慢,不过有种情况例外,当 HashMap 容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap 慢,因为 LinkedHashMap 的遍历速度只和实际数据有关,和容量无关,而 HashMap 的遍历速度和他的容量有关。
TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。
一般情况下,我们用的最多的是 HashMap, 在 Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么 TreeMap 会更好。如果需要输出的顺序和输入的相同,那么用 LinkedHashMap 可以实现,它还可以按读取顺序来排列.
HashMap 是一个最常用的 Map,它根据键的 hashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap 最多只允许一条记录的键为 NULL,允许多条记录的值为 NULL。
HashMap 不支持线程同步,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致性。如果需要同步,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有同步的能力。
Hashtable 与 HashMap 类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写 Hashtable,因此也导致了 Hashtable 在写入时会比较慢。
LinkedHashMap 保存了记录的插入顺序,在用 Iterator 遍历 LinkedHashMap 时,先得到的记录肯定是先插入的。
在遍历的时候会比 HashMap 慢 TreeMap 能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的
遍历LinkedHashMap,HashMap,TreeMap
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
public class testDemo {
public static void main(String[] args) {
System.out.println("=LinkedHashMap====");
Map<String,String> map = new LinkedHashMap();
map.put(“星期一”, “星期一”);
map.put(“星期2”, “星期2”);
map.put(“星期3”, “星期3”);
map.put(“星期4”, “星期4”);
map.put(“星期5”, “星期5”);
System.out.println(map);
for(Map.Entry<String, String> entry : map.entrySet()){
String mapKey = entry.getKey();
String mapValue = entry.getValue();
System.out.println(mapKey+":"+mapValue);
}
System.out.println("=========HashMap========");
Map<String,String> map2 = new HashMap<>();
map2.put("星期一", "星期一");
map2.put("星期2", "星期2");
map2.put("星期3", "星期3");
map2.put("星期4", "星期4");
map2.put("星期5", "星期5");
System.out.println(map2);
for(Map.Entry<String, String> entry : map2.entrySet()){
String mapKey = entry.getKey();
String mapValue = entry.getValue();
System.out.println(mapKey+":"+mapValue);
}
System.out.println("=========TreeMap========");
Map<String,String> map3 = new TreeMap<>();
map3.put("星期一", "星期一");
map3.put("星期2", "星期2");
map3.put("星期3", "星期3");
map3.put("星期4", "星期4");
map3.put("星期5", "星期5");
System.out.println(map3);
for(Map.Entry<String, String> entry : map3.entrySet()){
String mapKey = entry.getKey();
String mapValue = entry.getValue();
System.out.println(mapKey+":"+mapValue);
}
}
}
注意看这里的TreeMap是顺序排列,Hashtable是降序,LinkedHashMap是按插入顺序,HashMap随机。