java编程思想-第11,17章-容器,高级容器

第11章 容器

11.3添加一组元素

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

11.7LinkedList

LinkedList是Queue接口的一个实现。

add();
addFirst();
addLast();

peek(); 为空时返回null;
element();
getFirst();
getLast();

poll(); 为空时返回null;
remove();
removeFirst();
removeLast();

第17章 容器深入研究

17.1容器的分类

List — AbstractList/ArrayList/LinkedList
Set — AbstractSet/HashSet/LinkedHashSet/TreeSet
Map — AbstractMap/HashMap/LinkedHashMap/TreeMap/WeakHashMap/IdentityHashMap

17.2填充容器

List《T》 Collections.nCopies(int amount, T t);
void Collections.fill(List《? extends T》 list, T t);

17.2.1一种Generator解决方案

一种适配器设计模式:
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.2 Map生成器

与17.2.1相似,但是有很多方式,一种是传入Iterable《T》接口,一种是传入Generator《T》。还可以传入Generator《pair《K,V》》传入两个Generator《K》, Generator《V》;

17.2.3 使用Abstract类

实现了一个使用固定数量容器,即利用数组来实现的继承自AbstractMap的map。
实现了Map中应该实现的接口。entrySet();返回一个装满SetEntry的EntrySet。
还创建了一个实现了Set.Entry接口的SetEntry。

本节目标:熟练掌握继承自Abstract容器类的用法。

17.3Collection功能:

需要使用的话查阅相关资料。

17.4可选操作

什么叫做可选操作:就是可以实现也可以不实现,当不想实现某个接口方法或Abstract方法时,就可以通过throw new UnsupportedOperationException来阻止方法运行时的调用。

Collections类中的“不可修改”的方法将容器包装到一个代理中,只要你执任何试图修改容器的操作,这个代理都会产生UnsupportedOperationException异常。

Collections.unmodifiableList();会产生一个完全不可修改的Collection,为什么说是完全,因为Array.asList();产生的Collection只是不可以扩展或者缩小,但可以对set进行操作。而Collections.unmodifiableList();连set都不可以使用。
很明显,Array.asList()是把一个数组包装在了一个List中,因为数组大小是固定的,所以只是不能改变容器大小,但容器中的值是可以改变的。

17.6 Set和存储顺序

Set:存入Set的每个元素都必须是唯一的,Set接口不保证元素的次序。必须实现equals()来保证唯一性。
HashSet:为快速查找而设计的Set,存入的元素必须定义hashCode()。后面有详细介绍。
TreeSet:TreeSet中的值保证sort的次序,必须实现comparable接口。
LinkedHashSet:拥有HashSet的查询速度,内部以链表维护元素插入的顺序。

17.6.1 SortedSet

是一个接口,TreeSet实现了该接口。
Object first(); 返回容器的第一个元素
Object last();返回容器的最后一个元素
SortedSet subSet(fromElement, toElement); 生成此Set的子集,从fromElement到toElement(不包括)
SortedSet headSet(toElement);
SortedSet tailSet(FromElement);

17.9 散列与散列码

神奇的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。

17.11 实用方法:

17.11.2设置为不可修改。

Collections.unmodifiableCollection/Set/List…

17.11.3同步控制。

Collections.synchronizedCollection/Set/List…

17.12持有引用:

关于java.lang.ref类库中的一些不为人知的东西。
SoftReference WeakReference PhantomReference + ReferenceQueue
与WeakHashMap有关的。

你可能感兴趣的:(Java)