文章目录

  • 前言
  • 传统的类
  • 数组
  • Vector
  • BitSet
  • Stack
  • Hashtable
  • 三大集合组件:Map List Set
  • List类型的选择
  • Set的选择
  • Map的选择


前言

之前逛牛客网时得知校招或者暑期实习面试会问一些 基础 的问题,比如“java的集合类型”,但我发现我还不懂,刚好最近在看《thinking in java》一书,上面提到了这个问题,特此做个笔记,内容同时参考java8 api官方文档。

传统的类

数组

不多说了,c语言课上可接触太多了

Vector

vector的译名是“向量”,我个人看到很多用c++写算法题的程序员在需要用到类似动态数组的思想的时候都会用vector,其实在java里面ArrayList类会是更好的替代品,就连官方文档也说ArrayList已经够用了。

BitSet

BitSet实际上是一个由二进制位的vector,集合最小长度是long级别的(64位);
集合中的每个元素都有个布尔值,默认是false;
访问速度比静态数组慢。
用处:可通过和与、或、异或操作符结合使用对另一个BitSet的内容进行修正

Stack

Stack属于Vector的一种,对Vector的操作也可以对Stack对象进行(继承的特性)

E peek() :取栈顶元素
int search(Object o) :返回的数值是从1开始的!
因为,这个int值是从栈顶元素开始算的!
比如以下代码:

import java.util.*;
public class Main{

    public static void main(String[] args){
Stack s=new Stack();
s.push("1");
s.push("2");
s.push("3");
s.push("4");
s.push("5");
System.out.println(s.search("5"));
System.out.println(s.search("4"));
    }
}

运行结果是:1 2 栈顶元素返回1,离栈顶最近的元素返回2,以此类推,若没有找到则返回-1

Hashtable

散列表,key-value的对应关系,数组是只能数字(数组下标)与某一数据类型的对应,而散列表可以做到使任意两种数据类型之间的关系对应。

三大集合组件:Map List Set

而且每个组件实际只有两、三种实现方式,而且通常都只有一种特别好的方式。

List类型的选择

最好的做法也许是先选择一个ArrayList 作为自己的默认起点。以后若发现由于大量的插入和删除
造成了性能的降低,再考虑换成LinkedList。

Set的选择

  • 进行add() 以及 **contains()**操作时,HashSet 显然要比 ArraySet 出色得多,而且性能明显与元素的多寡关系不大。一般编写程序的时候,几乎永远用不着使用 ArraySet。
  • 如果需要从一个 Set 中获得一个顺序列
    表,用TreeSet。

Map的选择

如果需要创建大量Map,而且只有在以后才需要涉及大量检索操作,那么最佳的策略就是:创建和填充TreeMap;以后检索量增大的时候,再将重要的TreeMap 转换成 HashMap——使用HashMap(Map)构建器。
(只有在事实证明确实存在性能瓶颈后,才应关心这些方面的问题——先用起来,再根据需要加快速度。)


以上是我看书的结论,但是在实际应用(刷leetcode)的过程中,我发现了一些之前光读理论没有注意到的地方,特记录如下,如有不当,恳请大佬指正。

先说说与Hash有关的,凡是带Hash的都是散列的,插入顺序和实际存放顺序是不一致的。

  • 关于Hashtable与HashMap
    据说这两者几乎等同,而Hashtable是线程安全的,HashMap不是,但是去官方文档一看,Hashtable的父类Dictionary已经被废弃了,官方都建议我们用Map的接口。
  • 关于HashSet
    对于其add()方法,官方文档里有这么一句话:
    ···
    add(E e)
    Adds the specified element to this set if it is not already present.
    ···

set是不允许添加重复元素的,可以用xx.add(yy)实现添加并且判断的效果