方法都比较简单,这里列出来即可:

  • add(index,ele) //忘制定下标插入元素
  • add(ele)
  • addAll(Collection <C> c) 泛型必须与调用add的泛型保持一致
  • set(index,ele)
  • remove(index)
  • remove(Object)
  • removeAll(Collection<C> c) 移除交集元素
  • get(index) 返回制定下标的元素
  • indexOf(Object o) 返回指定元素第一次出现所在的下标(正序)
  • lastIndexOf(Object o ) 返回指定元素第一次出现所在的下标(倒叙)
  • contains(Object) 是否包含某个元素
  • containsAll(Collection<C> c)是否包含某个集合
  • retainAll(Collection<C> c)保留两个集合的交集
  • toArray() 返回一个Object[]数组
  • clear() 清空集合

手写ArrayList

重点强调

  • ArrayList的底层是数组
  • 使用泛型
  • 删除元素的方法使用System.arraycopy()来覆盖原数组
  1. package _20191209;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.List;
  6.  
  7. /**
  8. * 手写ArrayList v1.0
  9. * 初始化、add、toString、get、remove方法
  10. * @author TEDU
  11. *
  12. */
  13. public class MyArrayList<E> {
  14. //成员变量
  15. private Object[] datas;//底层数组
  16. private static final int DEFAULT_CAPACITY = 10;//初始容量
  17. private static int used = 0;//当前数组中已被填充的个数
  18. private static int size = DEFAULT_CAPACITY;//数组实际大小
  19. //初始化
  20. public MyArrayList() {
  21. datas = new Object[DEFAULT_CAPACITY];
  22. }
  23. public MyArrayList(int size) {//自定义容器大小
  24. this.size = size;
  25. datas = new Object[size];
  26. }
  27. //、add
  28. public void add(E e) {
  29. if(used < size) {
  30. datas[used++] = e;
  31. }else {
  32. size += (size>>1);
  33. datas = Arrays.copyOf(datas,size);
  34. }
  35. }
  36. //、toString
  37. @Override
  38. public String toString() {
  39. StringBuffer sb = new StringBuffer();
  40. sb.append("[");
  41. // for(Object o : datas) {
  42. // sb.append(o+",");
  43. // }
  44. for (int i = 0; i < used; i++) {
  45. if(i!=used-1) {
  46. sb.append(datas[i]+",");
  47. }else {
  48. sb.append(datas[i]);
  49. }
  50. }
  51. sb.append("]");
  52. return sb.toString();
  53. }
  54.  
  55. //、get
  56. public E get(int index) {
  57. return (E) datas[index];
  58. }
  59.  
  60. //set
  61. public boolean set(int index,E element) {
  62. if(index >= used) {
  63. return false;
  64. }
  65. datas[index] = element;
  66. return true;
  67. }
  68.  
  69. //、remove方法,移除后used要减一
  70. public boolean remove(int index) {
  71. if(index >= used) {
  72. return false;
  73. }
  74. //使用arrycopy很方便
  75. System.arraycopy(datas, index+1, datas, index, (used--)-index);
  76. return true;
  77. }
  78. public boolean remove(E element) {
  79. for (int i = 0; i < used; i++) {
  80. if(((E)datas[i]).equals(element)) {
  81. remove(i);
  82. return true;
  83. }
  84. }
  85. return false;
  86. }
  87.  
  88. //indexOf 返回第一个匹配的元素所在下标,如元素不存在返回-1
  89. public int indexOf(E element) {
  90. for (int i = 0; i < used; i++) {
  91. if(((E)datas[i]).equals(element)) {
  92. return i;
  93. }
  94. }
  95. return -1;
  96.  
  97. }
  98.  
  99. //lastIndexOf
  100. public int lastIndexOf(E element) {
  101. for (int i = used-1; i >= 0; i--) {
  102. if(((E)datas[i]).equals(element)) {
  103. return i;
  104. }
  105. }
  106. return -1;
  107. }
  108.  
  109. //size返回集合大小
  110. public int size() {
  111. return used;
  112. }
  113.  
  114. //clear 清空集合
  115. public void clear() {
  116. datas = new Object[DEFAULT_CAPACITY];
  117. used = 0;
  118. }
  119.  
  120. //测试
  121. public static void main(String[] args) {
  122. MyArrayList<Integer> ml = new MyArrayList<>();
  123. // Scanner scan = new Scanner(System.in);
  124. // String str = "";
  125. // while(!str.contentEquals("-1")) {//输出-1推出循环
  126. // System.out.println("请添加:");
  127. // str = scan.nextLine();
  128. // if(str.contentEquals("-1")) return;
  129. // ml.add(str);
  130. // System.out.println(ml);;
  131. // }
  132. //手写版ArrayList
  133. System.out.println("----------手写版ArrayList---------------");
  134. ml.add(123);
  135. ml.add(12);
  136. System.out.println(ml);
  137. System.out.println(ml.size());
  138. ml.set(1, 33);
  139. System.out.println(ml);
  140. ml.remove(1);
  141. System.out.println(ml);
  142. ml.add(66);
  143. ml.add(13);
  144. System.out.println(ml);
  145. ml.remove((Integer)66);//直接输入66会被认为是下标66的元素
  146. System.out.println(ml);
  147. System.out.println(ml.indexOf((Integer)123));
  148. ml.add(123);
  149. System.out.println(ml.lastIndexOf((Integer)123));
  150. ml.clear();
  151. System.out.println(ml);
  152. System.out.println(ml.size());
  153.  
  154. //正版ArrayList测试
  155. System.out.println("---------------以下为正版ArrayList-----------------");
  156. List<Integer> arrayList = new ArrayList<>();
  157. arrayList.add(123);
  158. arrayList.add(12);
  159. System.out.println(arrayList);
  160. System.out.println(arrayList.size());
  161. arrayList.set(1, 33);
  162. System.out.println(arrayList);
  163. arrayList.remove(1);
  164. System.out.println(arrayList);
  165. arrayList.add(66);
  166. arrayList.add(13);
  167. System.out.println(arrayList);
  168. arrayList.remove((Integer)66);//直接输入66会被认为是下标66的元素
  169. System.out.println(arrayList);
  170. System.out.println(arrayList.indexOf((Integer)123));
  171. arrayList.add(123);
  172. System.out.println(arrayList.lastIndexOf((Integer)123));
  173. arrayList.clear();
  174. System.out.println(arrayList);
  175. System.out.println(arrayList.size());
  176.  
  177. }
  178. }

  

  

44 容器(三)——ArrayList索引相关方法的更多相关文章

  1. Lucene.Net 2.3.1开发介绍 —— 三、索引(五)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(五) 话接上篇,继续来说权重对排序的影响.从上面的4个测试,只能说是有个直观的理解了.“哦,是!调整权重是能影响排序了,但是好像没办法来 ...

  2. Lucene.Net 2.3.1开发介绍 —— 三、索引(四)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(四) 4.索引对搜索排序的影响 搜索的时候,同一个搜索关键字和同一份索引,决定了一个结果,不但决定了结果的集合,也确定了结果的顺序.那个 ...

  3. SQL优化(三)—— 索引、explain分析

    SQL优化(三)—— 索引.explain分析   一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...

  4. Mongodb学习笔记三(Mongodb索引操作及性能测试)

    第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载.官网下载地址:http://www.robomo ...

  5. Lucene.Net 2.3.1开发介绍 —— 三、索引(七)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(七) 5.IndexWriter 索引这部分最后讲的是IndexWriter.如果说前面提到的都是数据的结构,那么IndexWriter ...

  6. Lucene.Net 2.3.1开发介绍 —— 三、索引(六)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(六) 2.2 Field的Boost 如果说Document的Boost是一条线,那么Field的Boost则是一个点.怎么理解这个点呢 ...

  7. Lucene.Net 2.3.1开发介绍 —— 三、索引(三)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(三) 3.Field配置所产生的效果 索引数据,简单的代码,只要两个方法就搞定了,而在索引过程中用到的一些类里最简单,作用也不小的就是F ...

  8. Lucene.Net 2.3.1开发介绍 —— 三、索引(二)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(二) 2.索引中用到的核心类 在Lucene.Net索引开发中,用到的类不多,这些类是索引过程的核心类.其中Analyzer是索引建立的 ...

  9. Lucene.Net 2.3.1开发介绍 —— 三、索引(一)

    原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(一) 在说索引之前,先说说索引是什么?为什么要索引?怎么索引? 先想想看,假如现在有一个文本,我们会怎么去搜索.比如,有一个string ...

随机推荐

  1. ztree异步加载---------补发周日内容

    上周六老师要求和大三的进行JAVA知识交流,总体来说就是给大三学长做的东西打分,然后大三学长再教我们如果构建ztree.毕竟第一次接触ztree,所以有很多不了解,但通过周六日努力,还是做出来了.现在 ...

  2. 洛谷 UVA12101 Prime Path 题解

    一道经典的BFS 用四个for搜索四位就行了,只要能推出怎么只变4位中的一位就很水了 #include<iostream> #include<cstring> #include ...

  3. WinDbg常用命令系列---输入内存值的命令e*

    e, ea, eb, ed, eD, ef, ep, eq, eu, ew, eza (Enter Values) e*命令将您指定的值输入内存.不要将此命令与~e(Thread-Specific C ...

  4. cyyz: Day 4 网络流整理

    Day 4 网络流的理论性知识(算了..我自己都看不下去,还是整理些例题以后复习用吧qaq): 一.PPT(主要内容)   二.搜自度娘 定义: 年,L.R. 福特和 D.R. 富尔克森等人给出了解决 ...

  5. GUI引发的一场脑部大战|wine、wsl、mono、gtk、qt

    没写完不想写了,先发布吧,这就是一个引子. 在春天种下一颗种子---- GUI引发的一场脑部大战|wine.wsl.mono.gtk.qt 思路开拓了,方法一下子就来了 wine可以运行大部分Wind ...

  6. Alibaba Nacos:搭建Nacos平台

    1.下载安装包 https://github.com/alibaba/nacos/releases 往下翻,找到压缩包下载. 2.解压 tar -xvf nacos-server-$version.t ...

  7. C++2.0新特性(六)——<Smart Pointer(智能指针)之shared_ptr>

    Smart Pointer(智能指针)指的是一类指针,并不是单一某一个指针,它能知道自己被引用的个数以至于在最后一个引用消失时销毁它指向的对象,本文主要介绍C++2.0提供的新东西 一.Smart P ...

  8. durpal安装时The translation server is offline解决

    从https://localize.drupal.org/download下载语言文件上传到 目录/var/www/html/sites/default/files/translations 或者wg ...

  9. 非静态内部类中 static/final 成员变量相关知识

    原文链接:https://blog.csdn.net/qq_20328181/article/details/81391956

  10. 第09组 Beta冲刺(1/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...