Collections
方法(均为静态)
public static void main(String[] args) {
List a = new LinkedList();
a.add("Tom");
a.add("king");
a.add("milan");
Collections.reverse(a);
System.out.println(a); //[milan, king, Tom]
Collections.shuffle(a);
System.out.println(a); //[Tom, king, milan]
Collections.sort(a);
System.out.println(a);//[Tom, king, milan] (m>k>T) 用字符串的大小比较
Collections.sort(a, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String)o1).length()-((String)o2).length(); //按照长度从小到大
}
});
System.out.println(a); //[Tom, king, milan]
Collections.swap(a,0,2);
System.out.println(a); //[milan, king, Tom]
}
注意一下copy方法参数位置以及内存不足会报错即可。
public static void main(String[] args) {
List a = new LinkedList();
a.add("Tom");
a.add("king");
a.add("milan");
Object max = Collections.max(a); //返回值是一个Object
System.out.println(max); //milan 字符串最大
Object max2 = Collections.max(a, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return ((String)o1).length()-((String)o2).length();
}
});
System.out.println(max2);//milan,长度最大
System.out.println(Collections.frequency(a,"Tom"));//1
List b = new LinkedList();
// Collections.copy(b,a); 报错 这时b还没有内存空间
//后面是被复制的,根据源码,如果 a.size>b.size 会抛出异常
for(int i = 0;i<5;i++){
b.add("");
} //扩大b的内存
Collections.copy(b,a);
System.out.println(b); //[Tom, king, milan, , ] 剩下俩是""
Collections.replaceAll(a,"Tom","Jack");
System.out.println(a); //[Jack, king, milan]
}
一个关于HashCode的练习题
当把p1的name改成"CC"时,由于hashCode方法已经改写,因此p1的hash值也因此改变。通过remove的源码得知,删除的原理是根据hash码计算的一个值,因此会计算出p1对应的hash值。但问题是,计算出P1在三号位上(反正不是1号位),但是P1实际上还在一号位,因此删除失败!
加入一个 (1001,"CC")的Person时,根据hashCode计算出安放的位置(当然调用了底层代码,不是直接就是hash值),虽然跟P1hash值完全相同,但是3号位上并没有东西,因此成功安放。
加入一个 (1001,"AA")的Person时,计算出安放位置为1号位,此时1号位有P1,因此会调用equals方法跟P1进行比较,因为P1已经修改过name了,因此不同,放在P1后面(链表) 。