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

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

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

首先我们应该知道的是,这里的顺序指的是什么顺序?

一个是说按照添加进去,有着一定的顺序。

一个是说按照自然顺序,比如1-9,a-z排列的。

我们平时所说的无序的Set集合是指HashSet,其即不能保证元素的添加顺序,也不能保证自然顺序,是真正的无序状态!而Set的其他类是可以实现这两种顺序的:

LinkedHashset : 保证元素添加的自然顺序

package com.revision.Set;

import java.util.LinkedHashSet;

public class TestLinkedHashSet {

public static void main(String[] args) {

LinkedHashSetlinkedHashSet = new LinkedHashSet();

linkedHashSet.add(111);

linkedHashSet.add(222);

linkedHashSet.add(666);

linkedHashSet.add(888);

linkedHashSet.add(555);

System.out.println(linkedHashSet);

}

}

输出结果为:

7d3c7fa7d365d0ebcbf33656058bacbe.png

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);

}

}

结果为:

b1cf491751e4de3f4fc86868ca453ded.png

HashSet:完全的无序状态

package com.revision.Set;

import java.util.HashSet;

import java.util.Set;

public class TestHashSet {

public static void main(String[] args) {

SethashSet = new HashSet<>();

hashSet.add("String1");

hashSet.add("String12");

hashSet.add("String3");

hashSet.add("String55");

hashSet.add("String222");

hashSet.forEach(e -> System.out.println(e + " "));

}

}

运行结果为:

42d0572f0149a59f4ead115f17e8066b.png

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

查阅资料发现是

这里引用一下:

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

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

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

有兴趣的可以看看原问题:

(JAVA)HashSet里面保存的数据怎么变成有顺序的了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值