1. 各种集合类之间的关系

  • 1.可以看出List接口继承自Collection接口, Collection接口又继承自Iterable接口,即实现了迭代器的功能(遍历方式可用)
  • 2.ArrayList和LinkedList都继承自AbstractList, 并且实现了List接口
    所以现在我们来看一下ArrayList的常用方法

2. ArrayList的框架图

首先我们来看一下ArrayList的具体框架图

  • 1 实现了RandomAccess
    RandomAccess 是一个标记接口,用于标明实现该接口的List支持快速随机访问,主要目的是使算法能够在随机和顺序访问的list中表现的更加高效。
  • 2 实现了Cloneable接口
    实现Cloneable接口表示该对象能被克隆
    克隆分为浅拷贝和深拷贝两种,,浅拷贝是指拷贝对象时仅仅copy对象本身和对象中的基本变量,而不拷贝对象包含的引用指向的对象。深拷贝则拷贝引用中指向的对象
  • 3 实现了Serializable接口
    代表序列化,此处不多讲,若有兴趣可以自己查
  • 4 实现了List接口
    这样就可以使用List接口中定义的方法

3 ArrayList的常用方法

List<Integer> al = new ArrayList<>();

1.public boolean add(E e)
在ArrayList对象中尾插一个元素进入,E e 代表泛型
2. public void add(int index, E element)
在指定位置插入一个元素,注意index必须介于[0, size)间
3.public boolean addAll(Collection<? extends E> c)
泛型写法: 可以将包含继承自E的对象的集合放入来添加
4.public E remove(int index)
删除 index 位置元素
5.public boolean remove(Object o)
删除遇到的第一个 o
6.public E get(int index)
获取下标为index位置的元素
7.public E set(int index, E element)
将下标 index 位置元素设置为 element
8.public boolean contains(Object o)
判断 o 是否在线性表中
9.public int indexOf(Object o)
返回第一个 o 所在下标
10public int lastIndexOf(Object o)
返回最后一个 o 的下标
11 public List<E> subList(int fromIndex, int toIndex)
截取部分List作为返回

具体使用

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("JavaSE");list.add("JavaWeb");list.add("JavaEE");list.add("JVM");list.add("测试课程");System.out.println(list);// 获取list中有效元素个数System.out.println(list.size());// 获取和设置index位置上的元素,注意index必须介于[0, size)间System.out.println(list.get(1));list.set(1, "JavaWEB");System.out.println(list.get(1));// 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置list.add(1, "Java数据结构");System.out.println(list);// 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置list.remove("JVM");System.out.println(list);// 删除list中index位置上的元素,注意index不要超过list中有效元素个数,否则会抛出下标越界异常list.remove(list.size()-1);System.out.println(list);// 检测list中是否包含指定元素,包含返回true,否则返回falseif(list.contains("测试课程")){list.add("测试课程");}// 查找指定元素第一次出现的位置:indexOf从前往后找,lastIndexOf从后往前找list.add("JavaSE");System.out.println(list.indexOf("JavaSE"));System.out.println(list.lastIndexOf("JavaSE"));// 使用list中[0, 3)之间的元素构成一个新的ArrayList返回List<String> ret = list.subList(0, 3);System.out.println(ret);list.clear();System.out.println(list.size());
}

4. 自己动手实现一个ArrayList

package day20211015;import java.util.Arrays;public class MyArrayList<E> {private E[] elements;private int size;// 默认容量 10private static final int DEFAULT_CAPACITY = 10;// 构造方法public MyArrayList() {elements = (E []) new Object[DEFAULT_CAPACITY];}public MyArrayList(int capacity) {if (capacity <= 0) {capacity = DEFAULT_CAPACITY;}elements = (E [])new Object[capacity];}public int size() {return size;}public boolean add(E e) {// 考虑扩容问题//elements[size++] = e;//return true;add(size, e);return true;}public void add(int index, E e) {checkRange(index);// 考虑扩容问题ensureCapacity(size);for (int i = size-1; i >= index ; i--) {elements[i+1] = elements[i];}elements[index] = e;size++;}// ArrayList当中的扩容方式 :// 1. 先按照1.5倍的方式来计算newCapacity// 2. 如果newCapacity > MAX_ARRAY_SIZE 按照MAX_ARRAY_SIZE 来扩容 没有超过就按照1.5倍来public void ensureCapacity(int size) {int oldCapacity = elements.length;if (size > oldCapacity) {int newCapacity = oldCapacity + (oldCapacity >> 1);elements = Arrays.copyOf(elements, newCapacity);}}public int indexOf(E e) {for (int i = 0; i < size; i++) {// 引用类型需要使用equals方法if (e.equals(elements[i])) {return i;}}return -1;}public int lastIndexOf(E e) {for (int i = size-1; i >= 0 ; i--) {if (e.equals(elements[i])) {return i;}}return -1;}@Overridepublic String toString() {return Arrays.toString(elements);}public E remove(int index) {if (index < 0 || index >= size) {throw new ArrayIndexOutOfBoundsException("remove 下标越界");}E e = elements[index];for (int i = index+1; i < size; i++) {elements[i-1] = elements[i];}elements[size-1] = null;size--;return e;}public boolean remove(E e) {int index = indexOf(e);if (-1 == index) {return false;}remove(index);return true;}private void checkRange(int index) {if (index < 0 || index > size) {throw new ArrayIndexOutOfBoundsException("index 越界");}}public E get(int index) {checkRange(index);return elements[index];}public void set(int index, E e){checkRange(index);elements[index] = e;}public void clear() {for (int i = 0; i < size; i++) {elements[i] = null;}size = 0;}public boolean contains(E e) {return -1 != indexOf(e);}public MyArrayList<E> subList(int from, int to) {if (from > to) {throw new IllegalArgumentException("from > to");}else if (from < -1 || to > size) {throw new IllegalArgumentException("from需要大于0, to需要小于size");}int newSize = to - from;MyArrayList<E> list = new MyArrayList<>(newSize);while(from < to) {list.add(elements[from]);from++;}return list;}
}

List有关知识与ArrayList的实现相关推荐

  1. java arraylist add时默认调用tostring_Java基础知识之ArrayList知识点总结

    本文包含常见的ArrayList的基本知识.在一些主题下也自然地引出了Colletion类的一些相关知识. 一.ArrayList的底层数据结构 ArrayList底层是使用一个Object[]数组来 ...

  2. 关于ArrayList的几大问题,看完还不懂来打我!

    作者:熬夜不加班 链接:https://www.jianshu.com/p/06b82a75d2af 前言 ArrayList是Java集合框架中比较常用的数据结构了.继承自AbstractList, ...

  3. arrays中copyof_在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?

    面试三连 面试官:使用过集合吗?能说说都使用过哪些吗? 小明:当然使用过,使用比较多的就是ArrayList与HashMap,还有LinkedList.HashTable.ConcurrentHash ...

  4. 通过数组下标获取值都有哪些方法_通过面试题,让我们来了解Collection

    前言 欢迎关注微信公众号:Coder编程 获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识! 本章主要介绍Collection集合相关知识,结合面试中会提到的相关问题进行知识点的梳理.希望 ...

  5. java基础问题集锦一

    java基础知识: ArrayList与LinkedList的区别以及底层实现原理  ArrayList add操作实现 扩容系数 HashMap与CouncurrentHashMap HashMap ...

  6. 简易android通讯录

    android通讯录 文章目录 android通讯录 (1)初步实现的功能: (2)主界面布局 (3)设计思路 (4)开发技术 (5)核心方面 5.1数据库设计方面 5.2JavaBean 5.3Ar ...

  7. 经典数据挖掘算法(介绍了包括18大数据挖掘在内的多种经典数据挖掘算法)

    前言 文章标题的两个概念也许对于许多同学们来说都相对比较陌生,都比较偏向于于理论方面的知识,但是这个算法非常的强大,在很多方面都会存在他的影子.2个概念,1个维特比算法,1个隐马尔可夫模型.你很难想象 ...

  8. android 各类demo链接

    http://gundumw100.iteye.com/blog/940084 带磁性的悬浮窗体,类似于360绿色小人  主要实现的是:  1.悬浮所有窗体之上  2.有吸引力,吸附于屏幕边上  3. ...

  9. android代码精华 各路大神写的代码精华,大家一起分享

    http://blog.csdn.net/kan1kan5/article/details/41960259 http://gundumw100.iteye.com/blog/940084 带磁性的悬 ...

最新文章

  1. 机器学习最常用的优化算法 — 梯度下降法
  2. 滴滴自动驾驶部门成立独立公司,CTO张博兼任新公司CEO
  3. nvm 下载node 下载不下来_一键下载网页所有图片,把美丽存下来
  4. [android] 解决DatePickerDialog和TimePickerDialog控件取消按钮问题
  5. C# 巧用anchor和dock设计复杂界面(控件随着窗体大小的变化而变化)【转】
  6. DOM克隆操作(深克隆/浅克隆)
  7. Linux下与github建立ssh连接
  8. 全网最全Linux命令总结!!(史上最全,建议收藏)
  9. 基于深度学习的回声消除系统与Pytorch实现
  10. 华为手机应用程序变为Android图标,华为手机如何改变应用图标
  11. 51Job行业分类和行业编号汇总,格式:Json
  12. 项目管理助力组织赢在VUCA时代
  13. 数据可视化的实现技术和工具比较(HTML5 canvas(Echart)、SVG、webGL等等)
  14. 光子晶体和深度学习结合进行多相流检测
  15. Warring:No archetype found in remote catalog. Defaulting to internal catalog
  16. 3D模型欣赏:黑色的巴斯泰托女神【3D游戏建模教程】
  17. Java 学习情况总结
  18. 创业需谨慎:减少摩擦,打造快乐体验
  19. Bean 的生命周期
  20. 玩转NPM,搭建私有仓库-姜威-专题视频课程

热门文章

  1. 向前欧拉公式 matlab_你可能不知道的MATLAB操作#第三话
  2. 22. Leetcode 237. 删除链表中的节点 (链表-基础操作类-删除链表的节点)
  3. Leetcode 125. 验证回文串 (每日一题 20210816)
  4. python爬虫基础(二)~工具包: 下载包requests、urllib和解析包BeautifulSoup(bs4)、lxml.etree.xpath
  5. 文计笔记2: 计算机硬件知识
  6. Python应用实战案例-一文通读时间序列在Python中的应用
  7. 探索推荐引擎内部的秘密,第 3 部分: 深入推荐引擎相关算法 - 聚类
  8. Matplotlib实例教程 | markers表
  9. 使用libsvm对MNIST数据集进行实验
  10. Kafka设计解析(七)- 流式计算的新贵 Kafka Stream