请问在jdk1.6中HashSet在add的时候会排序吗?package com.yjb.test;import java.util.HashSet;
import java.util.Set;public class Test7 {
private static Set<Integer> set = new HashSet<Integer>();
public static void main(String[] args) {
while(true){
if(set.size()<7) {
int rr = (int)(Math.random()*10);
System.out.println("size: "+set.size() + "rr: " +rr);
set.add(rr);
System.out.println(set);
}else {
break;
}
}
System.out.println(set);
}
}
import java.util.Set;public class Test7 {
private static Set<Integer> set = new HashSet<Integer>();
public static void main(String[] args) {
while(true){
if(set.size()<7) {
int rr = (int)(Math.random()*10);
System.out.println("size: "+set.size() + "rr: " +rr);
set.add(rr);
System.out.println(set);
}else {
break;
}
}
System.out.println(set);
}
}
TreeSet 会排序
LinkedHashSet 会保持插入的顺序
size: 0rr: 8
[8]
size: 1rr: 9
[8, 9]
size: 2rr: 0
[0, 8, 9]
size: 3rr: 7
[0, 7, 8, 9]
size: 4rr: 8
[0, 7, 8, 9]
size: 4rr: 9
[0, 7, 8, 9]
size: 4rr: 4
[0, 4, 7, 8, 9]
size: 5rr: 3
[0, 3, 4, 7, 8, 9]
size: 6rr: 2
[0, 2, 3, 4, 7, 8, 9]
[0, 2, 3, 4, 7, 8, 9]
tree的都有顺序
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) Client VM (build 14.3-b01, mixed mode, sharing)
会通过自己的算法排序 所以你每次打出set中元素都是一样的
但是这个顺序是 客户端程序员无法掌握的
所以可以认为Set是无序的。TreeSet 需要加入可以比较的对象 并且要是相同的对象
你添加的对象必须实现Comparable接口 表示加入的对象是可以比较的。
你现在的情况是因为数据类型单一且恰巧是integer造成的这种结果
这里涉及的是HashSet的toString()方法,我记得它的toString()大概就是遍历底层的Entry数组,既然是数组那么一定是有顺序的,这个顺序就是由存储元素的hashCode决定的.在add的时候并不做元素之间的比较排序,而只是根据hashcode得到该元素应该被存储在数组的哪个位置上.
现在你这种情况恰巧就是Integer的hashcode恰巧就等于它的值,可以说toString()输出的顺序是由hashcode的大小决定的(在没有形成Entry链的情况下),这里碰巧hashcode的大小和Integer本身的大小顺序一致.....说的有点乱 凑合看下..