ArrayList笔记

只实现了Collection部分方法,我们需要的是实现排序,所以只要实现toArray()方法和set()方法即可用Collections.sort()来实现排序算法。还有很多不足的地方,日后实现。

import java.util.AbstractList;
import java.util.Collections;
import java.util.List;
import java.util.Arrays;
import java.util.RandomAccess;public class MyArray<T> extends AbstractList<T>implements List<T>, RandomAccess, Cloneable, java.io.Serializable{private static final long serialVersionUID = 1L;//元素列表private Object elementData[];//列表大小private int size;//列表容量private int capacity;/*** 默认构造长度为10的数组*/public MyArray (){capacity = 10;elementData = new Object[capacity];}/*** 指定capacity大小的数组* @param capacity 容量*/public MyArray (int capacity){this.capacity = capacity;elementData = new Object[this.capacity];}/*** 插入元素到指定index* @param index 指定位置* @param value 待插入元素*/public void add(int index, T value){//此时size为真实存储数量+1//比如size=11,真实数量有10个,而插入在第11个位置也是可以的rangeCheck(index);ensureCapacity(size+1);//对一维数组按值传递,在元素内容巨大的情况下,它的执行效率远比for循环高的多System.arraycopy(elementData, index, elementData, index+1, size-index);elementData[index] = value;size++;}/*** 插入元素在列表某尾* @param value 待插入元素* @return */public boolean add(T value) {ensureCapacity(size+1);elementData[size++] = value;return true;}/*** 从位置0开始查找元素* @param value 待查找元素* @return index 索引位置*/public int indexOf(Object value){if(value==null){for(int i=0;i<size;i++){if(elementData[i]==null){return i;}}}else{for(int i=0;i<size;i++){if(value.equals(elementData[i])){return i;}}}return -1;}/*** 从列表某尾开始查找元素* @param value 待查找元素* @return index 索引位置*/public int lastIndexOf(Object value){if(value==null){for(int i=size-1;i>=0;i--){if(elementData[i]==null){return i;}}}else{for(int i=size-1;i>=0;i--){if(value.equals(elementData[i])){return i;}}}return -1;}/*** 删除指定元素* @param value 待删除元素* @return 是否删除成功*/public boolean remove(Object value){if(value==null){for(int i=0;i<size;i++){if(elementData[i]==null){fastRemove(i);return true;}}}else{for(int i=0;i<size;i++){if(value.equals(elementData[i])){fastRemove(i);return true;}}}return false;}/*** 删除指定位置元素* @param index 待删除位置元素* @return T 返回被删除元素*/public T remove(int index){rangeCheck(index);T oldValue = (T) elementData[index];fastRemove(index);return oldValue;}/*** 获取指定位置的元素* @param index 指定位置* @return 返回指定位置元素*/public T get(int index){rangeCheck(index);return (T) elementData[index];}/*** 删除指定位置的元素,效率高* @param index 待删除位置*/private void fastRemove(int index){//待复制的元素数量int num = size-(index+1);//如果复制数量为0就不用去执行arraycopyif(num>0)System.arraycopy(elementData, index+1, elementData, index, num);elementData[--size] = null;}/*** 检查是否需要扩容*/private void ensureCapacity(int newsize) {if(size>=capacity){int newCapacity = (capacity*3)/2 + 1;if(newsize>newCapacity){newCapacity = newsize;}//copyOf最后调用的是底层实现的System.arraycopy函数,效率比for高elementData = Arrays.copyOf(elementData, newCapacity);capacity = newCapacity;}}/*** 检查有无越界* @param index 待检查位置* @throws 越界则抛出异常*/private void rangeCheck(int index) {if(index<0||index>size)throw new ArrayIndexOutOfBoundsException();}public T set(int index, T value){rangeCheck(index);T old = (T) elementData[index];elementData[index] = value;return old;}@Overridepublic int size() {return size;}@Overridepublic boolean isEmpty() {return size==0;}@Overridepublic boolean contains(Object o) {return indexOf(o)>=0;}@Overridepublic <T> T[] toArray(T[] a) {//a的长度小于this的长度,说明a的空间太小if(a.length<size)return (T[]) Arrays.copyOf(elementData, size, a.getClass());//说明a的空间大于等于this的空间,所以直接复制就行了System.arraycopy(elementData, 0, a, 0, size);//说明a的空间比this空间大if(a.length>size)a[size] = null;return a;}@Overridepublic void clear() {for(int i=0;i<size;i++)elementData[i] = null;size = 0;}@Overridepublic Object[] toArray() {return Arrays.copyOf(elementData, size);}//测试单元public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<Integer>();myArray.add(100);myArray.add(100);myArray.add(200);myArray.add(300);myArray.add(2,400);myArray.add(100);for(Integer i : myArray){System.out.print(i+" ");}System.out.println();Collections.sort(myArray);for(Integer i : myArray){System.out.print(i+" ");}}}

ArrayList笔记相关推荐

  1. openlayers3线段添加闪烁_openLayers 4 canvas图例绘制,canvas循环添加图片,解决图片闪烁问题...

    一.问题来源: 接触Openlayers 一段时间了,最近做了一个农业产业系统,项目中涉及到产业图例,最后考虑用canvas来绘制图例图像.当中带图片的图例移动时,图片会实现闪烁留白情况.闪烁是因为绘 ...

  2. mysql启动的服务程序是什么_MySQL服务启动:某些服务在未由其他服务或程序使用时将自动停止...

    这几天因为工作需求,需要把MySQL请出来,所以将尘封已久的MySQL进行启动.可是事与愿违,兴许是许久没有访问MySQL了,MySQL生气的不理我,并向外抛出一阵阵报错. 1.其中一个是:Windo ...

  3. arraylist从大到小排序_JAVA零基础入门课程笔记----数组排序

    一.什么是数组 * 数组是一个变量,存储相同数据类型的一组数据: * 声明一个变量就是在内存空间划出一块合适的空间 * 声明一个数组就是在内存空间划出一串连续的空间 二.数组的基本要素 标识符:数组的 ...

  4. 学习笔记——ArrayList总结

    ArrayList可以说是一种很常用很常用的数据结构了. ArrayList底层是通过数组实现的.可以看下源码(基于JDK1.8) 首先从构造函数说起,总共有三种构造函数: public ArrayL ...

  5. 第18天学习Java的笔记-ArrayList

    还有31天! 对象数组 package Demo1801;public class Person {private String name;private int age;public Person( ...

  6. 【报错笔记】项目中使用ArrayList<>报错:‘<>’operator is not allowed for source level below 1.7

    项目中使用ArrayList<>报错:'<>'operator is not allowed for source level below 1.7 解决方案:右键项目–属性–J ...

  7. arraylist如何检测某一元素是否为空_java学习笔记:【ArrayList集合】

    在介绍ArrayList集合前,我先简单的说一下什么是集合.集合,顾名思义,是很多东西聚集在一起叫集合,在java中,集合是用来储存数据的一种容器,它和之前介绍过的数组有相似之处. 它与数组的主要区别 ...

  8. Java学习笔记_匿名/ArrayList

    引用类型的一般使用步骤: 导包 import 包路径.类名称 如果需要使用的目标类,和当前类位于同一个包下,则可以省略导包语句不写 只有java.lang包下的内容不需要导包,其它的包都需要impor ...

  9. java arraylist排序_最全Java集合笔记

    集合概述 什么是集合 集合框架:用于存储数据的容器. 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算法. 接口:表示集 ...

最新文章

  1. 使用OpenCV校准鱼眼镜头
  2. cpu密集型 计算密集型 io密集型 简介
  3. 浅析影响网站空间选择的三大因素
  4. Adding a horizontal separator to a Flex PopUpButton control’s pop up menu (redux)
  5. java call oracle procudure setBoolean问题PLS-00306: wrong number or types of arguments in call to
  6. 两万字详细爬虫知识储备,数据采集与清洗基础习题(一)头歌参考答案
  7. 盘点数据科学最流行的29个Python库
  8. WPF学习笔记(数据绑定篇3)
  9. cv_load_image_anycolor 什么意思_LOL英雄联盟手游use a ping什么意思?怎么给队友发信号?...
  10. [BZOJ]4127: Abs
  11. NGN学习笔记6——NGN的业务提供技术
  12. Windows Server 2003 安装教程
  13. 计算机服务无法启动,Win7系统下windows firewall服务无法启动怎么解决【图文】
  14. 资历越深,越是负资产
  15. echarts年龄饼图_ECharts中饼图的操作
  16. java实现十进制数转换成二进制数
  17. 关于红外调制基础理解
  18. 北京ui设计工资一般多少?北京ui设计公司排名?
  19. Android6.0boot解锁,Lenovo手机fastboot命令 解锁Bootloade 教程
  20. FusionCharts Demo

热门文章

  1. Window下mysql5.7及以上版本插入中文乱码问题
  2. SVN 创建仓库操作
  3. codevs 1066 引水入城(DFS+DP)
  4. 正则表达式 2. 单字符或
  5. margin百分比,重叠和auto
  6. python基础教程第3章——字符串
  7. UpdatePanel里使用FileUpload
  8. Vista 系统C盘(系统盘)越来越小的问题.与解决.
  9. 奇异值分解SVD应用——LSI
  10. Android图片适应屏幕大小