当前位置: 首页 > news >正文

谈谈ArrayList与Vector的理解?

目录

 扩容机制

ArrayList扩容源码

Vector扩容源码

二者区别

扩展:stack(栈)

1.创建stack对象

 2. 入栈(先进后出)

3.出栈

 扩展:举个例子:实现下字符串逆置,利用stack栈来实现。


从接口实现上,ArrayList与Vector都是基于动态数组实现的List接口的集合实现类。

 扩容机制

ArrayList扩容源码


private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);
  • 当传入的是无参构造时候,add(11)个元素时候,会进行扩容,新容量为oldCapacity>>1+oldCapacity;
  • 当传入的是带参构造,扩容时候,会按照它的传入的扩容容量+扩容容量<<1进行计算;

Vector扩容源码


private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);
}
  • Vector 的无参构造,数组的初始化容量为10,每次扩容不足,扩容为原来的二倍
    
  • 初始化提供数组的初始化容量和每次的扩容值,当容量不足时候,已指定扩容值进行扩容操作

二者区别

初始容量:

  1. ArrayList初始默认容量为0,添加一个元素时候,扩容为10;
  2. Vector 初始容量为10;

扩容方式:

  1. ArrayList:在原有容量基础上,扩容1.5倍。
  2. Vector:在原有容量基础上,扩容2倍。

线程安全:

  1. ArrayList:线程不安全(可使用CopyWriteArrayList集合解决)
  2. Vector:线程安全,操作方法使用sychronized(同步锁)实现线程同步。

执行效率:

  1. Vector的方法加入了同步锁,实现线程安全,所以在方法执行时许加锁,释放锁,产生额外的性能开销,所以Vector性能会低于ArrayList.
 // 栈 先进后出Stack<String> stack = new Stack<>();// 入栈stack.push("张三");stack.push("李四");stack.push("王五");System.out.println(stack);// 获取到栈顶元素,并让栈顶元素出栈// String item = S1.POP();// 获取栈顶元素,元素不出栈。String item = stack.peek();System.out.println(item);System.out.println(stack);// 字符串逆置System.out.println(reverse("abcdefg"));}public static String reverse(String str){Stack<Character> stack = new Stack<>();// 字符串中的元素入栈char[] c1 = str.toCharArray();for (char c : c1){stack.push(c);}StringBuilder sb = new StringBuilder();// 出栈while (!stack.isEmpty()){sb.append(stack.pop());}return sb.toString();}

扩展:stack(栈)

1.创建stack对象

        Stack<Character> stack = new Stack<>();

 2. 入栈(先进后出)
 

        stack.push("张三");

3.出栈

// 获取到栈顶元素,并让栈顶元素出栈// String item = S1.pop();
// 获取栈顶元素,元素不出栈。String item = stack.peek();

 扩展:举个例子:实现下字符串逆置,利用stack栈来实现。

public static String reverse(String str){Stack<Character> stack = new Stack<>();// 字符串中的元素入栈char[] c1 = str.toCharArray();for (char c : c1){stack.push(c);}StringBuilder sb = new StringBuilder();// 出栈while (!stack.isEmpty()){sb.append(stack.pop());}return sb.toString();}

http://www.dtcms.com/a/296367.html

相关文章:

  • SpringBoot+AI+Web3实战指南
  • Python循环结构
  • 红黑树:高效平衡的终极指南
  • c语言学习(dyas10)
  • Kubernetes Kubelet 资源配置优化指南:从命令行参数到配置文件的最佳实践
  • Spring AI - ChatModel接口演示
  • TCO,UDP考点
  • 开发避坑短篇(5):vue el-date-picker 设置默认开始结束时间
  • SpringBoot航空订票系统的设计与实现
  • 视频模型国产PK国外?
  • 金仓数据库:从国产替代到AI融合的破局之路
  • #来昇腾学AI 【十天成长计划】大模型LLM Prompt初级班
  • Linux的工具
  • 提取边界线的思路与原理
  • Linux---systemd自启动
  • 论文复现-windows电脑在pycharm中运行.sh文件
  • 嵌入式——C语言:函数②
  • webGis框架
  • 元计算推动产业元宇宙改变世界
  • 将Scrapy项目容器化:Docker镜像构建的工程实践
  • Web前端开发:JavaScript reduce() 方法
  • 借助AI学习开源代码git0.7之九diff-files
  • MCU中的系统总线
  • Android 与 Windows 文件路径的设计差异
  • 机器学习概述与 KNN 算法详解
  • ESP32- 项目应用1 智能手表 之更新天气#4
  • FANUC 机器人控制末端位置的示例程序
  • Windows 主机侧日志排查
  • 【YOLOv8改进 - 特征融合】FCM:特征互补映射模块 ,通过融合丰富语义信息与精确空间位置信息,增强深度网络中小目标特征匹配能力
  • 二、计算机网络技术——第5章:传输层