看到一道面试题,问Java中栈的实现方式,记录下一些实现细节。

API中有5个方法,分别是:

 boolean empty()
E peek()
E pop()
E push()
int search(Object o)

Java中stack继承vector,底层实现方式是数组

push:在数组末尾添加元素,添加之前保证数组容量足够。容量不够的话需要扩容,扩容策略如下:

int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);

 public E push(E item) {
addElement(item); return item;
} public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}

pop:取出数组末尾元素,并删除

 public synchronized E pop() {
E obj;
int len = size(); obj = peek();
removeElementAt(len - 1); return obj;
}
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */
}

peek:取出数组末尾元素,不删除

 public synchronized E peek() {
int len = size(); if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}

最新文章

  1. JS Date当前时间:获取日期时间方法在各浏览器中的差异
  2. jquery 百度搜索
  3. [Dynamics CRM 2016]如何配置多语言显示
  4. c中三大区的解析
  5. 【整理】--VC 编译整理
  6. Archiver 浅析
  7. c#智能感知(设置)及实现
  8. 栈的实现(JAVA)
  9. 三分钟PJ隐藏SSID无线网络
  10. SQL Server 查看正在运行的事务信息的 2 种方法。
  11. NTP原理及配置使用
  12. python 零基础学习之路 02-python入门
  13. 记录一次有意思的XSS过滤绕过
  14. Eclipse手动添加web.xml
  15. ASCII与HEX对照转换表
  16. spring multipart源码分析:
  17. 容器互联(linking)
  18. MT【289】含参绝对值的最大值之三
  19. [network] netfilter
  20. Ubuntu 18.04 上设置桌面程序开机自启动

热门文章

  1. 【Tensorflow】slim.arg_scope()的使用
  2. win32程序使用CString
  3. H2数据库做单测数据库时踩到的坑
  4. MySQL系统架构
  5. java while循环
  6. docker 安装 jenkins 笔记
  7. JavaSE---多线程---集合类
  8. Mac系统下安装Homebrew后无法使用brew命令
  9. TableStore最佳实践:GEO索引打造店铺搜索系统
  10. Struts拦截器Interceptor