Thinking in Java——容器篇学习笔记

2016-12-17  本文已影响239人  im宇

写在前面:
这是一篇菜鸟的学习笔记。

容器的简图

不包含抽象类和遗留构件

容器的简单分类.png

List

1.List 接口在 Collection 的基础上添加了大量的方法。

// 不移除
getFirst()、element()// 返回列表的头,如果List为空抛出NoSuchElemetException。
peek() // 返回列表的头,如果List为空返回null。
// 移除
removeFirst()、remove()// 移除并返回列表的头,如果List为空抛出NoSushElementException。
poll()// 移除并返回列表的头,如果List为空返回null。

Stack

如果你只需要栈的行为,那么使用继承LinkedList就不合适了,因为这样会产生具有LinkedList的其他所有方法的类(Java1.0的设计者在创建java.util.Stack时,就犯了这个错误)。因此不使用Java原生态的Stack类,而简单封装LinkedList来实现栈即可。

public class Stack<T>{
    private LinkedList<T> storage = new LinkedList<T>();
    public void push(T v) {
        storage.addFirst(v);
    }
    public T peek() {
        return storage.getFirst();
    }
    public T pop() { 
        return storage.removeFirst();
    }
    public boolean empty() {
        return storage.isEmpty();
    }
    public String toString() {
        return storage.toString();
    }
}

Set

1.Set 具有与Collecion完全一样的接口,因此没有任何额外的功能,两者只是行为不同而已。
2.Set 不保存重复的元素。

注:
1.此外,你必须为散列存储和树型存储都创建一个equals()方法,因为Set容器需要通过该方法判断元素是否重复。
2.对于良好的编程风格而言,你应该在覆盖equals()方法时,总是同时覆盖hashCode()方法。

Queue

Queue queue = new LinkedList();

事实上Queue接口窄化了对LinkedList的方法的访问权限以“专心”当作队列使用。

Map

Map和Collection之间的唯一重叠就是Map可以使用entrySet()、values()方法来产生Collection

LinkedHashMap linkedHashMap = new LinkedHashMap(16,0.75f,true);

注:
对Map中使用的键的要求与对Set中的元素的要求一样,都必须有一个equals()方法。如果键被用于散列还需要hashCode(),如果键被用于TreeMap,那么它必须实现Comparable。

迭代器

迭代器是一个对象,他的工作是遍历并选择序列中的对象,统一了对容器的访问方式。属于轻量级对象。

1.如果你只是向前遍历List,并不打算修改List对象本身,那么你可以使用foreach语法更简洁。
2.如果对List要执行一个remove等会影响容器元素个数的操作,则使用迭代器或者for()循环。因为使用foreach()时会出现错误。

注:
1.Map 没有iterator()方法,但是可以通过如下方法遍历:

for(Map.Entry e: m.entrySet()){
  e.getKey();
  e.getValue();
}

Collection 与 Iterator

但是Java中将这两种方法绑定到了一起,实现Collection就意味着需要提供iterator()方法。

设想这种情况:
如果你的类已经继承了其他的类,那么你就不再继承AbstractCollection了。在这种情况下,要实现Collection,就必须实现该接口中的所以方法。此时,继承并提供创建迭代器的能力就会显得容易得多了。

Foreach与迭代器

foreach语法主要用于数组,但是它也可以应用于任何Collection对象。之所以Collection对象能够使用于foreach,是因为Iterable接口。因此任何实现Iterable的类都可以将它用于foreach语句中。

String[] strings;
Arrays.asList(strings);

其他一些记录

Collections.shuffle(list,rand);
// 将域定义为public、final即可
public final K key;
public final V value;
result = 37 * result + c;

4.返回result
5.检查hashCode()最后的生成结果
6.例如:

int result = 17;
result = 37 * result + s.hashCode();
result = 37 * result + id;
return result;
上一篇 下一篇

猜你喜欢

热点阅读