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

  • 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()来覆盖原数组
package _20191209;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; /**
* 手写ArrayList v1.0
* 初始化、add、toString、get、remove方法
* @author TEDU
*
*/
public class MyArrayList<E> {
//成员变量
private Object[] datas;//底层数组
private static final int DEFAULT_CAPACITY = 10;//初始容量
private static int used = 0;//当前数组中已被填充的个数
private static int size = DEFAULT_CAPACITY;//数组实际大小
//初始化
public MyArrayList() {
datas = new Object[DEFAULT_CAPACITY];
}
public MyArrayList(int size) {//自定义容器大小
this.size = size;
datas = new Object[size];
}
//、add
public void add(E e) {
if(used < size) {
datas[used++] = e;
}else {
size += (size>>1);
datas = Arrays.copyOf(datas,size);
}
}
//、toString
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("[");
// for(Object o : datas) {
// sb.append(o+",");
// }
for (int i = 0; i < used; i++) {
if(i!=used-1) {
sb.append(datas[i]+",");
}else {
sb.append(datas[i]);
}
}
sb.append("]");
return sb.toString();
} //、get
public E get(int index) {
return (E) datas[index];
} //set
public boolean set(int index,E element) {
if(index >= used) {
return false;
}
datas[index] = element;
return true;
} //、remove方法,移除后used要减一
public boolean remove(int index) {
if(index >= used) {
return false;
}
//使用arrycopy很方便
System.arraycopy(datas, index+1, datas, index, (used--)-index);
return true;
}
public boolean remove(E element) {
for (int i = 0; i < used; i++) {
if(((E)datas[i]).equals(element)) {
remove(i);
return true;
}
}
return false;
} //indexOf 返回第一个匹配的元素所在下标,如元素不存在返回-1
public int indexOf(E element) {
for (int i = 0; i < used; i++) {
if(((E)datas[i]).equals(element)) {
return i;
}
}
return -1; } //lastIndexOf
public int lastIndexOf(E element) {
for (int i = used-1; i >= 0; i--) {
if(((E)datas[i]).equals(element)) {
return i;
}
}
return -1;
} //size返回集合大小
public int size() {
return used;
} //clear 清空集合
public void clear() {
datas = new Object[DEFAULT_CAPACITY];
used = 0;
} //测试
public static void main(String[] args) {
MyArrayList<Integer> ml = new MyArrayList<>();
// Scanner scan = new Scanner(System.in);
// String str = "";
// while(!str.contentEquals("-1")) {//输出-1推出循环
// System.out.println("请添加:");
// str = scan.nextLine();
// if(str.contentEquals("-1")) return;
// ml.add(str);
// System.out.println(ml);;
// }
//手写版ArrayList
System.out.println("----------手写版ArrayList---------------");
ml.add(123);
ml.add(12);
System.out.println(ml);
System.out.println(ml.size());
ml.set(1, 33);
System.out.println(ml);
ml.remove(1);
System.out.println(ml);
ml.add(66);
ml.add(13);
System.out.println(ml);
ml.remove((Integer)66);//直接输入66会被认为是下标66的元素
System.out.println(ml);
System.out.println(ml.indexOf((Integer)123));
ml.add(123);
System.out.println(ml.lastIndexOf((Integer)123));
ml.clear();
System.out.println(ml);
System.out.println(ml.size()); //正版ArrayList测试
System.out.println("---------------以下为正版ArrayList-----------------");
List<Integer> arrayList = new ArrayList<>();
arrayList.add(123);
arrayList.add(12);
System.out.println(arrayList);
System.out.println(arrayList.size());
arrayList.set(1, 33);
System.out.println(arrayList);
arrayList.remove(1);
System.out.println(arrayList);
arrayList.add(66);
arrayList.add(13);
System.out.println(arrayList);
arrayList.remove((Integer)66);//直接输入66会被认为是下标66的元素
System.out.println(arrayList);
System.out.println(arrayList.indexOf((Integer)123));
arrayList.add(123);
System.out.println(arrayList.lastIndexOf((Integer)123));
arrayList.clear();
System.out.println(arrayList);
System.out.println(arrayList.size()); }
}

  

  

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. Greenplum常用的gp_toolkit & pg_catalog监控语句

    gp_toolkit 说明 Greenplum数据库提供了一个名为gp_tooikit的管理schema,该schema下有关于查询系统目录,日志文件, 用户创建(databases,schema,t ...

  2. dbt 0.13.0 新添加特性sources 试用

    dbt 0.13 添加了一个新的功能sources 我呢可以用来做以下事情 从基础模型的源表中进行数据选择 测试对于源数据的假设 计算源数据的freshness source 操作 定义source ...

  3. Lightning Web Components 来自salesforce 的web 组件化解决方案

    Lightning Web Components 是一个轻量,快速,企业级别的web 组件化解决方案,官方网站也提供了很全的文档 对于我们学习使用还是很方便的,同时我们也可以方便的学习了解salesf ...

  4. (转载)ranger原理

    文章目录 一.业务背景 现状&&需求 二.大数据安全组件介绍与对比 1.Kerberos 2.Apache Sentry 3.Apache Ranger 4.为什么我们选择Ranger ...

  5. Node Addon

    Node Addon as bridge between javascript and C++ #include <node.h> namespace HelloWorldDemo { u ...

  6. Mac php 装imagick扩展 菜鸟教程

    1.2.直接brew install imagemagick@6完成安装 2.去http://pecl.php.net/package/imagick下载安装包 2.1.下载完后解压tar -xzvf ...

  7. gdal 根据条件选择数据

  8. python去除BOM头\ufeff等特殊字符

    1.\ufeff 字节顺序标记 去掉\ufeff,只需改一下编码就行,把UTF-8编码改成UTF-8-sigwith open(file_path, mode='r', encoding='UTF-8 ...

  9. C#发起Http请求,调用接口

    //方法1. Post 异步请求,普通的异步请求,传输普通的字符串等,对于有html代码的字段值的传输支持不好,如果需要传输html,二进制等数据的传输,请使用下面第二个方法,即使用UploadDat ...

  10. Ubuntu下root账户无法使用xshell远程连接解决方法

    以前使用xshell连接服务器跑程序都很顺利,但这次整了一个root账户,发现居然连不上.百度一下,发现ubuntu系统本身是拒绝root账户远程连接的. 解决办法:参考点击传送门