在Java中 List是有序容器?Set是无序容器?是这样的吗?

我们经常听说List是有序且可重复的,Set是无序且不重复的。

首先要说明,这是错误的观点!

首先我们应该知道的是,这里的顺序指的是什么顺序?
一个是说按照添加进去,有着一定的顺序。
一个是说按照自然顺序,比如1-9,a-z排列的。
我们平时所说的无序的Set集合是指HashSet,其即不能保证元素的添加顺序,也不能保证自然顺序,是真正的无序状态!而Set的其他类是可以实现这两种顺序的:

  1. LinkedHashset : 保证元素添加的自然顺序
package com.revision.Set;

import java.util.LinkedHashSet;

public class TestLinkedHashSet {

    public static void main(String[] args) {
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        linkedHashSet.add(111);
        linkedHashSet.add(222);
        linkedHashSet.add(666);
        linkedHashSet.add(888);
        linkedHashSet.add(555);
        System.out.println(linkedHashSet);
    }

}

输出结果为:
在Java中 List是有序容器?Set是无序容器?是这样的吗?_第1张图片
3. TreeSet : 保证元素的自然顺序

package com.revision.Set;

import java.util.TreeSet;

public class TestTreeSet {
    public static void main(String[] args) {
        TreeSet treeSet = new TreeSet();
        treeSet.add("a");
        treeSet.add("d");
        treeSet.add("b");
        treeSet.add("c");
        System.out.println(treeSet);
    }
}

结果为:
在Java中 List是有序容器?Set是无序容器?是这样的吗?_第2张图片

  1. HashSet:完全的无序状态
package com.revision.Set;

import java.util.HashSet;
import java.util.Set;

public class TestHashSet {
    public static void main(String[] args) {
        Set hashSet = new HashSet<>();
        hashSet.add("String1");
        hashSet.add("String12");
        hashSet.add("String3");
        hashSet.add("String55");
        hashSet.add("String222");
        hashSet.forEach(e -> System.out.println(e + " "));
    }
}

运行结果为:
在Java中 List是有序容器?Set是无序容器?是这样的吗?_第3张图片

刚刚我在测试HashSet的时候无意中发现如果是像用 “a” “b” “c” “d” 或者 “1” “2” …这些值的时候 并不是乱序的了 那么是为什么呢???
查阅资料发现是

这里引用一下:
“HashSet 元素的存储(地址)是无序的。一般来讲,通过进行迭代的迭代器也是依次将各个元素(字符串),无序地输出。

楼主所示的"有序结果",其实是一种极其特殊案例:每个元素都仅是一(单)个字符,或都是数字字符,或都是小写英文字符,或都是大写英文字符。

元素的存储地址,视这个元素的哈希值而定。由于元素仅有一个字符,其哈希值的计算结果,就会是这个给定字符的 ascii 码(参见: 哈希算法)的值。结果, 打印出的 HashSet 列表,就会是貌似经过排序后的结果。但要注意构成这种案例的条件:元素必须 都是单个数字字符、或都是单个英文小写字符、或都是单个英文大写字符。”
有兴趣的可以看看原问题:
(JAVA)HashSet里面保存的数据怎么变成有顺序的了?

你可能感兴趣的:(java,java,se)