文章目录
- 前言
- 传统的类
- 数组
- 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)实现添加并且判断的效果