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

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

容器的简图

不包含抽象类和遗留构件

容器的简单分类.png
  • Java 容器类类库的用途是“保存对象”。

  • Java 容器类都可以自动地调整自己的尺寸。

  • Java 容器可划分为两个不同的概念: Collection 与 Map。
    1.Collection里面的接口有些是可选的(为了防止接口爆炸的情况),并且未获支持的操作只有在运行时才能探测到,因此有可能调用接口时会获取到UnsupportedOperationException。

List

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

  • ArrayList
    1.底层是数组

  • LinkedList
    1.底层是链表
    2.各种Queue和栈的行为由LinkedList提供支持。
    3.一些方法需要注意:

// 不移除
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 不保存重复的元素。

  • HashSet
    1.随机查找最快
    2.存储的顺序并无意义
    3.元素必须定义hashCode()方法

  • TreeSet
    1.按照比较结果的升序保存对象
    2.底层是红-黑树
    3.元素必须实现Comparable接口

  • LinkedHashSet
    1.按照被添加的顺序保存对象
    2.保留HashSet的查询速度
    3.元素必须定义hashCode()方法

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

Queue

  • LinkedList 提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现。通过将LinkedList向上转型为Queue:
Queue queue = new LinkedList();

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

  • PriorityQueue
    1.排序是通过Comparable进行控制的(添加到队列中的元素实现Comparable接口)

  • 双向队列
    1.Java标准类库中没有任何显式的用于双向队列的接口。但是可以和Stack一样,通过组合LinkedList来实现一个Deque类。

Map

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

  • HashMap
    1.提供最快的查找技术
    2.没有明显的顺序

  • TreeMap
    1.按照比较结果的升序保存键
    2.唯一有subMap()方法的Map

  • LinkedHashMap
    1.按照插入顺序保存键
    2.保留了HashMap的查询速度
    3.可以在构造器中设定LinkedHashMap实现最近最少使用算法,于是没有使用过得元素就会出现在队列的前面。

LinkedHashMap linkedHashMap = new LinkedHashMap(16,0.75f,true);
  • WeakHashMap(弱键映射)
    1.如果映射之外没有引用指向某个“键”,则此“键”可以被垃圾收集器回收

  • ConcurrentHashMap
    1.一种线程安全的Map

  • IdentityHashMao
    1.使用==代替equals()对“键”进行比较的散列映射。专门解决特殊问题而设计的

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

迭代器

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

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

  • Iterator
    1.使用方法iterator()要去容器返回一个Iterator。
    2.使用next()获取序列中的下一个元素。
    3.使用hasNext()检查序列中是否还有元素。
    4.使用remove()将迭代器新近返回的元素删除。

  • ListIterator
    1它是更加强大的IIterator,但是只能用于各种List类的访问。
    2.它可以双向移动。
    3.可以使用set()方法替换访问过得最后一个元素。
    4.hasPrevious()、privious()方法对应hasNext()、next()方法。

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

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

Collection 与 Iterator

  • 使用接口描述的一个理由是它可以使我们能够创建更通用的代码。
  • 用迭代器而不是Collection来表示容器之间的共性。

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

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

Foreach与迭代器

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

  • 不存在任何从数组到Iterator的自动转换,因此必须手工执行转换:
String[] strings;
Arrays.asList(strings);

其他一些记录

  • Arrays.asList()产生的List对象会使用底层数组作为其物理实现,不能对数组尝试改变长度的操作。如果你执行的操作会修改这个List,并且你不想原来的数组被修改,那么就应该在另一个容器中创建副本。

  • 打乱Collection元素顺序

Collections.shuffle(list,rand);
  • 数据传输对象(或信使)写法:
// 将域定义为public、final即可
public final K key;
public final V value;
  • 正确的equals()方法必须满足下列5个条件:
    1.自反性
    2.对称性
    3.传递性
    4.一致性
    5对任何不适null的x,x.equals(null)一定返回false

  • hashCode生成方法:
    1.给int变量result赋予某个非零参量
    2.为对象内每个有意义的域计算出一个int散列码c
    3.合并计算得到散列吗

result = 37 * result + c;

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

int result = 17;
result = 37 * result + s.hashCode();
result = 37 * result + id;
return result;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 3.3 集合 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另...
    闫子扬阅读 715评论 0 1
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 1,151评论 0 16
  • 不知道大家有没有用过微信摇一摇功能,没用过的最好也别用了,尤其是智商不够用的。 上面全是套路啊。 本人女,我反正是...
    一缕仙儿气阅读 378评论 0 2