手写记录一下~

顶级接口List

public interface List<E> {//返回线性表的大小public int getSize();//判断线性表中是否为空public boolean isEmpty();//判断线性表中是否包含元素oboolean contains(E o);//在线性表中查找元素o,若成功找到,返回其位置index;否则,返回-1public int indexOf(E e);//获取线性表中 位置为index的元素public E get(int index);//将线性表中 位置为index的元素设置为epublic void set(int index, E e);//在线性表中位置为index处添加元素epublic void add(int index, E e);//删除并返回线性表中位置为index的元素public E remove(int index);
}

ArrayList~~~

import java.util.Arrays;public class ArrayList<E> implements List<E> {private static final int DEFAULT_CAPACITY = 10;private E[] data;private int size;public ArrayList(int capacity) {this.size = 0;data = (E[]) new Object[capacity];}public ArrayList() {this(DEFAULT_CAPACITY);}// O(1)@Overridepublic int getSize() {return size;}// O(1)@Overridepublic boolean isEmpty() {return size == 0;}// O(n)@Overridepublic boolean contains(E o) {for (int i = 0; i < size; i++) {if (data[i].equals(o))return true;}return false;}// O(n)@Overridepublic int indexOf(E e) {for (int i = 0; i < size; i++) {if (data[i].equals(e))return i;}return -1;}// O(1)@Overridepublic E get(int index) {if (index < 0 || index >= size)throw new IllegalArgumentException("数组小标越界...");return data[index];}// O(1)@Overridepublic void set(int index, E e) {if (index < 0 || index >= size)throw new IllegalArgumentException("数组小标越界...");data[index] = e;}// O(n)@Overridepublic void add(int index, E e) {if (index < 0 || index > size) {throw new IllegalArgumentException("数组小标越界...");}if (size == data.length) {grow(2 * data.length);}for (int i = size - 1; i >= index; i--) {data[i + 1] = data[i];}data[index] = e;size++;}// 均摊时间复杂度 O(1)public void addLast(E e) {add(size, e);}// O(n)@Overridepublic E remove(int index) {if (index < 0 || index >= size) {throw new IllegalArgumentException("数组小标越界...");}E val = data[index];for (int i = index + 1; i < size; i++) {data[i - 1] = data[i];}size--;data[size] = null;if (size < (data.length >> 1)) {grow(data.length / 2);}return val;}private void grow(int newCapacity) {/** E[] newData = (E[]) new Object[newCapacity]; for(int i=0;* i<data.length; i++) newData[i] = data[i];* * data = newData;*/data = Arrays.copyOf(data, newCapacity);}public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 100; i++)list.add(i, i);for (int i = 0; i < 100; i++) {System.out.println("The " + i + "th element is: " + list.get(i));}for (int i = 0; i < 50; i += 8) {list.remove(i);}for (int i = 0; i < list.getSize(); i++) {System.out.println("After removing, the " + i + "th element is: " + list.get(i));}}

LinkedList~

public class LinkedList<E> implements List<E> {private class Node {private E data; //数据域private Node next; //指针域,指向下一个Nodepublic Node(E data, Node next) {this.data = data;this.next = next;}public Node(E data) {this(data, null);}public String toString() {return data.toString();}}private Node head;//private Node tail;private int size;public LinkedList() {head = null;size = 0;}//O(1)@Overridepublic int getSize() {return size;}//O(1)@Overridepublic boolean isEmpty() {return size == 0;}//O(n)@Overridepublic boolean contains(E o) {Node p = head;while(p != null) {if(p.data.equals(o))return true;p = p.next;}return false;}//O(n)@Overridepublic int indexOf(E e) {int result = -1;Node p = head;int i = 0;while(p != null) {if(p.data.equals(e)){result = i;break;}p = p.next;i++;}return result;}//O(n)@Overridepublic E get(int index) {if(index<0 || index >= size) {throw new IllegalArgumentException("非法下标...");}Node p = head;for(int i=0; i<index; i++)p = p.next;return p.data;}//O(n)@Overridepublic void set(int index, E e) {if(index<0 || index >= size) {throw new IllegalArgumentException("非法下标...");}Node p = head;for(int i=0; i<index; i++)p = p.next;p.data = e;     }//O(n)@Overridepublic void add(int index, E e) {if(index < 0 || index > size) {throw new IllegalArgumentException("下标越界.....");}//插到链表头部if(index == 0) {addFirst(e);}else if(index == size) {addLast(e);}else {Node prev = head;for(int i=0; i<index; i++) {prev = prev.next;}prev.next = new Node(e, prev.next);size++;}}//O(1)public void addFirst(E e) {Node node = new Node(e, head);head = node;size++;}//O(n)public void addLast(E e) {Node node = new Node(e, null);//链表为空if(head == null) {head = node;}else {Node prev = head;while(prev.next != null) {prev = prev.next;}prev.next = node;}size++;}//O(n)@Overridepublic E remove(int index) {if(index<0 || index >= size) {throw new IllegalArgumentException("非法下标...");}if(index == 0) {return removeFirst();}else if (index == size -1) {return removeLast();}else{Node prev = head;for(int i=0; i<index-1; i++)prev = prev.next;Node tmp = prev.next;prev.next = tmp.next;tmp.next = null;size--;return tmp.data;}}//O(1)public E removeFirst() {if(head == null)return null;E result = head.data;head = head.next;size--;return result;}//O(n)public E removeLast() {if(head == null)return null;E result;//链表只有一个节点if(head.next == null) {result = head.data;head = null;}else {Node prev = head;while(prev.next.next != null)prev = prev.next;result = prev.next.data;prev.next = null;}size--;return result;}public static void main(String[] args) {List<Integer> list = new LinkedList<>();for(int i=0; i<10; i++)list.add(i, i);for(int i=0; i<10; i++) {System.out.println("The " + i + "th element is: " + list.get(i));}list.remove(0);for(int i=0; i<list.getSize(); i++) {System.out.println("After removing, the " + i + "th element is: " + list.get(i));}}}

JAVA手写ArrayList以及LinkedList相关推荐

  1. java 手写 jvm高性能缓存

    java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 1 package com.ws.commons.cache; 2 3 import java.util.functio ...

  2. 面试必会之ArrayList源码分析手写ArrayList

    作者:Java知音-微笑面对生活 简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于 ...

  3. Java 手写一个SQL分页

    Java手写一个类似PageHelper的分页SQL 目前分页插件众所周知的莫过于和mybatis完美融合的PageHelper了,简单两行代码就实现了sql分页,配合PageInfo类,将数据总数量 ...

  4. Java手写线程池-第一代(原创)

    个人简介 作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门. 文章目录 个人简介 Java手写线程池(第一代) ...

  5. Java 手写签字去除背景 背景透明

    Java 手写签字去除背景 背景透明 /*** 白底照片去除白底 形成透明底图片* @param file 需要去除背景的图片* @param Path 去除背景后保存图片的路径* @return t ...

  6. arraylist下标从几开始_剖析JAVA面试题 手写ArrayList的实现,在笔试中过关斩将?...

    面试官Q1:可以手写一个ArrayList的简单实现吗? 我们都知道ArrayList是基于数组实现,如果让你实现JDK源码ArrayList中add().remove().get()方法,你知道如何 ...

  7. 深入理解java中的ArrayList和LinkedList

    杂谈最基本数据结构--"线性表": 表结构是一种最基本的数据结构,最常见的实现是数组,几乎在每个程序每一种开发语言中都提供了数组这个顺序存储的线性表结构实现. 什么是线性表? 由0 ...

  8. 【Java 集合】ArrayList、LinkedList、Stack、Queue、Set、Map, 迭代器 Iterable、Iterator,Collections类

    集合类型 数组的局限性 ArrayList(常用方法 + 基本使用) ArrayList - retainAll ArrayList - toArray ArrayList 的遍历(5种) Array ...

  9. Java—手写服务器

    1.预备知识_Socket知识回顾 1.1编写服务器用到的知识点 1)Socket编程 2)HTML 3)HTTP协议 4)反射 5)XML解析 6)服务器编写 1.2复习Socket编程 1)C/S ...

最新文章

  1. Spring - BeanDefinition的注册顺序 DeffredImportSelector
  2. SAP CRM BSP UI gif and color handling
  3. 工作后和在学校最大的区别是什么?
  4. MySQL优化(2)--------常用优化
  5. 自己写的BMFont导入工具,快速把图片转换为美术字体
  6. SpringBoot 快速入门
  7. weblogic 启动很慢_【转】解决weblogic启动慢和创建域慢的方法
  8. RMXP脚本解析(二十):Game_Actors
  9. Latex:Tikz脑图(Mindmap)如何添加新结点并调整结点位置
  10. 使用串口发送实现ACX720开发板时钟显示
  11. 大众疑问:学会PS 可以找什么工作
  12. iPad Pro如何当外置显示器(win、mac)
  13. AMD Ryzen 5 2600X 微星B450M 迫击炮 技嘉GTX10606G成功安装黑苹果Mac OS High Sierra 10.13.16全记录
  14. 随机预言机(random oracle)和PRF(Pseudorandom Function)是什么,区别在哪里?
  15. 彻底解决“整个网络”的怪病
  16. pdf.net sod oracle,SOD: 原PDF.NET框架将成为一个全功能的企业开发框架,而 SOD框架将是PDF.NET开发框架下面的 “数据开发框架...
  17. Unable to load authentication plugin ‘caching_sha2_password‘
  18. ISO22000 HACCP食品安全管理体系认证范围
  19. 让 MTK手机 黑屏死机 的短信代码 让山寨机死机的短信 让手机死机的短信
  20. thymeleaf 数字格式化

热门文章

  1. 前端学习(2951):上午回顾
  2. [html] 图片上传时实现本地预览功能的原理是什么?
  3. 前端学习(2324):angular初步使用
  4. 前端学习(1891)vue之电商管理系统电商系统之el-table渲染表格
  5. 前端学习(597):查看和调试cookie
  6. 前端学习(6):javascript简介
  7. spring mvc学习(15)Referenced file contains errors
  8. VMware Workstation Pro 无法在Windows 上运行的 解决办法
  9. HC-05蓝牙模块的配置和使用方法
  10. C 语言调用CPU指令,CPU 1214C中 TSEND_C指令 最多可以使用几次-工业支持中心-西门子中国...