Collection《Integer》 collection = new ArrayList《Integer》(Arrays.asList(1,2,3,4,5));
Integer[] ints = {1,2,3,4,5};
collection.addAll(Arrays.asList(ints));
Collections.addAll(collection, 1,2,3,4,5);
Collections.addAll(collection, ints);
LinkedList是Queue接口的一个实现。
add();
addFirst();
addLast();
peek(); 为空时返回null;
element();
getFirst();
getLast();
poll(); 为空时返回null;
remove();
removeFirst();
removeLast();
List — AbstractList/ArrayList/LinkedList
Set — AbstractSet/HashSet/LinkedHashSet/TreeSet
Map — AbstractMap/HashMap/LinkedHashMap/TreeMap/WeakHashMap/IdentityHashMap
List《T》 Collections.nCopies(int amount, T t);
void Collections.fill(List《? extends T》 list, T t);
一种适配器设计模式:
public class C《T》 extends List《T》 {
public C(Generator《T》 gen, int quantity) {
for(…) add(gen.next());
}
public static 《T》 C《T》 list(Generator《T》 gen, int quatity) {
return new C《T》(gen, quatity);
}
}
与17.2.1相似,但是有很多方式,一种是传入Iterable《T》接口,一种是传入Generator《T》。还可以传入Generator《pair《K,V》》传入两个Generator《K》, Generator《V》;
实现了一个使用固定数量容器,即利用数组来实现的继承自AbstractMap的map。
实现了Map中应该实现的接口。entrySet();返回一个装满SetEntry的EntrySet。
还创建了一个实现了Set.Entry接口的SetEntry。
本节目标:熟练掌握继承自Abstract容器类的用法。
需要使用的话查阅相关资料。
什么叫做可选操作:就是可以实现也可以不实现,当不想实现某个接口方法或Abstract方法时,就可以通过throw new UnsupportedOperationException来阻止方法运行时的调用。
Collections类中的“不可修改”的方法将容器包装到一个代理中,只要你执任何试图修改容器的操作,这个代理都会产生UnsupportedOperationException异常。
Collections.unmodifiableList();会产生一个完全不可修改的Collection,为什么说是完全,因为Array.asList();产生的Collection只是不可以扩展或者缩小,但可以对set进行操作。而Collections.unmodifiableList();连set都不可以使用。
很明显,Array.asList()是把一个数组包装在了一个List中,因为数组大小是固定的,所以只是不能改变容器大小,但容器中的值是可以改变的。
Set:存入Set的每个元素都必须是唯一的,Set接口不保证元素的次序。必须实现equals()来保证唯一性。
HashSet:为快速查找而设计的Set,存入的元素必须定义hashCode()。后面有详细介绍。
TreeSet:TreeSet中的值保证sort的次序,必须实现comparable接口。
LinkedHashSet:拥有HashSet的查询速度,内部以链表维护元素插入的顺序。
是一个接口,TreeSet实现了该接口。
Object first(); 返回容器的第一个元素
Object last();返回容器的最后一个元素
SortedSet subSet(fromElement, toElement); 生成此Set的子集,从fromElement到toElement(不包括)
SortedSet headSet(toElement);
SortedSet tailSet(FromElement);
神奇的hashCode与HashSet,HashMap。
很多类中都实现了hashCode方法,object类中也有默认的hasCode方法,hashCode方法返回一个int值,HashMap或HashSet通过这个值对应List[]数组中的位置获取相应的List,再将值存入或从中取出。通过hashCode这样的方法大大增加了访问大量数据的速度。这也是HashMap与HashSet被推荐优先使用的原因。
public class Test {
public static void main(String[] args) {
System.out.println(“ss”.hashCode());
System.out.println(new String(“ss”).hashCode());
System.out.println(new String(“ss”).hashCode());
System.out.println(new String(“ss”) == new String(“ss”));
System.out.println(new String(“ss”) == “ss”);
}
}
console:
3680
3680
3680
false
false
String的hashcode比较有意思,当String的值相同时,即使是不同的String他们的hashCode也相同,由此就可以判断String的HashCode是与String的值有关系的,事实确实如此,String的HashCode完全是由String的值所决定。这导致了一个严重的问题,就是当我们往一个HashSet中疯狂添加值相同的String时(一般不会这么做),HashSet的查找素的会变得跟List一样慢。
如何解决这个问题呢。
答:覆盖String类重写HashCode,给其中加一个能将相同值得String区别开的变量,如id。
Collections.unmodifiableCollection/Set/List…
Collections.synchronizedCollection/Set/List…
关于java.lang.ref类库中的一些不为人知的东西。
SoftReference WeakReference PhantomReference + ReferenceQueue
与WeakHashMap有关的。